HFAXD(8)

πŸ’– NAME πŸ’–

hfaxd β€” the HylaFAX client-server protocol server, bestie. she's the one holding it all down. 🫢


🌸 SYNOPSIS 🌸

/usr/sbin/hfaxd [ -d ] [ -q dir ] [ -o port ] [ -O ] [ -l bindaddress ]
[ -i port ] [ -I ] [ -s port ] [ -S ]

✨ DESCRIPTION ✨

okay so hfaxd is the HylaFAX program that runs the server side of two whole things, no cap:

  • the client-server protocol, and
  • the Simple Network Paging Protocol (SNPP), which is what you use to submit message pager jobs to the IXO/TAP and UCP support. πŸ“Ÿ

more client-server protocols are planned, and hfaxd is literally designed to be the ``carrier'' that carries them all. main character energy, honestly.

now, hfaxd usually gets used one of two ways. either:

  1. as a standalone process started at system boot time, just chilling and listening for client connections on one or more ports β€” and if that's the vibe, you must use the -i, -o, or -s option, fr fr. or
  2. as a subservient process to the inetd(8) program. πŸ™‡

and yes you can combine both forms!! as long as the same service isn't being provided by the standalone hfaxd and through inetd at the same time. that would be messy. don't do that. 😭


πŸ¦‹ HYLAFAX (NEW) CLIENT-SERVER PROTOCOL SUPPORT πŸ¦‹

if hfaxd is started with the -i option, she'll service clients using the HylaFAX client-server protocol. and this protocol is strongly related to the Internet File Transfer Protocol (FTP) β€” like, so much so that FTP client programs with support for ``quoted commands'' can be used to talk to hfaxd with the new protocol. iconic. πŸ’…

(it should also be possible to use FTP-aware World Wide Web browsers such as Mosaic and Netscape Navigator to access HylaFAX servers through the new protocol β€” but the current format for information returned in directory listings confuses them. πŸ’€ so, like, good luck with that one.)

the hfaxd server currently recognizes the following protocol requests. case is not distinguished. and entries marked with a ΒΉ can only be used when the client has established administrative privileges with ADMIN. πŸ‘‘

  • ABOR β€” abort previous command
  • ACCT β€” specify account (ignored)
  • ADMIN β€” specify password for administrative privileges
  • ALLO β€” allocate storage (vacuously)
  • ANSWERΒΉ β€” request that call be answered
  • APPE β€” append to a file
  • CDUP β€” change to parent of current working directory
  • CHMOD β€” change mode of a file
  • CHOWNΒΉ β€” change owner of a file
  • CWD β€” change working directory
  • DELE β€” delete a file
  • DISABLEΒΉ β€” disable outbound use of modem
  • ENABLEΒΉ β€” enable outbound use of modem
  • HELP β€” give help information
  • FILEFMT β€” specify/query format for returning file status
  • FILESORTFMT β€” specify/query format for sorting file status listing
  • FORM β€” specify data transfer format
  • IDLE β€” set idle-timer (in seconds)
  • JDELE β€” delete done or suspended job
  • JINTR β€” interrupt job
  • JKILL β€” kill job
  • JNEW β€” create new job
  • JOB β€” set/query current job
  • JOBFMT β€” specify/query format for returning job status
  • JOBSORTFMT β€” specify/query format for sorting job status listing
  • JPARM β€” specify/query job state parameter
  • JREST β€” reset current job state
  • JSUBM β€” submit job to scheduler
  • JSUSP β€” suspend job from scheduling
  • JWAIT β€” wait for job to complete
  • JGDELE β€” delete group of jobs
  • JGKILL β€” kill group of jobs
  • JGINTR β€” interrupt group of jobs
  • JGNEW β€” place current job in a new job group
  • JGPARM β€” set state parameter in a group of jobs
  • JGREST β€” reset current state for a group of jobs
  • JGRP β€” set/query current job group
  • JGSUBM β€” submit group of jobs to scheduler
  • JGSUSP β€” suspend group of jobs from scheduling
  • JGWAIT β€” wait for group of jobs to complete
  • LIST β€” list files in a directory
  • MDTM β€” show last modification time of file
  • MODE β€” specify data transfer mode
  • MDMFMT β€” specify/query format for returning modem status
  • MDMSORTFMT β€” specify/query format for sorting modem status listing
  • NLST β€” give name list of files in directory
  • NOOP β€” do nothing
  • PASS β€” specify password
  • PASV β€” prepare for server-to-server transfer
  • PORT β€” specify data connection port
  • PWD β€” print the current working directory
  • QUIT β€” terminate session
  • RCVFMT β€” specify/query format for returning received facsimile status
  • RCVSORTFMT β€” specify/query format for sorting received facsimile status listing
  • REIN β€” reinitiate server state
  • REST β€” restart incomplete transfer
  • RETP β€” retrieve the next page in a file
  • RETR β€” retrieve a file
  • SHUT β€” schedule server shutdown
  • SITE β€” non-standard commands (see next section)
  • SIZE β€” return size of file
  • STAT β€” return status of server or file
  • STOR β€” store a file
  • STOT β€” store a temporary file with a unique name
  • STOU β€” store a file with a unique name
  • STRU β€” specify data transfer structure
  • SYST β€” show operating system type of server system
  • TYPE β€” specify data transfer type
  • TZONE β€” specify timezone handling for dates and times
  • USER β€” specify user name
  • VRFY β€” verify dialstring handling and/or least-cost routing

