mgetty で FAX を受信しようと思ったんですが、なかなか面倒くさくて。。。
その顛末をまとめてみます。結構はまったんで、参考になると思います。
使用した FreeBSD は 4.2-R です(2001/10/26現在の情報です)。

mgetty とは getty の代わりをする物なのですが、getty が着信後に作業を行うのと 違って、着信からその後の処理まで受け持ちます。
つまり、かかってきた電話が「データ通信」なのか「FAX通信」なのかを判断して適 宜作業を変えてくれます。だから、ATS0=0を実行しておかないと駄目です。(これは mgetty がやってくれます)
ただ、普通の電話とFAX通信を振り分けるなんて事は出来ない(かかってきてからし か通信内容が分からないから当然ですね)ので、その電話(番号)はパソコンからの 着信&Fax着信専用の回線ということになります。この辺はお間違えのないように。

今回はサーバが NOTE なので、PCMCIA の Fax/Data MODEM を使いたかったのですが、 私の持っている REX-R256 という RATOC のやつで出来ませんでした。
理由は

Fax の通信方式として Class2 をサポートしていない

からです。
これにはすっかりへこみました。

というわけで、Class2 をサポートするとされる Fax/Modem カードを探して P の TO-CAF56K というものに行き当たりました。これは Class2 草案に準拠しているとのことで 、オークションでゲット!使ってみたら、なんと!これ、Class1にしか準拠してない んです。サポートに確認したら HP の記載が間違っているようで、さらに完全にへこみました。

どうもTO-CAF56KVと 同じ物を使っているらしく、「そりゃぁ〜ないよ〜」って感じです。

P は好きだったのに、ちょっと、ですねぇ〜

指摘した次の日(10/26)にはHPもすっかり修正されて、跡形も無くなっていました。
卑怯者〜(T_T)。たとえオークションでも高かったのに、どうしてくれるんだ〜。
「上の者と相談して対処を考えさせていただきます」との返事をもらいましが、 返事が来ません(10/26現在)。金返せ〜(T_T)

仕方ないので、わずかな希望を元に昔どっかから「へちって」来た28kのモデムを繋いで AT+FCLASS=2を実行してみると、「OK」のリザルトが。うれぴ〜(T_T)。というわけで、 ここではとりあえず、AIWA PV-BW2881というモデムで動作確認してます。

まず、用意する物

・mgetty-1.0.0(source)
 - mgetty の最新版を package から install すると ATA で着信できてないようで、
  仕方無しに 1.0.0 を使っています。他の理由もあります。それはまた後ほど。
・ja-vfghostscript-5.50a_1
 - package から install しました。
・ja-vflib-2.25.2
 - 上記を install すると依存関係から install されます。
・XFree86-libraries-4.0.3_1
 - これを install しないと gs が動きません^^;はまりました。
  XFree86 を install している人ならなんの問題もないでしょう。私はサーバーと
  してしか使ってないので X なんて入れるはず無いんです。DISK の無駄無駄(笑)。

