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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: FaxAcctInfo.c++,v 1.5 2008/04/26 22:34:28 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 "FaxAcctInfo.h"
  27. #include "StackBuffer.h"
  28. #include "Sys.h"
  29. #include <sys/file.h>
  30. #include "config.h"
  31. extern const char* fmtTime(time_t);
  32. /*
  33.  * Record an activity in the transfer log file.
  34.  */
  35. bool
  36. FaxAcctInfo::record(const char* cmd)
  37. {
  38.     bool ok = false;
  39.     int fd = Sys::open(FAX_XFERLOG, O_RDWR|O_CREAT|O_APPEND, 0644);
  40.     char* timebuf = (char*) malloc(80);
  41.     strftime(timebuf, 79, "%D %H:%M", localtime(&start));
  42.     char* jobtagbuf = (char*) malloc(80);
  43.     u_int i = 0;
  44.     char c;
  45.     for (const char* cp = jobtag; (c = *cp); cp++) {
  46. if (i == 79) // truncate string
  47.     break;
  48. if (c == 't') // tabs are field delimiters
  49.     c = ' ';
  50. else if (c == '"') // escape quote marks
  51.     jobtagbuf[i++] = '\';
  52. jobtagbuf[i++] = c;
  53.     }
  54.     jobtagbuf[i] = '';
  55.     fxStr paramsbuf = fxStr::format("%u", params);
  56.     fxStr npagesbuf = fxStr::format("%d", npages);
  57.     fxStr durationbuf = fxStr::format("%s", fmtTime(duration));
  58.     fxStr conntimebuf = fxStr::format("%s", fmtTime(conntime));
  59.     fxStr callid_formatted = "";
  60.     for (i = 2; i < callid.size(); i++) {
  61. if (i > 2) callid_formatted.append("::");
  62. callid_formatted.append(callid[i]);
  63.     }
  64.     if (fd >= 0) {
  65. fxStackBuffer record;
  66. record.put(timebuf); // $ 1 = time
  67. record.fput("t%s", cmd); // $ 2 = SEND|RECV|POLL|PAGE
  68. record.fput("t%s", commid); // $ 3 = commid
  69. record.fput("t%s", device); // $ 4 = device
  70. record.fput("t%s", jobid); // $ 5 = jobid
  71. record.fput("t"%s"", jobtagbuf); // $ 6 = jobtag
  72. record.fput("t%s", user); // $ 7 = sender
  73. record.fput("t"%s"", dest); // $ 8 = dest
  74. record.fput("t"%s"", csi); // $ 9 = csi
  75. record.fput("t%u", params); // $10 = encoded params and DCS
  76. record.fput("t%d", npages); // $11 = npages
  77. record.fput("t%s", fmtTime(duration)); // $12 = duration
  78. record.fput("t%s", fmtTime(conntime)); // $13 = conntime
  79. record.fput("t"%s"", status); // $14 = status
  80. record.fput("t"%s"", callid.size() > CallID::NAME ? (const char*) callid[1] : ""); // $15 = CallID2/CIDName
  81. record.fput("t"%s"", callid.size() > CallID::NUMBER ? (const char*) callid[0] : ""); // $16 = CallID1/CIDNumber
  82. record.fput("t"%s"", (const char*) callid_formatted); // $17 = CallID3 -> CallIDn
  83. record.fput("t"%s"", owner); // $18 = owner
  84. record.fput("t"%s"", (const char*) faxdcs); // $19 = DCS
  85. record.fput("t%s", (const char*) jobinfo); // $20 = jobinfo
  86. record.put('n');
  87. flock(fd, LOCK_EX);
  88. ok = (Sys::write(fd, record, record.getLength()) == (ssize_t)record.getLength());
  89. Sys::close(fd); // implicit unlock
  90.     }
  91.     /*
  92.      * Here we provide a hook for an external accounting
  93.      * facility, such as a database.
  94.      */
  95.     const char* argv[22];
  96.     argv[0] = "FaxAccounting";
  97.     argv[1] = timebuf;
  98.     argv[2] = cmd;
  99.     argv[3] = commid;
  100.     argv[4] = device;
  101.     argv[5] = jobid;
  102.     argv[6] = jobtagbuf;
  103.     argv[7] = user;
  104.     argv[8] = dest;
  105.     argv[9] = csi;
  106.     argv[10] = (const char*) paramsbuf;
  107.     argv[11] = (const char*) npagesbuf;
  108.     argv[12] = (const char*) durationbuf;
  109.     argv[13] = (const char*) conntimebuf;
  110.     argv[14] = status;
  111.     argv[15] = callid.size() > CallID::NAME ? (const char*) callid[1] : "";
  112.     argv[16] = callid.size() > CallID::NUMBER ? (const char*) callid[0] : "";
  113.     argv[17] = (const char*) callid_formatted;
  114.     argv[18] = owner;
  115.     argv[19] = (const char*) faxdcs;
  116.     argv[20] = (const char*) jobinfo;
  117.     argv[21] = NULL;
  118.     pid_t pid = fork(); // signal handling in some apps seems to require a fork here
  119.     switch (pid) {
  120. case 0:
  121.     Sys::execv("etc/FaxAccounting", (char* const*) argv);
  122.     sleep(1); // XXX give parent time
  123.     _exit(127);
  124. case -1:
  125.     break;
  126. default:
  127.     Sys::waitpid(pid);
  128.     break;
  129.     }
  130.     return (ok);
  131. }