and then the following non-standard or experimental commands get supported through the SITE request. 🧚

  • ADDMODEMΒΉ β€” add/configure new modem for use
  • ADDUSERΒΉ β€” add client access control entry
  • CONFIGΒΉ β€” send configuration parameter setting to server
  • DELMODEMΒΉ β€” deconfigure/remove modem
  • DELUSERΒΉ β€” remove client access control entry
  • TRIGGER β€” register realtime event trigger
  • HELP β€” give help information, e.g., SITE HELP

and also: FTP requests that are specified in Internet RFC 959 but not listed here are recognized β€” but not implemented. she sees them. she's just not doing anything about it. πŸ™ˆ

oh and one more thing, this is important. the hfaxd server will abort an active data transfer only when the ABOR command is preceded by a Telnet "Interrupt Process" (IP) signal and a Telnet "Synch" signal in the command Telnet stream, as described in Internet RFC 959. and if a STAT command is received during a data transfer β€” again, preceded by a Telnet IP and Synch β€” transfer status will be returned. ⭐


πŸŽ€ SIMPLE NETWORK PAGING PROTOCOL (SNPP) SUPPORT πŸŽ€

if hfaxd is started with the -s option, she'll service clients using the Simple Network Pager Protocol (SNPP) as specified in RFC 1861 β€” which, btw, obsoletes RFC 1645. ✨

the hfaxd server currently recognizes the SNPP protocol requests listed below. requests marked with a ΒΉ are non-standard extensions to RFC 1861 that may be added to SNPP at some future time. case is not distinguished, and only the first four characters of requests are used in identifying commands. iykyk. πŸ’…

  • 2WAY β€” preface a 2-way transaction
  • ABORΒΉ β€” abort previous command
  • ACKR β€” set read acknowledgement handling for subsequent requests
  • ALER β€” set the alter-level for subsequent requests
  • CALL β€” set the caller-ID for subsequent requests
  • COVE β€” set the alternate coverage area for subsequent requests
  • DATA β€” specify a multi-line message
  • EXPT β€” set the expiration time for subsequent requests
  • HELP β€” give help information
  • HOLD β€” set the time at which subsequent requests are to be delivered
  • KTAG β€” kill a previously submitted request
  • LEVE β€” set the service level for subsequent requests
  • LOGI β€” login to server
  • MCRE β€” specify multiple response text and code
  • MESS β€” specify a single-line message
  • MSTA β€” return the status of a previously submitted request
  • NOQU β€” disable message queueing
  • PAGE β€” specify the destination pager
  • PING β€” locate/validate a pager
  • QUIT β€” terminate session
  • RESE β€” reset server state
  • RTYP β€” set the reply type code for subsequent requests
  • SEND β€” send message(s)
  • SITEΒΉ β€” site-specific commands (see next section)
  • STATΒΉ β€” return server status
  • SUBJ β€” set the message text for subsequent requests

