logfile.c
上传用户:mei_mei897
上传日期:2007-01-05
资源大小:82k
文件大小:5k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* logfile.c */
  5. /* */
  6. /*  Copyright (C) 1997,1998 Angelo Masci */
  7. /* */
  8. /*  This library is free software; you can redistribute it and/or */
  9. /*  modify it under the terms of the GNU Library General Public */
  10. /*  License as published by the Free Software Foundation; either */
  11. /*  version 2 of the License, or (at your option) any later version. */
  12. /* */
  13. /*  This library is distributed in the hope that it will be useful, */
  14. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  15. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
  16. /*  Library General Public License for more details. */
  17. /* */
  18. /*  You should have received a copy of the GNU Library General Public */
  19. /*  License along with this library; if not, write to the Free */
  20. /*  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  21. /* */
  22. /*  You can contact the author at this e-mail address: */
  23. /* */
  24. /*  angelo@styx.demon.co.uk */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id: logfile.c,v 5.1 1998/02/01 07:10:39 root Exp $
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <stdarg.h>
  31. #include <time.h>
  32. #include <unistd.h>
  33. #include "logfile.h"
  34. #include "sms_error.h"
  35. #include "common.h"
  36. /* -------------------------------------------------------------------- */
  37. char *ctable[] = {
  38. "<NUL>", "<SOH>", "<STX>", "<ETX>", "<EOT>",
  39. "<ENQ>", "<ACK>", "<BEL>", "<BS>",  "<HT>",
  40. "<LF>",  "<VT>",  "<NP>",  "<CR>",  "<SO>",
  41. "<SI>",  "<DLE>", "<DC1>", "<DC2>", "<DC3>",
  42. "<DC4>", "<NAK>", "<SYN>", "<ETB>", "<CAN>",
  43. "<EM>",  "<SUB>", "<ESC>", "<FS>",  "<GS>",
  44. "<RS>",  "<US>"
  45. };
  46. #define asctostr(X) (ctable[(int)(X)])
  47. /* -------------------------------------------------------------------- */
  48. static int console_log       = TRUE;
  49. static int current_loglevel  = LOG_STANDARD;
  50. static char *current_logfile = NULL;
  51. static FILE *log_fp;
  52. /* -------------------------------------------------------------------- */
  53. /* -------------------------------------------------------------------- */
  54. void set_logfile(char *logfile)
  55. { current_logfile = logfile;
  56. }
  57. /* -------------------------------------------------------------------- */
  58. /* -------------------------------------------------------------------- */
  59. void set_loglevel(int loglevel)
  60. { current_loglevel = loglevel;
  61. }
  62. /* -------------------------------------------------------------------- */
  63. /* -------------------------------------------------------------------- */
  64. void set_consolelog(int send_to_console_log)
  65. { console_log = send_to_console_log;
  66. }
  67. /* -------------------------------------------------------------------- */
  68. /* -------------------------------------------------------------------- */
  69. void open_log(void)
  70. {
  71. if (current_logfile == NULL)
  72. { fprintf(stderr, "ERROR: logfile undefinedn");
  73. exit(EOPENLOG);
  74. }
  75. log_fp = fopen(current_logfile, "a");
  76. if (log_fp == NULL)
  77. {
  78. fprintf(stderr, "ERROR: Opening logfile: %sn", current_logfile);
  79. fflush(stderr);
  80. exit(EOPENLOG);
  81. }
  82. }
  83. /* -------------------------------------------------------------------- */
  84. /* -------------------------------------------------------------------- */
  85. void close_log(void)
  86. {
  87. if (log_fp != NULL)
  88. { fclose(log_fp);
  89. }
  90. }
  91. /* -------------------------------------------------------------------- */
  92. /* -------------------------------------------------------------------- */
  93. static char *get_current_logtype(int loglevel)
  94. {
  95. switch (loglevel)
  96. {
  97. case LOG_ERROR:
  98. return "ERROR";
  99. case LOG_WARNING:
  100. return "WARNING";
  101. }
  102. return "";
  103. }
  104. /* -------------------------------------------------------------------- */
  105. /* -------------------------------------------------------------------- */
  106. static char *get_current_date(void) 
  107. {
  108. static char buf[128];
  109. time_t ct;
  110. struct tm
  111. *ctm;
  112. time(&ct);
  113. ctm = localtime(&ct);
  114. strftime(buf, 64, "%b %d %H:%M:%S", ctm);
  115. return buf;
  116. }
  117. /* -------------------------------------------------------------------- */
  118. /* -------------------------------------------------------------------- */
  119. void lprintf(int loglevel, const char *fmt, ...)
  120. {
  121. va_list args;
  122. static char line[MAX_LOG_LINE],
  123. nline[MAX_LOG_LINE * 5]; /* 5 is the maximum */
  124. /* width of results  */
  125. /* from asctostr() */
  126. char *ptr;
  127. int i, 
  128. line_len;
  129. /* ---------------------------- */
  130. if (loglevel > current_loglevel)
  131. return;
  132. open_log();
  133. va_start(args, fmt);
  134. #if !defined(LINUX)
  135. vsprintf(line, fmt, args);
  136. #else
  137. vsnprintf(line, MAX_LOG_LINE, fmt, args);
  138. #endif
  139. va_end(args);
  140. line_len = sms_strlen(line);
  141. ptr = nline;
  142. for (i=0; i<line_len; i++)
  143. {
  144. if ((line[i] <= 31) &&
  145.     (line[i] >= 0))
  146. {
  147. if ((line[i] == 'n') &&
  148.     (i == (line_len -1)))
  149. {
  150. *ptr = 'n';
  151. ptr++;
  152. }
  153. else
  154. { sms_strcpy(ptr, asctostr(line[i]));
  155. ptr += sms_strlen(asctostr(line[i]));
  156. }
  157. }
  158. else
  159. if (line[i] < 0)
  160. {
  161. *ptr = ' ';
  162. ptr++;
  163. }
  164. else
  165. { *ptr = line[i];
  166. ptr++;
  167. }
  168. }
  169. *ptr = '';
  170. if (console_log)
  171. {
  172. if (loglevel > LOG_WARNING)
  173. {
  174. fprintf(stdout, "%s", nline);
  175. fflush(stdout);
  176. }
  177. else
  178. { fprintf(stderr, "%s: %s",
  179. get_current_logtype(loglevel),
  180. nline);
  181. fflush(stderr);
  182. }
  183. }
  184. fprintf(log_fp, "%s [%d] %s: %s",
  185. get_current_date(),
  186.         (int)getpid(),
  187. get_current_logtype(loglevel),
  188. nline);
  189. fflush(log_fp);
  190. close_log();
  191. }