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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: FaxMachineLog.c++,v 1.2 2007/01/29 23:55:22 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 <ctype.h>
  27. extern "C" {
  28. #include <sys/time.h>
  29. }
  30. #include <errno.h>
  31. #include "Sys.h"
  32. #include "config.h"
  33. #include "FaxMachineLog.h"
  34. #include "StackBuffer.h"
  35. extern void logError(const char* fmt ...);
  36. FaxMachineLog::FaxMachineLog(int f, const fxStr& number, const fxStr& commid)
  37. {
  38.     fd = f;
  39.     pid = getpid();
  40.     log("SESSION BEGIN %s %s", (const char*) commid, (const char*) number);
  41.     log("%s", HYLAFAX_VERSION);
  42. }
  43. FaxMachineLog::~FaxMachineLog()
  44. {
  45.     if (fd != -1) {
  46. log("SESSION END");
  47. Sys::close(fd);
  48.     }
  49. }
  50. void
  51. FaxMachineLog::log(const char* fmt, ...)
  52. {
  53.    if (fd != -1) {
  54. va_list ap;
  55. va_start(ap, fmt);
  56. vlog(fmt, ap);
  57. va_end(ap);
  58.    }
  59. }
  60. void
  61. FaxMachineLog::vlog(const char* fmt0, va_list ap)
  62. {
  63.    if (fd == -1)
  64. return;
  65.     int oerrno = errno; // save errno on entry
  66.     char buf[1024];
  67.     timeval tv;
  68.     (void) gettimeofday(&tv, 0);
  69.     strftime(buf, sizeof (buf), "%h %d %T", localtime((time_t*) &tv.tv_sec));
  70.     fxStr s = buf | fxStr::format(".%02u: [%5d]: ", tv.tv_usec / 10000, pid);
  71.     /*
  72.      * Copy format string into a local buffer so
  73.      * that we can substitute for %m, a la syslog.
  74.      */
  75.     fxStackBuffer fmt;
  76.     for (const char* fp = fmt0; *fp; fp++) {
  77. if (fp[0] == '%')
  78.     switch (fp[1]) {
  79.     case '%':
  80. fmt.put("%%"); fp++;
  81. continue;
  82.     case 'm': // substitute errno string
  83. fmt.put(strerror(oerrno)), fp++;
  84. continue;
  85.     }
  86. fmt.put(fp[0]);
  87.     }
  88.     fmt.put('n'); fmt.put('');
  89.     s.append(fxStr::vformat((const char*) fmt, ap));
  90.     (void) Sys::write(fd, (const char*)s, s.length());
  91. }