the hfaxd server will abort an active SEND operation when an ABOR command is preceded by a Telnet "Interrupt Process" (IP) signal and a Telnet "Synch" signal in the command Telnet stream. πŸ›‘

and these following non-standard or experimental commands are also supported through the SITE request:

  • FROMUSER β€” specify the sender's identity
  • IDLE β€” set idle-timer (in seconds)
  • JPARM β€” query job parameter status
  • JQUEUE β€” control whether or not job is queued
  • LASTTIME β€” set the time to terminate an unfinished job
  • MAILADDR β€” set the e-mail address to use for notification
  • MAXDIALS β€” set the maximum number of times to dial the phone
  • MAXTRIES β€” set the maximum number of times to try sending the page
  • MODEM β€” set the modem or class of modems to use
  • NOTIFY β€” set the e-mail notification
  • RETRYTIME β€” set the time to delay between job retries
  • SCHEDPRI β€” set the scheduling priority for the job
  • HELP β€” give help information, e.g., SITE HELP
heads up bestie 🚨 β€” hfaxd requires that SNPP clients login first with the LOGI directive, while RFC 1861 permits clients to submit pages anonymously. so like. she's stricter than the spec. respect it. πŸ‘‘

πŸ” CLIENT ACCESS CONTROL πŸ”

okay so here's the tea on who gets to talk to hfaxd at all. it controls client access based on whatever's chilling in /var/spool/hylafax/etc/hosts.hfaxd. that file is literally the guest list: it defines the set of users and machines that may receive service and, optionally, it defines password challenges to use in authenticating clients. πŸ’–

so like, clients may be permitted access to services with or without a password challenge β€” your call. access may also be restricted based on the host machine that a request for service originates from, which is giving "we know where you live" energy. go read hosts.hfaxd(5) for the format and content of this file, iykyk. also there's the SITE ADDUSER protocol request, which is provided for adding new users to a server β€” and bestie, that one is available only to clients with administrative privileges. πŸ’…


server resources are controlled based on clients' identities. jobs and documents, both received and submitted, are protected by the server. typically clients are permitted access to anything they own or that is publicly accessible. and then there are administrative privileges that clients may acquire, which permit them wide access to objects that reside on the server. main character privileges fr fr. πŸ‘‘

ngl, a complete client-server protocol specification is still outstanding. we said what we said. πŸ™ˆ

hfaxd operates with its root directory set to the top of the HylaFAX spooling area; /var/spool/hylafax. it does this so that clients see a virtual file hierarchy that is completely contained within the HylaFAX operating environment on the server machine β€” very demure, very contained. ✨ but administrators must be aware of this action when specifying files in the hfaxd configuration file: absolute pathnames relative to the root of the spooling should be used to specify filenames. do not come for me about this, it's just how it works. 😭

🚧 SERVER ACCESS CONTROL 🚧

the file /var/spool/hylafax/etc/shutdown, when present, specifies when to restrict access to a server machine. when this file is present and contains valid information, hfaxd will permit only users with administrative privileges to access the server. any other users that request service will be denied access, and negative server responses will include any shutdown message specified in the shutdown file. go read hylafax-shutdown(5) for the format and content of this file. πŸ’–

the SHUT protocol request can be used to schedule a server shutdown; it is available only to clients with administrative privileges. to make a shutdown server available again, the shutdown file can be deleted with the DELE protocol request. (this is to be replaced with an ``unshut'' protocol request so that implementation details are not part of the protocol β€” yes that's literally what the docs say, we're not making this up.) 🫢

βš™οΈ CONFIGURATION FILES βš™οΈ

hfaxd reads configuration information from the file /etc/hylafax/hfaxd.conf each time a new server process is started (i.e. for each new client). this file uses the same conventions used by other HylaFAX configuration files; as described in hylafax-config(5). 🌸