さて、何も考えずに全てを install します。mgetty だけは source なので make しなければなりません。
が、ただ make すると駄目なんで、policy.h を変更します。まぁ、変更点は少ないです。
私の policy.h を載せます(必要なところだけ)。
faxhost# grep '^#' policy.h
#ident "@(#)policy.h    3.5 96/03/19 Copyright (c) Gert Doering"
#define MGETTY_CONFIG "mgetty.config"
#define SENDFAX_CONFIG "sendfax.config"
#define LOGIN_CFG_FILE "login.config"
#define DEFAULT_LOGIN_PROGRAM "/usr/bin/login"
#define CALLBACK_CONFIG "callback.config"
#define GETTYDEFS "/etc/gettydefs"
#define GETTYDEFS_DEFAULT_TAG "n"
#define DEVICE_OWNER    "uucp"
#define DEVICE_GROUP    "modem"
#define FILE_MODE 0660
#define CONSOLE "/dev/console"
#define LOG_PATH "/var/log/log_mg.%s"
#define LOG_LEVEL L_MESG
#define ADMIN   "root"
#define SYSLOG_FC LOG_AUTH
#define LOGIN_PROMPT    "@ login: "
#define MAX_LOGIN_TIME  240
#define NOLOGIN_FILE "/etc/nologin.%s"
#define MGETTY_PID_FILE "/etc/mg-pid.%s"
#if defined (SVR4) || defined(sunos4)
# define LOCK_PATH "/var/spool/locks"
# define LOCK      "/var/spool/locks/LCK..%s"
#else
# ifdef sgi
#  define LOCK  "/usr/spool/locks/LCK..%s"
# endif
# ifdef _AIX
#  define LOCK  "/etc/locks/LCK..%s"
# endif
# ifdef NeXT
#  define LOCK "/usr/spool/uucp/LCK/LCK..%s"
# endif
#endif
#ifndef LOCK
#define LOCK "/var/spool/lock/LCK..%s"
#endif
#define LOCKS_BINARY 0
#define DEFAULT_PORTSPEED       19200
#define MODEM_INIT_STRING       "ATS0=0Q0&D3&C1"
#define MODEM_CMD_SUFFIX "\r"
#define MODEM_CHECK_TIME 3600
#define DEFAULT_MODEMTYPE "auto"
#define DO_CHAT_SEND_DELAY 50
#define FAX_COMMAND_DELAY 50
#define FAX_IN_OWNER    "uucp"
#define FAX_FILE_MODE 0660
#define DATA_FLOW       FLOW_HARD
#define FAXREC_FLOW     FLOW_HARD | FLOW_SOFT
#define FAXSEND_FLOW    FLOW_HARD | FLOW_SOFT
#define FAX_RECV_SWITCHBD 19200
#define FAX_LOG         "/var/log/sendfax.log"
#define FAX_STATION_ID  "0794 12 3456"
#define FAX_SEND_BAUD 38400
#define FAX_DIAL_PREFIX "ATD"
#define FAX_SEND_MAX_TRIES 3
#define FAX_MODEM_TTYS  "cuaa3"
#ifdef SVR4
# define MAILER         "/usr/bin/mailx -s 'Incoming facsimile message'"
#else
# ifdef _AIX
#  define MAILER        "/usr/sbin/sendmail"
#  define NEED_MAIL_HEADERS
# endif
# ifdef M_UNIX          /* SCO */
#  define MAILER        "/usr/lib/mail/execmail"
#  define NEED_MAIL_HEADERS
# endif
#endif
#ifndef MAILER
# define MAILER         "/usr/sbin/sendmail"
# define NEED_MAIL_HEADERS
#endif
#define MAIL_TO         "faxadmin"
#define FAX_NOTIFY_PROGRAM "/usr/local/lib/mgetty+sendfax/new_fax"
#define MINFREESPACE 1024
実は、実際変更したのは
・DEFAULT_PORTSPEED
・FAX_STATION_ID
・FAX_NOTIFY_PROGRAM
・MAIL_TO
です。
それ以外はそのままで構わないと思います。

後は Makefile を編集します。変更するのは上の方だけなので、その辺だけ掲載します。
CC=gcc
CFLAGS=-O2 -Wall -pipe
LDFLAGS=-lutil
INSTALL=install -c -o root -g wheel             # NeXT/BSD
prefix=/usr/local
spool=/var/spool
SBINDIR=$(prefix)/sbin
BINDIR=$(prefix)/bin
LIBDIR=$(prefix)/lib/mgetty+sendfax
CONFDIR=$(prefix)/etc/mgetty+sendfax
FAX_SPOOL=$(spool)/fax
FAX_SPOOL_IN=$(FAX_SPOOL)/incoming
FAX_SPOOL_OUT=$(FAX_SPOOL)/outgoing
この状態で make && make install します。
すると mgetty が install されます。
mgetty が install 出来たら /etc/ttys にエントリを追加します。
cuaa0   "/usr/local/sbin/mgetty -x 9 -n 1"      vt100   on secure
ここで間違ってはいけないことは、普通 /etc/ttys には ttyd0 とかのエントリを追加しますよね?
これは cuaa であると言うことです。今回は PCMCIA のカードが入手で きなかったので外付け Fax なので cuaa0 になっています。
さらに、デバッグしたかったので、私のエントリはデバッグレベル9になってます。
適宜変更してください。

ここで
kill -HUP 1
とすれば準備完了です。
FAX が届くと /var/spool/fax/incoming/ 以下に G3 形式のファイルが出来ているはずです。

