faxstat.c++
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:6k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: faxstat.c++,v 1.11 2009/09/29 11:46:01 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-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. #include "FaxClient.h"
  27. #include "StrArray.h"
  28. #include "Sys.h"
  29. #include "config.h"
  30. #include <errno.h>
  31. class faxStatApp : public FaxClient {
  32. private:
  33.     fxStr header;
  34.     bool listWithHeader(const fxStr& dir, fxStr& emsg);
  35. public:
  36.     faxStatApp();
  37.     ~faxStatApp();
  38.     void run(int argc, char** argv);
  39. };
  40. faxStatApp::faxStatApp() {}
  41. faxStatApp::~faxStatApp() {}
  42. static bool
  43. writeStdout(void*, const char* buf, int cc, fxStr&)
  44. {
  45.     (void) Sys::write(STDOUT_FILENO, buf, cc);
  46.     return (true);
  47. }
  48. void
  49. faxStatApp::run(int argc, char** argv)
  50. {
  51.     resetConfig();
  52.     readConfig(FAX_SYSCONF);
  53.     readConfig(FAX_USERCONF);
  54.     char *owner = NULL;
  55.     char *pass = NULL;
  56.     fxStrArray dirs;
  57.     bool checkInfo = false;
  58.     bool checkStatus = true;
  59.     bool showSeqfs = false;
  60.     int c;
  61.     while ((c = Sys::getopt(argc, argv, "h:adgfilnO:o:qrsv")) != -1)
  62. switch (c) {
  63. case 'a': // display archived jobs
  64.     dirs.append(FAX_ARCHDIR);
  65.     break;
  66. case 'd': // display jobs in done queue
  67.     dirs.append(FAX_DONEDIR);
  68.     break;
  69. case 'f': // display queued documents
  70.     dirs.append(FAX_DOCDIR);
  71.     break;
  72. case 'g': // use GMT for dates & times
  73.     setTimeZone(TZ_GMT);
  74.     break;
  75. case 'h': // server's host
  76.     setHost(optarg);
  77.     break;
  78. case 'i': // display any.info file
  79.     checkInfo = true;
  80.     break;
  81. case 'l': // use local timezone for dates & times
  82.     setTimeZone(TZ_LOCAL);
  83.     break;
  84. case 'n': // do not display server status
  85.     checkStatus = false;
  86.     break;
  87. case 'o': // specify owner:pass
  88.     {
  89. char* pp = strchr(optarg, ':');
  90.   if (pp && *(pp + 1) != '') {
  91.     *pp = '';
  92.     pass = pp + 1;
  93. }
  94.     }
  95.     owner = optarg;
  96.     break;
  97. case 'q': // display sequence numbers
  98.     showSeqfs = true;
  99.     break;
  100. case 'O':
  101.     readConfigItem(optarg);
  102.     break;
  103. case 'r': // display receive queue
  104.     dirs.append(FAX_RECVDIR);
  105.     break;
  106. case 's': // display jobs in send queue
  107.     dirs.append(FAX_SENDDIR);
  108.     break;
  109. case 'v': // enable protocol tracing
  110.     setVerbose(true);
  111.     break;
  112. case '?':
  113.     fxFatal("usage: faxstat [-h server-host] [-adfgilnrsv] [-o login]");
  114. }
  115.     if (checkStatus) dirs.insert(FAX_STATUSDIR, 0); // server status
  116.     fxStr emsg;
  117.     if (callServer(emsg)) {
  118. if (login(owner, pass, emsg)) {
  119.     if (checkInfo)
  120. (void) recvData(writeStdout, NULL, emsg, 0,
  121.     "RETR " FAX_STATUSDIR "/any." FAX_INFOSUF);
  122.     if (showSeqfs) {
  123. writeStdout(0, " Receive queue sequence number: ", 32, emsg);
  124. (void) recvData(writeStdout, 0, emsg, 0, "RETR " FAX_RECVDIR "/" FAX_SEQF);
  125. writeStdout(0, "n    Send queue sequence number: ", 33, emsg);
  126. (void) recvData(writeStdout, 0, emsg, 0, "RETR " FAX_SENDDIR "/" FAX_SEQF);
  127. writeStdout(0, "nDocument queue sequence number: ", 33, emsg);
  128. (void) recvData(writeStdout, 0, emsg, 0, "RETR " FAX_DOCDIR "/" FAX_SEQF);
  129. writeStdout(0, "n     Log queue sequence number: ", 33, emsg);
  130. (void) recvData(writeStdout, 0, emsg, 0, "RETR " FAX_LOGDIR "/" FAX_SEQF);
  131. writeStdout(0, "n", 1, emsg);
  132.     }
  133.     for (u_int i = 0, n = dirs.length(); i < n; i++) {
  134. header = (i > 0 ? "n" : "");
  135. if (dirs[i] == FAX_SENDDIR || dirs[i] == FAX_DONEDIR) {
  136.     getJobStatusHeader(header);
  137.     header.append('n');
  138. } else if (dirs[i] == FAX_RECVDIR) {
  139.     getRecvStatusHeader(header);
  140.     header.append('n');
  141. } else if (dirs[i] == FAX_STATUSDIR) {
  142.     fxStr notused;
  143.     getModemStatusHeader(notused);
  144. }
  145. if (!listWithHeader(dirs[i], emsg))
  146.     break;
  147.     }
  148. }
  149. hangupServer();
  150.     }
  151.     if (emsg != "")
  152. printError("%s", (const char*) emsg);
  153. }
  154. bool
  155. faxStatApp::listWithHeader(const fxStr& dir, fxStr& emsg)
  156. {
  157.     if (!setMode(MODE_S))
  158. goto bad;
  159.     if (!initDataConn(emsg))
  160. goto bad;
  161.     if (command("LIST " | dir) != PRELIM)
  162. goto bad;
  163.     if (!openDataConn(emsg))
  164. goto bad;
  165.     u_long byte_count; byte_count = 0; // XXX for __GNUC__
  166.     for (;;) {
  167. char buf[16*1024];
  168. int cc = read(getDataFd(), buf, sizeof (buf));
  169. if (cc == 0) {
  170.     closeDataConn();
  171.     return (getReply(false) == COMPLETE);
  172. }
  173. if (cc < 0) {
  174.     emsg = fxStr::format("Data Connection: %s", strerror(errno));
  175.     (void) getReply(false);
  176.     break;
  177. }
  178. if (byte_count == 0 && header.length() > 0)
  179.     (void) Sys::write(STDOUT_FILENO, header, header.length());
  180. byte_count += cc;
  181. (void) Sys::write(STDOUT_FILENO, buf, cc);
  182.     }
  183. bad:
  184.     closeDataConn();
  185.     return (false);
  186. }
  187. int
  188. main(int argc, char** argv)
  189. {
  190.     faxStatApp app;
  191.     app.run(argc, argv);
  192.     return 0;
  193. }