the following configuration parameters are recognized; items marked ``(SNPP)'' are used only by the SNPP support. okay bestie, here's the whole roster, one by one, no skips: ✨

  • AllowSortFormat β€” type: boolean, default: true β€” Allow client to request sorting formats
  • FaxContact β€” type: string, default: see below β€” contact address to show in help text
  • FileFmt β€” type: string, default: see below β€” format string for file status results
  • FileSortFmt β€” type: string, default: - β€” format string for sorting file status listing
  • IdleTimeout β€” type: integer, default: 900 β€” client idle timeout in seconds
  • JobFmt β€” type: string, default: see below β€” format string for job status results
  • JobSortFmt β€” type: string, default: - β€” format string for sorting job status listing
  • JobProtection β€” type: octal, default: 0444 β€” permissions for job qfiles in sendq/doneq
  • KillTimeMap β€” type: string, default: see below β€” mapping from service level to job kill time (SNPP)
  • LogFacility β€” type: string, default: daemon β€” syslog facility name for tracing messages
  • MaxAdminAttempts β€” type: integer, default: 5 β€” maximum admin attempts before disconnecting
  • MaxConsecutiveBadCmds β€” type: integer, default: 10 β€” maximum invalid commands before disconnecting
  • MaxIdleTimeout β€” type: integer, default: 7200 β€” maximum client idle timeout permitted
  • MaxLoginAttempts β€” type: integer, default: 5 β€” maximum login attempts before disconnecting
  • MaxMsgLength β€” type: integer, default: 128 β€” maximum pager message length (SNPP)
  • ModemFmt β€” type: string, default: see below β€” format string for modem status results
  • ModemSortFmt β€” type: string, default: - β€” format string for sorting modem status listing
  • PagerIDMapFile β€” type: string, default: /var/spool/hylafax/etc/pagermap β€” name of file for mapping pager IDs (SNPP)
  • PriorityMap β€” type: string, default: see below β€” mapping from service level to job priority (SNPP)
  • PublicJobQ β€” type: boolean, default: true β€” Allow public listing access to the sendq/doneq
  • PublicRecvQ β€” type: boolean, default: true β€” Allow public listing access to the recvq
  • RcvFmt β€” type: string, default: see below β€” format string for received facsimile status results
  • RcvSortFmt β€” type: string, default: - β€” format string for sorting received facsimile status results listing
  • RetryTimeMap β€” type: string, default: see below β€” mapping from service level to job retry time (SNPP)
  • ServerTracing β€” type: integer, default: 1 β€” server tracing control vector
  • ShutdownFile β€” type: string, default: /var/spool/hylafax/etc/shutdown β€” name of shutdown control file
  • UserAccessFile β€” type: string, default: /var/spool/hylafax/etc/hosts.hfaxd β€” name of access control file
  • XferLogFile β€” type: string, default: /var/spool/hylafax/etc/clientlog β€” name of file for logging client data transfers

the configuration parameters are explained below:

AllowSortFormat

this controls whether the server accept the *SORTFMT commands which the client issues to change the server sort the listings. yes, that sentence is a little wobbly, but that's the deal: it's the switch that says whether the server takes those client-issued *SORTFMT commands or not. πŸ’…

FaxContact

the e-mail address to display as a point of contact in the help text returned to a client in response to the HELP or SITE HELP commands. by default this is ``FaxMaster@hostname'', where hostname is the fully qualified name for the machine where the server is running. πŸŽ€

FileFmt

the format string to use when returning file status information with the LIST and STAT commands. formats are specified using printf(3S) style conventions but using the field identifiers listed below. each item can include field width, precision, left-justification, 0-filling, etc. just as for printf; e.g. %-8p for an 8-character wide, left-justified, blank-padded field containing the file protection flags. ok so the field identifiers, all of them: ✨

  • a β€” Last access time
  • c β€” Creation time
  • d β€” Device number (octal)
  • f β€” Filename
  • g β€” Group identifier (decimal)
  • i β€” Inode number (decimal)
  • l β€” Link count (decimal)
  • m β€” Last modification time
  • o β€” Owner (based on file GID)
  • p β€” Fax-style protection flags (no group bits)
  • q β€” UNIX-style protection flags
  • r β€” Root device number (octal)
  • s β€” File size in bytes (decimal)
  • u β€” User identifier (decimal)