うまく受信できていない場合は /var/log/log_mg.cuaa? のファイルを tail -f して確認してください。
大抵は ATA で止まるような気がします。^^;
この時の解決方法は。。。。私にはわかりません。ごめんなさい。m(_ _)m

正しく受信すると実は受信した情報がメールとなって送信されてきます。
宛先は faxadmin です。でも、このエントリは普通無いと思いますので /etc/aliases あたりにエントリを増やして newaliases を実行してください。
これで Fax が届くとメールが届くまでになりました。

次に、これをプリンターから出力する方法ですが、G3 形式を bpm 形式にして、 ps にして gs に食わせて、プリンタドライバ宛のデータにしてプリンタに食わせれば終わりです。

では、どうすればそれが出来るのでしょうか?

実は policy.h にあったエントリでそれを指定していました。
/usr/local/lib/mgetty+sendfax/new_fax がそれです。
このファイルは shell になっていて(っていうか、して)、Faxが届くと実行される仕掛けになっています。
ですから、ここにプリントアウトの shell を書いておけばオッケーと言うことになります。

ここには以下のような shell を書きます。
うちのプリンターは lips3 なので、このようになってます。
#!/bin/sh
shift 3

for i in $@
do
  cat $i | /usr/local/bin/g32pbm | /usr/local/bin/pnmtops -noturn |\
  /usr/local/bin/gs -q -sPAPERSIZE=a4 -dNOPAUSE -sDEVICE=lips3\
  -sOutputFile=- - quit.ps | lpr -P lp

  rm $i
done
exit 0
これで印刷できます。
難しくないですね。chmod +x new_fax は忘れないでくださいね。

ところが。。。。これだと「標準」で送られてきた FAX が縦に潰れてしまいます。 ファインモードとかはうまく出るんですけどね。
これでは困るので、g32pbm の -s オプションで縦に広げます。しかし困ったこと に送られてきた FAX が「標準」かどうかはメールでしか分かりません。new_fax の 引数になってくれてれば良かったのに。。。
ということで、mgetty のソースにパッチを当ててそれを実現しちゃいましょう。

修正の必要なファイルは faxrec.c だけです。
ソースの中の fax_par_d.vr という帯域変数が「標準か否か」を表しています。
これを new_fax の引数にしちゃいましょう。
    /* build command line
     * note: stdout / stderr redirected to console, we don't
     *       want the program talking to the modem
     */
    sprintf( line, "%s %d '%s' %d %s >%s 2>&1 </dev/null",
                                         FAX_NOTIFY_PROGRAM,
                                         fax_hangup_code,
                                         fax_remote_id,
                                         pagenum,
                                         fax_file_names,
                                         CONSOLE);

こんな所がありますので、これを
    /* build command line
     * note: stdout / stderr redirected to console, we don't
     *       want the program talking to the modem
     */
    sprintf( line, "%s %d '%s' %d %d %s >%s 2>&1 </dev/null",
                                         FAX_NOTIFY_PROGRAM,
                                         fax_hangup_code,
                                         fax_remote_id,
                                         fax_par_d.vr,
                                         pagenum,
                                         fax_file_names,
                                         CONSOLE);

としてください。
これだと new_fax 自体も変更しないと駄目なので、以下のように変更します。
#!/bin/sh
shift 2
mode=$1
shift 2

for i in $@
do
  if [ $mode -eq 0 ]; then
    cat $i | /usr/local/bin/g32pbm -s > /tmp/fax$$.lips3
  else
    cat $i | /usr/local/bin/g32pbm > /tmp/fax$$.lips3
  fi

  cat /tmp/fax$$.lips3 | /usr/local/bin/pnmtops -noturn |\
  /usr/local/bin/gs -q -sPAPERSIZE=a4 -dNOPAUSE -sDEVICE=lips3\
  -sOutputFile=- - quit.ps | lpr -P lp

  rm $i /tmp/fax$$.lips3
done
exit 0

ちなみに printcap は以下のようになります。
lp|local line printer:\
        :sh:sf:\
        :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:\
        :mx#0:

これで FAX の受信が可能になります。
え?FAX の送信?それは FAX に任せましょう。(笑)

実は mgetty+sendfax なので FAX も送信できます。G3 形式のファイルを用意 すればいいのですが、私は FAX を持っているので、送信はそっちに任せてます。
だって、スキャナでスキャンして G3 に変換して sendfax をつつくのは面倒くさいんですもの(笑)