![]() |
Hear are my notes in building and installing HylaFax 4.1.3 on a Mac OS X system. I build on Mac OS 10.1.5 and tested on 10.1.5,10.1.3 and 10.2.1 (Jaguar) using the internal modem of the Mac and sent a received 1000+ faxes with only two failure that I attribute to phone line failures. It is now installed at one of our site and in production. My thanks to the HylaFAX team for producing a good product. I discovered what I think may be a bug in "faxd/FaxSend.c++", it does not choose the correct default resolution unit (as per TIFF spec) if none is specified in the tiff file when sending. I made the following change in the method FaxServer::sendSetupParams1(): short resunit = RESUNIT_NONE; to short resunit = RESUNIT_INCH; Also I received warning from compiler in util/StackBuffer.h when compiling FaxDB.c++ and TagLine.c++: FaxDB.c++: In method `bool FaxDB::getToken(FILE *, fxStr &)': FaxDB.c++:205: warning: choosing `fxStackBuffer::operator char *()' over `fxStackBu ffer::operator const char *() const' FaxDB.c++:205: warning: for conversion from `fxStackBuffer' to `const char *' FaxDB.c++:205: warning: because conversion sequence for the argument is better TagLine.c++: In method `u_char * FaxModem::imageTagLine(u_char *, unsigned int, const Class2Params &)': TagLine.c++:302: warning: choosing `fxStackBuffer::operator unsigned char *()' over `fxStackBuffer::operator const unsigned char *() const' TagLine.c++:302: warning: for conversion from `fxStackBuffer' to `const unsigned char *' TagLine.c++:302: warning: because conversion sequence for the argument is better until I added the following to the file util/StackBuffer.h: In class fxStackBuffer definition added: operator const char*(); // Return base of buffer operator const unsigned char*();// Return base of buffer after definition added: inline fxStackBuffer::operator const char*() { return base; } inline fxStackBuffer::operator const unsigned char*() { return (unsigned char*)base; } Notes for building on the Mac: 1.) First make sure you have installed the April 2002 or newer version of the Apple Developer Tools, these contain version 2.95.2 of the GNU compiler. The previous version generated errors because it did not tolerate the Obj *p = new(x) Obj; construct. To test the version, type gcc -v, you should get: Apple Computer, Inc. version gcc-937.2, based on gcc version 2.95.2 19991024 (release) 2.) To make building on the Mac easier I would suggest to the HylaFAX authors to change their source file names so they will be unique on file systems that do not treat file names with different cases as unique - i.e. regex.h conflicts with RegEx.h. I realize that you can use a UFS disk on the Mac to solve this problem, but this is a burden to Mac users as standard Mac disks are all HFS which ignores case in filenames. The file name conflicts I found were: faxd/faxRequest.c++ and faxd/FaxRequest.c++ (I renamed faxRequest.c++ to FaxRequestDefs.c++) faxd/faxRequest.h and faxd/FaxRequest.h (I renamed faxRequest.h to FaxRequestDefs.h) util/textfmt.c++ and util/TextFmt.c++ (I renamed textfmt.c++ to textfmtapp.c++) util/RegEx.h and regex/regex.h (I renamed RegEx.h to RegExObj.h) util/Syslog.h /usr/include/sys/syslog.h (I renamed Syslog.h to SyslogF.h) Also there is an enum in ClassModem.h: class ClassModem { public: enum { // ClassModem::CallStatus OK = 0, // phone answered & carrier received BUSY = 1, // destination phone busy NOCARRIER = 2, // no carrier from remote NOANSWER = 3, // no answer from remote NODIALTONE = 4, // no local dialtone (phone not plugged in?) ERROR = 5, // error in dial command FAILURE = 6, // other problem (e.g. modem turned off) NOFCON = 7, // carrier established, but phase a failure DATACONN = 8, // data carrier established RING = 9 // glare - ring detected after dial }; Which fails to compile because of a #define in /usr/include/arpa/ftp.h - #define ERROR 5 /* permanent negative completion */ The name "ERROR" seemed likely to be used elsewhere so I changed it to a more specific name that was less likely to conflict with system includes - "MODEM_ERROR". This change was needed in the files: faxd/ClassModem.h faxd/Class0.c++ faxd/Class1Send.c++ faxd/Class2Send.c++ faxd/ClassModem.c++ faxd/ServerConfig.c++ faxd/FaxSend.c++ faxd/pageSendApp.c++ I used the following shell script to fix the file naming and change the enum member "ERROR" to MODEMERROR where necessary. I ran this script after uncompressing the downloaded tar archive and running the configure script (this script can be run twice without damaging the files): #!/bin/sh # Rename file if not already renamed # usage: fixname oldname newname fixname() { if [ -f $1 ]; then mv $1 $2 fi } # Replace string within file # usage: strrpl "s/old/new/" file1 file2 file3 ... strrpl() { repstr=$1 shift for filen in "$@"; do sed -e "$repstr" <$filen >/tmp/macfix$$ cp /tmp/macfix$$ $filen done } umask 022 fixname faxd/faxRequest.c++.1 faxd/FaxRequestDefs.c++ fixname faxd/faxRequest.h.1 faxd/FaxRequestDefs.h strrpl "s/faxRequest\.h/FaxRequestDefs.h/" faxd/FaxRequest.h strrpl "s/faxRequest\./FaxRequestDefs./" faxd/Makefile hfaxd/Makefile distrules fixname util/textfmt.c++.1 util/textfmtapp.c++ strrpl "s/textfmt\./textfmtapp./" util/Makefile distrules fixname util/RegEx.h util/RegExObj.h strrpl "s/RegEx\.h/RegExObj.h/" faxd/DestControl.h hfaxd/SNPPServer.c++ hfaxd/User.c++ util/FaxDB.c++ \ util/RegEx.c++ util/RegExArray.h util/RegExDict.h distrules fixname util/Syslog.h util/SyslogF.h strrpl "s/Syslog\.h/SyslogF.h/" faxd/faxApp.h util/Syslog.c++ hfaxd/HylaFAXServer.h distrules strrpl "s/\([ ]\)ERROR/\1MODEM_ERROR/" faxd/ClassModem.h strrpl "s/(ERROR)/(MODEM_ERROR)/" faxd/Class0.c++ faxd/Class1Send.c++ faxd/Class2Send.c++ strrpl "s/ClassModem::ERROR/ClassModem::MODEM_ERROR/" faxd/ClassModem.c++ faxd/ServerConfig.c++ faxd/FaxSend.c++ faxd/pageSendApp.c++ faxd/ServerConfig.c++ strrpl "s#// ERROR#// MODEM_ERROR#" faxd/ClassModem.c++ # End of script 3.) I used the device "/dev/cu.modem" (the Mac internal mode) using the basic class 2 configuration with the additional changes in the config.cu.modem file as follows: ModemFlowControl: rtscts # was XON/XOFF flow control ModemSetupDTRCmd: AT&D3 # setup so DTR drop resets modem Class2RecvDataTrigger: "\022" # character sent to modem to start recv Class2XmitWaitForXON: no # if true, wait for XON before send The Class2XmitWaitForXON when set to yes caused the modem to hang when sending, the ModemFlowControl was xonxoff and this caused errors in sending and receiving faxes. I am not sure if the other two changes made any difference, I just made them based on the differences between the RockWell-K56 and the class 2 modem. When I tested the modem using 'cu' I got the following responses (cu is not shipped on Mac so I had write my own): AT+FMFR? CONEXANT AT+FMDL? AC/K56 AT+FCLASS=? 0,1,2,1.0 Not all Mac internal modems are the same. These changes worked for two single processor G4 Macs and an iMac, but the internal modem on a dual processor G4 (the silver doors model) I tested did not support class 2 so I configured it as a class 1 modem. The configuration generated by faxaddmodem stated the modem was "Rockwell RC288DPi-based Class 1 modem ", but did not work until I appended all the "Class1Cmd:" settings from the 'class1' configuration file. The responses of the modem using cu were: AT+FMFR? ERROR AT+FMDL? ERROR AT+FCLASS=? 0,1,1.0 !Rockwell !Rockwell !RC288DPi !RC288DPi ATI3 2.0.4 4.) I created a script for creating the necessary users and the /Library/StartupItems/{HylaFAX,StartupParameters.plist} files needed to start the fax deamon at startup. An improved "HylaFAX" startup script that meets the apple spec of responding to an argument of 'start','stop', or 'restart' is: #!/bin/sh . /etc/rc.common if [ "$1" = "stop" -o "$1" = "restart" ]; then ConsoleMessage "Stopping HylaFAX server processes" /sbin/mount -t devfs ~fax/dev /var/spool/hylafax/dev /usr/local/sbin/hylafax stop ConsoleMessage "HylaFAX server processes stopped" fi if [ "$1" = "start" -o "$1" = "restart" ]; then ConsoleMessage "Starting HylaFAX server processes" /sbin/mount -t devfs ~fax/dev /var/spool/hylafax/dev /usr/local/sbin/hylafax start ConsoleMessage "HylaFAX server processes started" fi Adding the need users using the "NetInfo Manager" utility on the Mac is a slow and painful process, so I created a script to create the needed users, add the 4559,tcp HylaFax service to /etc/services, creates the ~fax/dev directory, the /var/spool/uucp directory, and adds the 'faxqclean' operation to the daily operations run by 'cron' is shown below. On the Mac the default installation has a crontab that runs "/etc/daily" and 3 AM daily, and runs "/etc/daily.local" if it exists, so the script adds the 'faxqclean' operation to "/etc/daily.local" if it is not already there. #!/bin/sh # # # Deduce the effective user id: # euid=`id|sed -e 's/.*uid=[0-9]*(\([^)]*\)).*/\1/'` if [ "$euid" != "root" ]; then echo "Sorry, but you must run this script as the super-user!" exit 1 fi echo "Creating uucp,fax and bin users" niutil -create . /users/uucp niload -v -r /users/uucp . <<EOF { "expire" = ( "0" ); "home" = ( "/var/spool/uucp" ); "name" = ( "uucp" ); "passwd" = ( "*" ); "shell" = ( "/dev/null" ); "change" = ( "0" ); "realname" = ( "UUCP User" ); "uid" = ( "10" ); "gid" = ( "60" ); } EOF niutil -create . /users/bin niload -v -r /users/bin . <<EOF { "expire" = ( "0" ); "realname" = ( "Bin User" ); "name" = ( "bin" ); "passwd" = ( "*" ); "uid" = ( "499" ); "change" = ( "0" ); "shell" = ( "/dev/null" ); "home" = ( "/usr/local/sbin" ); "gid" = ( "60" ); } EOF niutil -create . /users/fax niload -v -r /users/fax . <<EOF { "expire" = ( "0" ); "shell" = ( "/dev/null" ); "name" = ( "fax" ); "passwd" = ( "*" ); "home" = ( "/var/spool/hylafax" ); "change" = ( "0" ); "uid" = ( "10" ); "realname" = ( "Fax User" ); "gid" = ( "60" ); } EOF chpass -a "uucp:*:10:66::0:0:uucp:/var/spool/uucp:" chpass -a "fax:*:10:66::0:0:Facsimile Agent:/var/spool/hylafax:" echo "Adding Hylafax 4559,tcp to services" niutil -create . /services/hylafax niload -v -r /services/hylafax . <<EOF { "name" = ( "hylafax" ); "port" = ( "4559" ); "protocol" = ( "tcp" ); } EOF echo "Adding Hylafax cleanup to cron file /etc/daily.local" ## Add entries to cleanup fax queue to /etc/daily.local which is run daily by cron ## avoid error if file does not exist touch /etc/daily.local ## remove previously added entries awk '/##### Start Added by HylaFax/,/##### End Added by HylaFax/ { next } { print $ 0 }' /etc/daily.local >/tmp/daily.local cat >/tmp/daily.local <<EOF ##### Start Added by HylaFax echo "" echo "Cleaning up HylaFax directories" sh /usr/local/sbin/faxcron /usr/local/sbin/faxqclean ##### End Added by HylaFax EOF mv -f /tmp/daily.local /etc/daily.local chmod 0622 /etc/daily.local echo "Creating HylaFax startup script in /Library/StartupItems" if [ ! -d /var/spool/uucp ]; then mkdir /var/spool/uucp fi chown uucp.uucp /var/spool/uucp chmod 0775 /var/spool/uucp if [ ! -d ~fax/dev ]; then mkdir ~fax/dev fi chown uucp.uucp ~fax/dev chmod 0775 ~fax/dev if [ ! -d /Library/StartupItems ]; then mkdir /Library/StartupItems >&/dev/null fi chown root.admin /Library/StartupItems chmod 0775 /Library/StartupItems if [ ! -d /Library/StartupItems/HylaFAX ]; then mkdir /Library/StartupItems/HylaFAX fi chown root.admin /Library/StartupItems/HylaFAX chmod 775 /Library/StartupItems/HylaFAX cat >/Library/StartupItems/HylaFax/HylaFAX <<EOF #!/bin/sh . /etc/rc.common if [ "\$1" = "stop" -o "\$1" = "restart" ]; then ConsoleMessage "Stopping HylaFAX server processes" /sbin/mount -t devfs ~fax/dev /var/spool/hylafax/dev /usr/local/sbin/hylafax stop ConsoleMessage "HylaFAX server processes stopped" fi if [ "\$1" = "start" -o "\$1" = "restart" ]; then ConsoleMessage "Starting HylaFAX server processes" /sbin/mount -t devfs ~fax/dev /var/spool/hylafax/dev /usr/local/sbin/hylafax start ConsoleMessage "HylaFAX server processes started" fi EOF chown root.admin /Library/StartupItems/HylaFAX/HylaFAX chmod 0775 /Library/StartupItems/HylaFAX/HylaFAX cat >/Library/StartupItems/HylaFAX/StartupParameters.plist <<EOF { Description = "HylaFAX daemon"; Provides = ("HylaFAX Server"); OrderPreference = "Last"; Messages = { start = "Starting HylaFAX Server"; stop = "Stopping HylaFAX Server"; }; } EOF chown root.admin /Library/StartupItems/HylaFAX/StartupParameters.plist chmod 0775 /Library/StartupItems/HylaFAX/StartupParameters.plist # End of script 5.) Since I am only sending faxes from TIFF files of the proper format generated from scanning and receiving TIFF files, I had no need for a postscript RIP, I modified the faxsetup script to tolerate no postscript rip. It would be nice if this script tolerated no PS rip as it is not necessary for all installations. Regards, Chris ____________________ HylaFAX(tm) Users Mailing List _______________________ To subscribe/unsubscribe, click http://lists.hylafax.org/cgi-bin/lsg2.cgi On UNIX: mail -s unsubscribe hylafax-users-request@hylafax.org < /dev/null *To learn about commercial HylaFAX(tm) support, mail sales@hylafax.org.*