the default format string is ``%-7p %3l %8o %8s %-12.12m %.48f''. it is recommended that all items include a field width so that client applications that construct headers from the format string can constrain the width of column title strings. do it for the column alignment, bestie. πŸ“

FileSortFmt

the format string to use when sorting the listing for directories using the LIST command. follows the FileFmt formatting rules. so same rules, different job. 🌈

IdleTimeout

the initial/default timeout to use in timing out idle clients. this value defines the maximum amount of time (in seconds) that hfaxd will wait for a command from a client before terminating the connection. unprivileged clients may alter the idle timeout up to the value of MaxIdleTimeout; privileged clients may set the timeout to any value. πŸ‘‘

JobFmt

the format string to use when returning job status information for jobs in the sendq and doneq directories. formats are specified using printf(3S) style conventions but using the field identifiers listed below. each item can include field width, precision, left-justification, 0-filling, etc. just as for printf; e.g. %-3j for a 3-character wide, left-justified, blank-padded field containing the job state.

  • A β€” Destination SubAddress
  • B β€” Destination Password
  • C β€” Destination company name
  • D β€” Total # dials / maximum # dials
  • E β€” Desired signalling rate
  • F β€” Client-specific tagline format string
  • G β€” Desired min-scanline time
  • H β€” Desired data format
  • I β€” Client-specified scheduling priority
  • J β€” Client-specified job tag string
  • K β€” Desired use of ECM
  • L β€” Destination geographic location
  • M β€” Notification e-mail address
  • N β€” Desired use of private tagline (one-character symbol)
  • O β€” Whether to use continuation cover page (one-character symbol)
  • P β€” # pages transmitted / total # pages to transmit
  • Q β€” Client-specified minimum acceptable signalling rate
  • R β€” Destination person (receiver)
  • S β€” Sender's identity
  • T β€” Total # tries / maximum # tries
  • U β€” Page chopping threshold (inches)
  • V β€” Job done operation
  • W β€” Communication identifier
  • X β€” Job type (one-character symbol)
  • Y β€” Scheduled date and time
  • Z β€” Scheduled time in seconds since the UNIX epoch
  • a β€” Job state (one-character symbol)
  • b β€” # consecutive failed tries
  • c β€” Client machine name
  • d β€” Total # dials
  • e β€” Public (external) format of dialstring
  • f β€” # consecutive failed dials
  • g β€” Group identifier
  • h β€” Page chop handling (one-character symbol)
  • i β€” Current scheduling priority
  • j β€” Job identifier
  • k β€” Job kill time
  • l β€” Page length in mm
  • m β€” Assigned modem
  • n β€” E-mail notification handling (one-character symbol)
  • o β€” Job owner
  • p β€” # pages transmitted
  • q β€” Job retry time (MM::SS)
  • r β€” Document resolution in lines/inch
  • s β€” Job status information from last failure
  • t β€” Total # tries attempted
  • u β€” Maximum # tries
  • v β€” Client-specified dialstring
  • w β€” Page width in mm
  • x β€” Maximum # dials
  • y β€” Total # pages to transmit
  • z β€” Time to send job

Okay so the default format string is literally this:

%-4j %3i %1a %6.6o %-12.12e %5P %5D %7z %.25s

and bestie, that string is engineered πŸŽ€ β€” it keeps every single status line under 80 characters. And here's the pro tip: give every item a field width, because client applications like faxstat(1) that build their headers out of the format string need to be able to constrain how wide those column title strings get. iykyk πŸ’…


JobSortFmt πŸ’–

The format string used when sorting the listing for jobs in the sendq and doneq directories. It follows the exact same formatting rules as JobFmt. Copy that energy, different job. ✨

JobProtection πŸ”

The file mode setting for job qfiles in the HylaFAX queues (sendq and doneq). The default of `0644` lets all users view all the job parameters in the send/done queues. But if PublicJobQ is set to false, then this file mode is what decides the permissions clients get to see jobs β€” following the HylaFAX permission model where the group bits control uid permissions and the other bits control other permissions. It's giving layered security, honestly. πŸ‘‘

KillTimeMap πŸ’€

