HylaFAXServer.h
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:25k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: HylaFAXServer.h,v 1.25 2009/09/29 11:10:13 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1995-1996 Sam Leffler
  4.  * Copyright (c) 1995-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. #ifndef _HylaFAXServer_
  27. #define _HylaFAXServer_
  28. #include "FaxConfig.h"
  29. #include "IOHandler.h"
  30. #include "Dictionary.h"
  31. #include "StrArray.h"
  32. #include "FaxRequest.h"
  33. #include "FaxRecvInfo.h"
  34. #include "manifest.h"
  35. #include "FileCache.h"
  36. #include "Trace.h"
  37. #include "Trigger.h"
  38. #include "SystemLog.h"
  39. #include "config.h"
  40. #ifdef HAVE_PAM
  41. extern "C" {
  42. #include <security/pam_appl.h>
  43. #include <grp.h>
  44. }
  45. #endif // HAVE_PAM
  46. #ifdef HAVE_LDAP
  47. #include <ldap.h>
  48. #include <string.h>
  49. #include <stdlib.h>
  50. #include <sys/time.h>
  51. #include <lber.h>
  52. #endif // HAVE_LDAP
  53. #include <sys/types.h>
  54. #include <sys/socket.h>
  55. #include <dirent.h>
  56. #include <setjmp.h>
  57. #include <errno.h>
  58. /*
  59.  * In-memory copy of a job description file.
  60.  */
  61. struct Job : public FaxRequest {
  62.     time_t lastmod; // last file modify time, for updates
  63.     bool queued; // for SNPP
  64.     Job(const fxStr& qf, int fd = -1);
  65.     ~Job();
  66.     bool checkDocument(const char* pathname);
  67. };
  68. fxDECLARE_StrKeyDictionary(JobDict, Job*)
  69. /*
  70.  * Received facsimile information.
  71.  */
  72. struct RecvInfo : public FaxRecvInfo {
  73.     bool beingReceived; // currently being received
  74.     time_t recvTime; // time receive operation started
  75.     RecvInfo();
  76.     RecvInfo(const char* qfile);
  77.     ~RecvInfo();
  78. };
  79. fxDECLARE_StrKeyDictionary(RecvInfoDict, RecvInfo*)
  80. #define HAVE_PSLEVEL2   false
  81.   
  82. static struct {
  83.     const char* name; // protocol token name
  84.     bool        supported; // true if format is supported
  85.     const char* suffix; // file suffix
  86.     FaxSendOp op; // associated FaxSendOp value
  87.     const char* help; // help string for HELP FORM command
  88. } formats[] = {
  89. { "TIFF", true,          "tif", FaxRequest::send_tiff, "Tagged Image File Format, Class F only" },
  90. { "PS",   true,          "ps",  FaxRequest::send_postscript, "Adobe PostScript" },
  91. { "PS2",  HAVE_PSLEVEL2, "ps",  FaxRequest::send_postscript, "Adobe PostScript Level II" },
  92. { "PCL",  true,          "pcl", FaxRequest::send_pcl, "HP Printer Control Language (PCL)"},
  93. { "PDF",  true,          "pdf", FaxRequest::send_pdf, "Adobe Portable Document Format" },
  94. };
  95. #define N(a)    (sizeof (a) / sizeof (a[0]))
  96. #ifdef T_USER
  97. #undef T_USER // XXX FreeBSD defines this
  98. #endif
  99. /*
  100.  * Parser tokens; also used to identify protocol commands/operations.
  101.  */
  102. enum Token {
  103.     /*
  104.      * Syntactic items.
  105.      */
  106.     T_SP, T_CRLF, T_COMMA, T_STRING, T_NUMBER,
  107.     T_NIL, T_LEXERR,
  108.     /*
  109.      * Commands.
  110.      */
  111.     T_ABOR,  T_ACCT, T_ADDMODEM, T_ADDUSER, T_ADMIN,
  112.     T_ALLO,  T_ANSWER, T_APPE, T_CHMOD, T_CHOWN,
  113.     T_CONFIG,  T_CWD,  T_CDUP, T_DELE, T_DELUSER,
  114.     T_DELMODEM,  T_DISABLE, T_ENABLE, T_EPSV, T_EPRT, T_FILEFMT, T_FORM,
  115.     T_HELP,  T_IDLE, T_LOCKWAIT, T_JDELE, T_JGDELE, T_JGINTR,
  116.     T_JGKILL,  T_JGNEW, T_JGPARM, T_JGREST, T_JGRP,
  117.     T_JGSUB,  T_JGSUSP, T_JGWAIT, T_JINTR, T_JKILL,
  118.     T_JNEW,  T_JOB, T_JOBFMT, T_JPARM, T_JREST,
  119.     T_JSUB,  T_JSUSP, T_JWAIT, T_LIST,   T_MDTM,
  120.     T_MODE,  T_MODEMFMT, T_NLST, T_NOOP, T_PASS,
  121.     T_PASV,  T_PORT, T_PWD, T_QUIT, T_RCVFMT,
  122.     T_REIN,  T_REST, T_RETP, T_RETR, T_RNFR,
  123.     T_RNTO,  T_SHUT, T_SITE, T_SIZE, T_STAT,
  124.     T_STOR,  T_STOT, T_STOU, T_STRU, T_SYST,
  125.     T_TRIGGER,  T_TYPE, T_TZONE, T_USER, T_VRFY,
  126.     /*
  127.      * Job state parameters.
  128.      */
  129.     T_ACCTINFO,  T_BEGBR, T_BEGST, T_CHOPTHRESH, T_CLIENT,
  130.     T_COMMENTS,  T_COMMID, T_COVER, T_DATAFORMAT, T_DIALSTRING,
  131.     T_DOCUMENT,  T_DONEOP, T_EXTERNAL, T_FAXNUMBER, T_FAXNAME, T_FROM_COMPANY, T_FROM_LOCATION,
  132.     T_FROM_USER, T_FROM_VOICE, T_GROUPID, T_HRES, T_IGNOREMODEMBUSY, T_JOBID,
  133.     T_JOBINFO,  T_JOBTYPE, T_LASTTIME, T_MAXDIALS, T_MAXPAGES,
  134.     T_MAXTRIES,  T_MINBR, T_MODEM, T_NDIALS, T_NOTIFY,
  135.     T_NOTIFYADDR,T_NPAGES, T_NTRIES, T_OWNER, T_PAGECHOP,
  136.     T_PAGELENGTH,T_PAGEWIDTH, T_PASSWD, T_POLL, T_REGARDING,
  137.     T_RETRYTIME, T_SCHEDPRI, T_SENDTIME, T_SKIPPAGES, T_SKIPPEDPAGES, T_STATE, T_STATUS, T_ERRORCODE,
  138.     T_SUBADDR,  T_TAGLINE, T_TIMEOFDAY, T_TOTDIALS, T_TOTPAGES, T_TOTTRIES,
  139.     T_TO_COMPANY,T_TO_LOCATION, T_TO_USER, T_TO_VOICE, T_TSI, T_USE_CONTCOVER, T_NOCOUNTCOVER, T_SERVERDOCOVER,
  140.     T_USE_ECM,  T_ECMTYPE, T_USE_TAGLINE, T_USE_XVRES, T_USRKEY, T_VRES,
  141.     /*
  142.      * SNPP tokens.
  143.      */
  144.     T_2WAY,  T_ACKREAD, T_ALERT, T_CALLERID, T_COVERAGE,
  145.     T_DATA,  T_EXPTAG, T_HOLDUNTIL, T_JQUEUE, T_KTAG,
  146.     T_LEVEL,  T_LOGIN, T_MCRESPONSE, T_MESSAGE, T_MSTATUS,
  147.     T_NOQUEUEING,T_PAGER, T_PING, T_RTYPE, T_SEND,
  148.     T_SUBJECT
  149. };
  150. struct tab { // protocol command table entry
  151.     const char* name;
  152.     Token token;
  153.     bool checklogin; // if true, must be logged in first
  154.     bool implemented; // false if command is not implemented
  155.     const char* help;
  156. };
  157. class SpoolDir;
  158. struct ParamProtection;
  159. struct stat;
  160. typedef struct tiff TIFF;
  161. class JobExt;
  162. class ModemExt;
  163. class ModemConfig;
  164. class IDCache;
  165. extern const char* fmtTime(time_t t);
  166. /*
  167.  * An instance of a fax server process.
  168.  */
  169. class HylaFAXServer : public SystemLog, public FaxConfig, public IOHandler {
  170. public:
  171.     struct stringtag {
  172.         const char*  name;
  173.         fxStr HylaFAXServer::* p;
  174.         const char*  def; // NULL is shorthand for ""
  175.     };
  176.     struct numbertag {
  177.         const char*  name;
  178.         u_int HylaFAXServer::*p;
  179.         u_int  def;
  180.     };
  181.     static int _debugSleep;
  182.     static fxStrArray configOptions; // Pased on the command line
  183. protected:
  184.     u_int state;
  185. #define S_LOGGEDIN 0x0001 // client is logged in
  186. #define S_PRIVILEGED 0x0002 // client has administrative privileges
  187. #define S_LREPLIES 0x0004 // using continuation msgs in replies
  188. #define S_WAITFIFO 0x0008 // waiting on response to FIFO msg
  189. #define S_USEGMT 0x0010 // process times in GMT or local TZ
  190. #define S_WAITPASS 0x0020 // had user command, waiting for passwd
  191. #define S_TRANSFER 0x0040 // actively transferring data
  192. #define S_WAITDATA 0x0080 // scanner is waiting for data
  193. #define S_WAITTRIG 0x0100 // trigger is active
  194. #define S_LOGTRIG 0x0200 // write trigger events to data conn
  195. #define S_CHECKGID 0x0400 // check if file GID is set correctly
  196. #define S_SETGID 0x0800 // must explicitly force GID on files
  197.     u_int tracingLevel; // server tracing control flags
  198.     fxStr logFacility; // name of syslog facility for logging
  199.     fxStr userAccessFile; // user access control file
  200.     fxStr xferfaxLogFile; // log file for data transfers
  201.     fxStr faxContact; // email account for inquiries
  202.     fxStr systemType; // system ID string returned for SYST
  203.     fxStr faxqFIFOName; // faxq FIFO name
  204.     fxStr clientFIFOName; // client FIFO name
  205.     int faxqFd; // faxq FIFO open descriptor
  206.     int clientFd; // client FIFO open descriptor
  207.     fxStr fifoResponse; // response received to FIFO msg
  208.     u_int idleTimeout; // client inactivity timeout
  209.     u_int maxIdleTimeout; // upper bound on idle timeout
  210.     u_int lockTimeout; // qfile lock timeout
  211.     u_int maxLockTimeout; // upper bound on qfile lock timeout
  212.     int data; // current data connection (socket)
  213.     int pdata; // passive mode data connect (socket)
  214.     fxStr hostname; // name of machine server is running on
  215.     fxStr hostaddr; // primary address for hostname
  216.     fxStr remotehost; // name of peer's machine
  217.     fxStr remoteaddr; // address of peer's machine
  218.     fxStr autospout; // text to send with next reply
  219.     fxStr shutdownFile; // file with shutdown information
  220.     fxStr shutdownMsg; // text of shutdown message
  221.     time_t lastModTime; // last mod. time of shutdown file
  222.     time_t lastTime; // time of last shutdown notification
  223.     time_t discTime; // time to disconnect service
  224.     time_t denyTime; // time to deny service
  225.     u_int jobProtection; // Protection to use on Jobs
  226.     u_int recvqProtection; // Protection to use on Recvq
  227.     /*
  228.      * User authentication and login-related state.
  229.      */
  230. #ifdef HAVE_PAM
  231. bool pam_chrooted; // if already chrooted, PAM gets disabled
  232. #endif
  233.     fxStr passWd; // encrypted user password
  234.     fxStr adminWd; // encrypted passwd for admin privileges
  235. #ifdef HAVE_LDAP
  236.     fxStr ldapServerUri; // URL for the LDAP Server
  237.     fxStr ldapBaseDN; // LDAP base DN where user objects are found
  238.     fxStr ldapReqGroup; // LDAP group users need to be members of for
  239. // fax server access
  240.     u_int ldapVersion; // LDAP Protocol Version being used (def. v3)
  241. #endif
  242.     u_int uid; // client's ID
  243.     u_int loginAttempts; // number of failed login attempts
  244.     u_int maxLoginAttempts; // login failures before server exits
  245.     u_int adminAttempts; // number of failed admin attempts
  246.     u_int maxAdminAttempts; // admin failures before server exits
  247.     fxStr the_user; // name of user
  248. fxStr   admingroup; // name of local user group that is allowed
  249. // to administer the fax server
  250.     IDCache* idcache; // fax UID -> name mapping table
  251.     /*
  252.      * File and file-transfer related state.
  253.      */
  254.     off_t restart_point; // file offset for restarting transfers
  255.     jmp_buf urgcatch; // throw location for transfer interrupt
  256.     off_t file_size; // size of file being transferred
  257.     off_t byte_count; // amount of data currently sent
  258.     int xferfaxlog; // open transfer log file
  259.     int mode; // data transfer mode
  260.     int form; // data transfer format
  261.     int type; // data transfer type
  262.     int stru; // file structure
  263.     SpoolDir* cwd; // current working directory
  264.     fxStrArray tempFiles; // files created with STOT
  265.     fxStr fileFormat; // format string for directory listings
  266.     TIFF* cachedTIFF; // cached open TIFF file
  267.     /*
  268.      * Parser-related state.
  269.      */
  270.     Token pushedToken; // lexical token push back
  271.     fxStr tokenBody; // string body of current lexical token
  272.     char cbuf[512]; // current input line
  273.     int cpos; // position in cbuf
  274.     int ctrlFlags; // file descriptor flags for control
  275.     int recvCC; // amount of data remaining in recvBuf
  276.     int recvNext; // next byte for scanner
  277.     char recvBuf[1024]; // input data buffer
  278.     u_int consecutiveBadCmds; // # consecutive invalid control cmds
  279.     u_int maxConsecutiveBadCmds; // max # before forced disconnect
  280.     /*
  281.      * Job-related state.
  282.      */
  283.     Job defJob; // default job state information
  284.     JobDict jobs; // non-default jobs
  285.     Job* curJob; // current job
  286.     fxStr jobFormat; // job status format string
  287.     JobDict blankJobs; // jobs created during this session but not submitted
  288.     /*
  289.      * Receive queue-related state.
  290.      */
  291.     RecvInfoDict recvq; // cache of info about received fax
  292.     fxStr recvFormat; // received fax status format string
  293.     /*
  294.      * Trigger-related state.
  295.      */
  296.     fxStr trigSpec; // specification for active trigger
  297.     u_int tid; // current active trigger ID
  298.     /*
  299.      * Modem-related state.
  300.      */
  301.     fxStr modemFormat; // modem status format string
  302.     static gid_t faxuid; // system gid of fax user = our uid
  303. #if HAS_TM_ZONE
  304.     const char* tzname[2]; // local timezone name
  305. #endif
  306.     time_t gmtoff; // time_t offset btwn GMT and local time
  307.     void userCmd(const char* name); // USER
  308.     void adminCmd(const char* name); // ADMIN
  309.     void passCmd(const char* passwd); // PASS
  310.     void statusCmd(void); // STAT
  311.     void formCmd(const char* name); // FORM
  312.     void formHelpCmd(void); // FORM
  313.     void typeCmd(const char* name); // TYPE
  314.     void modeCmd(const char* name); // MODE
  315.     void struCmd(const char* name); // STRU
  316.     void deleCmd(const char* name); // DELE
  317.     void mdtmCmd(const char* name); // MDTM
  318.     void cwdCmd(const char *path); // CWD
  319.     void pwdCmd(void); // PWD
  320.     void retrieveCmd(const char* name); // RETR
  321.     void retrievePageCmd(const char* name);// RETP
  322.     void listCmd(const char* name); // LIST
  323.     void nlstCmd(const char* name); // NLST
  324.     void storeCmd(const char*, const char*);// STOR+APPE
  325.     void storeUniqueCmd(bool isTemp); // STOU+STOT
  326.     void statFileCmd(const char* name); // STAT
  327.     void chownCmd(const char*, const char*);// CHOWN
  328.     void chmodCmd(const char*, u_int); // CHMOD
  329.     virtual void passiveCmd(void) = 0; // PASV: depends on transport
  330.     virtual void portCmd(Token) = 0; // PORT: depends on transport
  331.     void triggerCmd(const char*, ...); // TRIGGER
  332.     /*
  333.      * Administrative commands (experimental).
  334.      */
  335.     void abortCallCmd(const char*);
  336.     void addUserCmd(const char* spec, const char* pass, const char* apass);
  337.     void delUserCmd(const char* spec);
  338.     void answerCallCmd(const char* modem, const char* how);
  339.     void disableModemCmd(const char* modem, const char* reason);
  340.     void enableModemCmd(const char* mode);
  341.     void shutCmd(const struct tm& when, const char* reason);
  342.     void addModemCmd(const char* modem);
  343.     void delModemCmd(const char* modem);
  344.     void configQueryCmd(const char* where);
  345.     void configCmd(const char* where, const char* info);
  346.     virtual void initServer(void);
  347.     bool readShutdownFile(void);
  348.     bool isShutdown(bool quiet);
  349.     void fatal(const char *fmt, ...);
  350.     void reply(int code, const char* fmt, ...);
  351.     void vreply(int code, const char* fmt, va_list ap);
  352.     void lreply(int code, const char* fmt, ...);
  353.     void vlreply(int code, const char* fmt, va_list ap);
  354.     void perror_reply(int code, const char* string, int errnum);
  355.     void ack(int code, const char*);
  356.     void printTransferStatus(FILE* fd);
  357.     struct tm* cvtTime(const time_t&) const;
  358.     void setFileOwner(const char* filename);
  359.     void loginRefused(const char* why);
  360.     bool pamCheck(const char* user=NULL, const char* pass=NULL);
  361.     bool pamIsAdmin(const char* user=NULL);
  362. #ifdef HAVE_PAM
  363.     void pamEnd(pam_handle_t *pamh, int pamret);
  364. #endif
  365.     bool checkUser(const char*);
  366.     bool checkuser(FILE*, const char *name);
  367.     bool checkuser(const char *name);
  368.     void login(int code);
  369.     void end_login(void);
  370.     virtual void dologout(int status);
  371.     const char* fixPathname(const char* file);
  372.     const char* userName(u_int uid);
  373.     bool userID(const char*, u_int& id);
  374.     void fillIDCache(void);
  375.     bool ldapCheck(const char* user, const char* pass);
  376.     bool cvtPasswd(const char* type, const char* pass, fxStr& result);
  377.     bool findUser(FILE* db, const char* user, u_int& newuid);
  378.     bool addUser(FILE* db, const char* user, u_int uid,
  379. const char* upass, const char* apass);
  380.     bool deleteUser(FILE* db, const char* user);
  381.     /*
  382.      * Configuration file support.
  383.      */
  384.     static stringtag strings[];
  385.     static numbertag numbers[];
  386.     void resetConfig();
  387.     void setupConfig();
  388.     void configError(const char* fmt, ...);
  389.     void configTrace(const char* fmt, ...);
  390.     bool setConfigItem(const char* tag, const char* value);
  391.     bool restartSend(FILE* fd, off_t marker);
  392.     static SpoolDir dirs[];
  393.     bool checkFileRights(int op, const struct stat&);
  394.     void dirSetup(void);
  395.     static SpoolDir* dirLookup(const char* path);
  396.     static SpoolDir* dirLookup(ino_t ino);
  397.     SpoolDir* dirAccess(const char* path);
  398.     SpoolDir* fileAccess(const char* path, int op, struct stat&);
  399.     bool fileVisible(const SpoolDir&, const char*, const struct stat&);
  400.     bool isVisibleRecvQFile(const char*, const struct stat&);
  401.     void listRecvQ(FILE* fd, const SpoolDir& sd, DIR* dir);
  402.     void listRecvQFile(FILE*, const SpoolDir&, const char*, const struct stat&);
  403.     bool isVisibleSendQFile(const char*, const struct stat&);
  404.     void listSendQ(FILE* fd, const SpoolDir& sd, DIR* dir);
  405.     void listSendQFile(FILE*, const SpoolDir&, const char*, const struct stat&);
  406.     void nlstSendQ(FILE* fd, const SpoolDir& sd, DIR* dir);
  407.     void nlstSendQFile(FILE*, const SpoolDir&, const char*, const struct stat&);
  408.     void listStatus(FILE* fd, const SpoolDir& sd, DIR* dir);
  409.     void listStatusFile(FILE*, const SpoolDir&, const char*, const struct stat&);
  410.     void nlstStatus(FILE* fd, const SpoolDir& sd, DIR* dir);
  411.     bool isVisibletrue(const char*, const struct stat&);
  412.     bool isVisibleDocQFile(const char*, const struct stat&);
  413.     bool isVisibleRootFile(const char*, const struct stat&);
  414.     void listDirectory(FILE* fd, const SpoolDir& sd, DIR* dir);
  415.     void listUnixFile(FILE*, const SpoolDir&, const char*, const struct stat&);
  416.     void makeProt(const struct stat& sb, bool withGrp, char prot[10]);
  417.     void Fprintf(FILE*, const char* fmt, const char*, const struct stat&);
  418.     void nlstDirectory(FILE* fd, const SpoolDir& sd, DIR* dir);
  419.     void nlstUnixFile(FILE*, const SpoolDir&, const char*, const struct stat&);
  420.     virtual FILE* openDataConn(const char* mode, int& code) = 0;
  421.     static const char* dataConnMsg(int code);
  422.     virtual void closeDataConn(FILE*);
  423.     bool sendData(FILE* fdin, FILE* fdout);
  424.     bool sendIData(int fdin, int fdout);
  425.     bool sendZData(int fdin, int fdout);
  426.     bool recvData(FILE* instr, FILE* outstr);
  427.     bool recvIData(int fdin, int fdout);
  428.     bool recvZData(int fdin, int fdout);
  429.     TIFF* openTIFF(const char* name);
  430.     bool sendTIFFData(TIFF* tif, FILE* fdout);
  431.     bool sendTIFFHeader(TIFF* tif, int fdout);
  432.     bool sendITIFFData(TIFF* tif, int fdout);
  433.     void logTransfer(const char*, const SpoolDir&, const char*, time_t);
  434.     virtual int parse(void);
  435.     bool cmd(Token t);
  436.     bool site_cmd(Token t);
  437.     bool param_cmd(Token t);
  438.     bool multi_string_param(fxStr&, const char* what = NULL);
  439.     bool string_param(fxStr&, const char* what = NULL);
  440.     bool number_param(long&);
  441.     bool boolean_param(bool&);
  442.     bool file_param(fxStr& pathname);
  443.     bool pwd_param(fxStr& s);
  444.     bool timespec_param(int ndigits, time_t& t);
  445.     bool pathname_param(fxStr& pathname);
  446.     bool job_param(fxStr& jid);
  447.     bool jgrp_param(fxStr& jgid);
  448.     bool pathname(fxStr& s);
  449.     bool CRLF();
  450.     bool SPACE();
  451.     bool COMMA();
  452.     bool TIMESPEC(u_int len, time_t& result);
  453.     bool BOOLEAN(bool& b);
  454.     bool STRING(fxStr& s, const char* what = NULL);
  455.     bool NUMBER(long& n);
  456.     bool checkNUMBER(const char* s);
  457.     bool opt_CRLF();
  458.     bool opt_STRING(fxStr& s);
  459.     bool multi_STRING(fxStr& s, const char* what = NULL);
  460.     static u_int twodigits(const char* cp, u_int range);
  461.     static u_int fourdigits(const char* cp);
  462.     virtual void syntaxError(const char* msg);
  463.     virtual void netStatus(FILE*) = 0; // depends on transport
  464.     virtual bool hostPort() = 0; // depends on transport
  465.     int getChar(bool waitForInput);
  466.     void pushCmdData(const char* data, int n);
  467.     bool getCmdLine(char* s, int n, bool waitForInput = false);
  468.     void pushToken(Token t);
  469.     Token nextToken(void);
  470.     bool checkToken(Token);
  471.     bool getToken(Token, const char*);
  472.     void helpCmd(const tab* ctab, const char* s);
  473.     void logcmd(Token t, const char* fmt = NULL, ...);
  474.     void cmdFailure(Token t, const char* why);
  475.     bool checklogin(Token);
  476.     bool checkadmin(Token);
  477.     static const char* version;
  478.     virtual const char* cmdToken(Token t);
  479.     virtual const char* siteToken(Token t);
  480.     static const char* parmToken(Token t);
  481.     bool initClientFIFO(fxStr& emsg);
  482.     int FIFOInput(int fd);
  483.     void FIFOMessage(const char* cp, u_int len);
  484.     bool sendModem(const char* modem, fxStr& emsg, const char* fmt ...);
  485.     bool sendQueuerMsg(fxStr& emsg, const fxStr& msg);
  486.     bool sendQueuer(fxStr& emsg, const char* fmt ...);
  487.     bool sendQueuerACK(fxStr& emsg, const char* fmt, ...);
  488.     bool vsendQueuerACK(fxStr& emsg, const char* fmt, va_list ap);
  489.     bool newTrigger(fxStr& emsg, const char* fmt, ...);
  490.     bool vnewTrigger(fxStr& emsg, const char* fmt, va_list ap);
  491.     bool loadTrigger(fxStr& emsg);
  492.     bool cancelTrigger(fxStr& emsg);
  493.     void triggerEvent(const TriggerMsgHeader& h, const char* data);
  494.     void logEventMsg(const TriggerMsgHeader&h, fxStr& msg);
  495.     void logJobEventMsg(const TriggerMsgHeader&, const JobExt&);
  496.     void logSendEventMsg(const TriggerMsgHeader&, const JobExt&, const char*);
  497.     void logModemEventMsg(const TriggerMsgHeader&,
  498. const ModemExt&, const char*);
  499.     void logRecvEventMsg(const TriggerMsgHeader&,
  500. const FaxRecvInfo&, const char*);
  501.     virtual void initDefaultJob(void);
  502.     void parmBotch(Token t);
  503.     bool checkAccess(const Job& job, Token t, u_int op);
  504.     bool checkParm(Job&, Token t, u_int op);
  505.     bool checkJobState(Job*);
  506.     void replyJobParamValue(Job&, int code, Token t);
  507.     void replyBoolean(int code, bool b);
  508.     bool setValue(u_short& v, const char* value, const char* what,
  509. const char* valNames[], u_int nValNames);
  510.     void flushPreparedDocuments(Job& job);
  511.     bool setJobParameter(Job&, Token t, const fxStr& value);
  512.     bool setJobParameter(Job&, Token t, u_short value);
  513.     bool setJobParameter(Job&, Token t, time_t value);
  514.     bool setJobParameter(Job&, Token t, bool b);
  515.     bool setJobParameter(Job&, Token t, float value);
  516.     bool docType(const char* docname, FaxSendOp& op);
  517.     bool checkAddDocument(Job&, Token type, const char* docname, FaxSendOp&);
  518.     void addCoverDocument(Job&, const char* docname);
  519.     void addDocument(Job&, const char* docname);
  520.     void addPollOp(Job&, const char* sep, const char* pwd);
  521.     void newJobCmd(void);
  522.     bool newJob(fxStr& emsg);
  523.     Job* findJob(const char* jobid, fxStr& emsg);
  524.     Job* findJobInMemmory(const char* jobid);
  525.     Job* findJobOnDisk(const char* jobid, fxStr& emsg);
  526.     bool updateJobFromDisk(Job& job);
  527.     void replyCurrentJob(const char* leader);
  528.     void setCurrentJob(const char* jobid);
  529.     Job* preJobCmd(const char* op, const char* jobid, fxStr& emsg);
  530.     void operateOnJob(const char* jobid, const char* what, const char* op);
  531.     void deleteJob(const char* jobid);
  532.     void killJob(const char* jobid);
  533.     void replyBadJob(const Job& job, Token t);
  534.     void resetJob(const char* jobid);
  535.     void interruptJob(const char* jobid);
  536.     void suspendJob(const char* jobid);
  537.     void submitJob(const char* jobid);
  538.     void waitForJob(const char* jobid);
  539.     bool updateJobOnDisk(Job& req, fxStr& emsg);
  540.     bool lockJob(Job& job, int how, fxStr& emsg);
  541.     bool lockJob(Job& job, int how);
  542.     void unlockJob(Job& job);
  543.     void purgeJobs(void);
  544.     void jstatCmd(const Job&);
  545.     void jstatLine(Token t, const char* fmt ...);
  546.     const char* compactTime(time_t t);
  547.     void Jprintf(FILE* fd, const char* fmt, const Job& job);
  548.     u_int getJobNumber(fxStr&);
  549.     u_int getDocumentNumber(fxStr&);
  550.     bool getRecvDocStatus(RecvInfo& ri);
  551.     RecvInfo* getRecvInfo(const fxStr& qfile, const struct stat& sb);
  552.     const char* compactRecvTime(time_t t);
  553.     void Rprintf(FILE*, const char*, const RecvInfo&, const struct stat&);
  554.     void getServerStatus(const char* fileName, fxStr& status);
  555.     void Mprintf(FILE*, const char*, const ModemConfig&);
  556. public:
  557.     HylaFAXServer();
  558.     virtual ~HylaFAXServer();
  559.     static void setupPermissions(void);
  560.     static void closeAllBut(int fd);
  561.     static void closeAllDispatched();
  562.     static void sanitize(fxStr& s);
  563.     static void canonModem(fxStr& s);
  564.     static void canonDevID(fxStr& s);
  565.     virtual void open(void);
  566.     virtual void close(void);
  567.     virtual int inputReady(int);
  568.     void timerExpired(long, long);
  569. };
  570. inline void HylaFAXServer::pushToken(Token t) { pushedToken = t; }
  571. /*
  572.  * Directories in the spooling area are treated
  573.  * specially to hide implementation details and
  574.  * privileged information that clients have no
  575.  * business seeing.  Also we implement an access
  576.  * control system that is built on top of the
  577.  * normal UNIX protection mechanisms.
  578.  */
  579. struct SpoolDir {
  580.     const char* pathname;
  581.     bool adminOnly; // accessible by unprivileged clients
  582.     bool storAble; // unprivileged clients may STOR files
  583.     bool deleAble; // unprivileged clients may DELE files
  584.     ino_t ino; // directory inode number
  585.     bool (HylaFAXServer::*isVisibleFile)(const char*, const struct stat&);
  586.     void (HylaFAXServer::*listDirectory)(FILE*, const SpoolDir&, DIR*);
  587.     void (HylaFAXServer::*listFile)(FILE*, const SpoolDir&,
  588.         const char*, const struct stat&);
  589.     void (HylaFAXServer::*nlstDirectory)(FILE*, const SpoolDir&, DIR*);
  590.     void (HylaFAXServer::*nlstFile)(FILE*, const SpoolDir&,
  591.         const char*, const struct stat&);
  592.     void (HylaFAXServer::*delFile)(const SpoolDir&, const char*);
  593.     void (HylaFAXServer::*retrFile)(const SpoolDir&, const char*);
  594.     void (HylaFAXServer::*storFile)(const SpoolDir&, const char*);
  595. };
  596. #define IS(x) ((state & (S_##x)) != 0)
  597. #endif /* _HylaFAXServer_ */