The mapping from SNPP service level (0-11) to job expiration time (aka kill time ⚰️). You specify a mapping as a string of space-separate numbers, where each value is the number of minutes you're willing to let a job run.

Default mapping:

5 5 5 15 60 240 720 1440 1440 1440 1440 1440

Which means: a job expires in 5 minutes for service levels 0-2, 15 minutes for level three, 60 minutes for level four, etc. ⏰

LogFacility πŸ“

The symbolic name for the syslog(3) facility to use when logging error messages and informational/debugging messages that were requested through the ServerTracing parameter. You'll find the list of facility names in the system include file <syslog.h> β€” and comparisons are case-insensitive. 🌈

MaxAdminAttempts 🚫

The maximum number of unsuccessful attempts to gain administrative privileges with the ADMIN command that hfaxd will allow a client before it terminates the connection. Note that the count of attempts gets reset if/when the client successfully gains administrative privileges. So like, no farming the counter, bestie. πŸ’…

MaxConsecutiveBadCmds 😭

The maximum number of consecutive unrecognized, unimplemented, syntactically incorrect, or otherwise straight-up unacceptable commands allowed before the connection gets terminated. This control has two purposes:

  • to handle naive or malicious clients that send long streams of nonsense commands at a server, and
  • to insure that clients are forcibly terminated when a server is marked shutdown.

Not me protecting the server from the group chat spam. πŸ›‘οΈ

MaxIdleTimeout πŸ¦‹

The maximum value a client is allowed to set the idle timeout to. This value is not enforced if the client has administrative privileges. Main character privileges, fr fr. πŸ‘‘

MaxLoginAttempts πŸ”‘

The maximum number of unsuccessful attempts to login with the USER and PASS commands that hfaxd will permit a client before terminating the connection. Three strikes but make it authentication. ⚑

MaxMsgLength πŸ“

The maximum number of characters to accept in a pager message specified with the DATA or MESS commands. Messages longer than this value are rejected. Keep it short, keep it cute. βœ‚οΈ

ModemFmt 🌸

The format string to use when returning modem status information for modems listed in the status directory. Formats use printf(3S) style conventions, but with the field identifiers listed below. Each item can include field width, precision, left-justification, 0-filling, etc. just like printf does β€” e.g. %-8h gives you an 8-character wide, left-justified, blank-padded field holding the name of the host the server is running on. πŸ’–

  • h β€” Server hostname
  • l β€” Local identifier string
  • m β€” Canonical modem name
  • n β€” FAX phone number
  • r β€” Maximum pages that can be received in a single call
  • s β€” Status information string
  • t β€” Server and session tracing levels (xxxxx:yyyyy)
  • v β€” Modem speaker volume as one-character symbol
  • z β€” A * if a faxgetty(8) process is running; otherwise (space)

The default format string is `Modem %m (%n): %s`. Iconic, honestly. ✨

ModemSortFmt πŸŽ€

The format string to use when sorting the listsin for modem status information in the status directory. πŸŒ€

PagerIDMapFile πŸ“Ÿ

The absolute pathname</> of the file that contains directions for mapping pager identifiers to IXO/TAP or UCP service providers (and optionally a pager identification number). Go consult pagermap(5) for the tea on the format and content of this file.

Heads up bestie: absolute pathnames here are relative to the root of the spooling area. Don't get caught out. 🫢

PriorityMap ⭐

The mapping from SNPP service level (0-11) to job scheduling priority. You write it as a string of space-separate numbers, where each value is the priority assigned to a job.

Default mapping:

63 127 127 127 127 127 127 127 127 127 127 127

Which hands a high priority to service level zero and normal (default) priority to all the other service levels. Level zero said "I'm the moment." πŸ”₯

PublicJobQ πŸ‘€

By default, HylaFAX has always made the listings of the sendq/doneq include all jobs to any client connected to hfaxd. Set this to false and hfaxd will also enforce its normal access restrictions on the listing of jobs in the sendq/doneq.

These access restrictions are based on:

  • the file mode (see JobProtection), and
  • the logged in uid (see hosts.hfaxd)

Locking it down, periodt. πŸ”’

PublicRecvQ πŸ“¬

Same deal, different queue: by default HylaFAX has always made the listings of the recvq include all faxes to any client connected to hfaxd. Set this to false and hfaxd will also enforce its normal access restrictions on the listing of faxes in the recvq.

These access restrictions are based on:

  • the file mode faxgetty (and its related FaxDispatch) set for the fax, and
  • the logged in uid (see hosts.hfaxd)

Two queues, one vibe check. βœ…

RcvFmt πŸ’Œ

The format string to use when returning status information for received facsimile in the recvq directory. Formats use printf(3S) style conventions, but with the field identifiers listed below. Each item can include field width, precision, left-justification, 0-filling, etc. just as for printf β€” e.g. %-3b gives you a 3-character wide, left-justified, blank-padded field holding the signalling rate. πŸ¦‹

  • a β€” SubAddress received from sender (if any)
  • b β€” Signalling rate used during receive
  • d β€” Data format used during receive
  • e β€” Error description if an error occurred during receive
  • f β€” Document filename (relative to the recvq directory)
  • h β€” Time spent receiving document (HH:MM:SS)
  • l β€” Page length in mm
  • m β€” Fax-style protection mode string (`-rwxrwx`)
  • n β€” File size (number of bytes)
  • o β€” File owner
  • p β€” Number of pages in document
  • q β€” UNIX-style protection flags
  • r β€” Resolution of received data
  • s β€” Sender identity (TSI)
  • t β€” Compact representation of the time when the receive happened
  • w β€” Page width in mm
  • z β€” A * if receive is going on; otherwise (space)

…and the default format string is ``%-7m %4p%1z %-8.8o %14.14s %7t %f''. That string keeps every status line under 80 characters, bestie β€” it's a whole aesthetic constraint ✨. And it's highly recommended that every item in your format string carries a field width, because client apps like faxstat(1) build their column headers straight out of that format string, and they need to know how wide to make the titles. iykyk πŸ’…

πŸŽ€ Configuration Parameters (cont'd) πŸŽ€

  • RcvSortFmt β€” the format string used when sorting the listing of received facsimile in the recvq directory. It follows all the same RcvFmt formatting rules, no cap πŸ’–
  • RetryTimeMap β€” this one's a whole vibe check on SNPP service levels (0-11) mapped to job retry time. You write it as a string of space-separated numbers, where each value is how many seconds to delay between delivery attempts. A value of 0 means "nah, just schedule retries with the default algorithm the HylaFAX job scheduler already uses". The default mapping is:
30 60 60 180 0 0 0 0 0 0 0 0

which literally means: a level 0 job gets retried after a 30 second delay, levels 1 and 2 after 60 seconds, level 3 after 3 minutes, and every other job gets retried the usual scheduling-algorithm way. iconic πŸ¦‹

  • ServerTracing β€” a number that controls how much tracing info a server generates. Different areas of operation are controlled individually, so if you want tracing for multiple areas, you bit-or the flag for each area together to build the value for this tag 🌈
    • 1 (0x00001) β€” General server operation
    • 2 (0x00002) β€” Client-server protocol requests and responses
    • 4 (0x00004) β€” File transfers from client to server
    • 8 (0x00008) β€” File transfers from server to client
    • 16 (0x00010) β€” Client logins
    • 32 (0x00020) β€” All network connections
    • 64 (0x00040) β€” FIFO messages to and from faxq(8)
    • 128 (0x00080) β€” TIFF Library errors and warnings
    • 256 (0x00100) β€” Configuration file processing

Tracing messages get sent off to syslog(3) using whatever facility you set with the LogFacility configuration parameter. Heads up though: syslogd(8) has to be configured to actually capture facility.info, facility.debug, facility.warning, and facility.err messages, or your traces just vanish into the void 😭

  • ShutdownFile β€” the absolute pathname of the server shutdown file. Peep hylafax-shutdown(5) for the format and content deets. (Note that absolute pathnames are relative to the root of the spooling area β€” yes, that's the rule, don't come for me πŸ™ˆ)
  • UserAccessFile β€” the absolute pathname of the user access control file. See hosts.hfaxd(5) for the format and content. (Same note: absolute pathnames are relative to the root of the spooling area.)
  • XferLogFile β€” the absolute pathname of the file used for logging client-server file transfers (and that only kicks in when you've enabled it through the ServerTracing parameter). (Yep β€” absolute pathnames are relative to the root of the spooling area.)

✨ OPTIONS ✨

  • -q dir β€” treat the specified directory as the spooling area. The default spooling area, /var/spool/hylafax, gets baked in at the time the software is built πŸ“
  • -d β€” stops hfaxd from detaching itself from the controlling terminal. Normally you'd only use this when running hfaxd under a debugger, or when hfaxd gets started up from the inetd(8) process 🫢
  • -l bindaddress β€” bind the tcp port to the specified bindaddress. But listen: this argument has to be specified before the -i, otherwise it just gets ignored, periodt πŸ’€. A better approach for improving security would be to run hfaxd from xinetd and bind its service to the specific port β€” that also lets HylaFAX benefit from tcp wrappers and all the other options xinetd provides πŸ‘‘
  • -i port β€” listen on the specified port for service requests and respond with the client-server protocol. The port can be symbolic, e.g. ``hylafax'', or numeric. You can specify this flag multiple times to request service on multiple different ports. Each time you specify it, it listens on that port bound to the last -l bindaddress you gave it. If no -l bindaddress was specified, it binds to the system configured default wildcard address β€” which could be IPv6, or IPv4, or both, no promises 🌐
  • -s port β€” listen on the specified port for service requests and respond with the Simple Network Paging (SNPP) protocol. The port can be symbolic, e.g. ``snpp'', or numeric. This flag can also be specified multiple times to request service on multiple different ports πŸ“Ÿ
  • -I β€” service the client-server protocol using standard input and output. Super useful when hfaxd is started up by inetd(8) πŸ’œ
  • -S β€” service the Simple Network Paging (SNPP) protocol using standard input and output. Also super useful when hfaxd is started up by inetd(8) ✨

🩺 DIAGNOSTICS 🩺

Diagnostics generated by hfaxd are logged using syslog(3). That's the whole thing, bestie 🌸


πŸ“‚ FILES πŸ“‚

  • /etc/hylafax/hfaxd.conf β€” server configuration file
  • /var/spool/hylafax β€” spooling area
  • /var/spool/hylafax/FIFO β€” for submitting the job
  • /var/spool/hylafax/sendq β€” where job description is placed
  • /var/spool/hylafax/sendq/seqf β€” for assigning job identifiers
  • /var/spool/hylafax/docq/seqf β€” for assigning document identifiers
  • /var/spool/hylafax/tmp β€” temporary location of job-related files
  • /var/spool/hylafax/docq β€” where document files are placed
  • /var/spool/hylafax/recvq β€” where received facsimile are found
  • /var/spool/hylafax/archive β€” where archived jobs are placed
  • /var/spool/hylafax/log β€” for server log files
  • /var/spool/hylafax/client β€” for FIFO files used in communicating with faxq
  • /var/spool/hylafax/status β€” for server status information
  • /var/spool/hylafax/config.device β€” for returning server status
  • /var/spool/hylafax/etc/hosts.hfaxd β€” host access control list
  • /var/spool/hylafax/etc/shutdown β€” server shutdown control
  • /var/spool/hylafax/etc/pagermap β€” SNPP pager ID mapping file

πŸ’€ BUGS πŸ’€

To be filled in. (The most relatable section in any manpage fr fr 😭 not me writing "TODO: bugs" and calling it documentation πŸ’…)


πŸ‘€ SEE ALSO πŸ‘€

sendfax(1), sendpage(1), faxalter(1), faxrm(1), faxstat(1), faxq(8), syslog(3) hylafax-server(5), hosts.hfaxd(5), status(5), hylafax-shutdown(5),


And that's a wrap on the whole page, bestie πŸŽ€ this one's from the July 12, 1996 era, part of the HylaFAX HFAXD(8) manual β€” go forth and fax responsibly, you absolute icon πŸ‘‘βœ¨

πŸ“¦ where this page comes from