accesslog.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:2k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * accesslog.c - implement access logging functions
  3.  *
  4.  * see accesslog.h.
  5.  *
  6.  * Kalle Marjola 2000 for Project Kannel
  7.  */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <errno.h>
  11. #include <time.h>
  12. #include <stdarg.h>
  13. #include <string.h>
  14. #include "gwlib.h"
  15. static FILE *file = NULL;
  16. static char filename[FILENAME_MAX + 1]; /* to allow re-open */
  17. static int use_localtime;
  18. void alog_reopen(void)
  19. {
  20.     if (file == NULL)
  21. return;
  22.     
  23.     alog("Log ends");
  24.     fclose(file);
  25.     file = fopen(filename, "a");
  26.     if (file == NULL) {
  27. error(errno, "Couldn't re-open access logfile `%s'.",
  28.       filename);
  29.     } else
  30. alog("Log begins");
  31. }
  32. void alog_close(void)
  33. {
  34.     if (file != NULL) {
  35. alog("Log ends");
  36. fclose(file);
  37. file = NULL;
  38.     }
  39. }
  40. void alog_open(char *fname, int use_localtm)
  41. {
  42.     FILE *f;
  43.     
  44.     if (file != NULL) {
  45. warning(0, "Opening an already opened access log");
  46. alog_close();
  47.     }
  48.     if (strlen(fname) > FILENAME_MAX) {
  49. error(0, "Access Log filename too long: `%s', cannot open.", fname);
  50. return;
  51.     }
  52.     f = fopen(fname, "a");
  53.     if (f == NULL) {
  54. error(errno, "Couldn't open logfile `%s'.", fname);
  55. return;
  56.     }
  57.     file = f;
  58.     strcpy(filename, fname);
  59.     info(0, "Started access logfile `%s'.", filename);
  60.     use_localtime = use_localtm;
  61.     alog("Log begins");
  62. }
  63. void alog_use_localtime(void)
  64. {
  65.     use_localtime = 1;
  66. }
  67. void alog_use_gmtime(void)
  68. {
  69.     use_localtime = 0;
  70. }
  71. #define FORMAT_SIZE (10*1024)
  72. static void format(char *buf, const char *fmt)
  73. {
  74.     time_t t;
  75.     struct tm tm;
  76.     char *p, prefix[1024];
  77.     p = prefix;
  78.     time(&t);
  79.     if (use_localtime)
  80. tm = gw_localtime(t);
  81.     else
  82. tm = gw_gmtime(t);
  83.     sprintf(p, "%04d-%02d-%02d %02d:%02d:%02d ",
  84.     tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
  85.     tm.tm_hour, tm.tm_min, tm.tm_sec);
  86.     if (strlen(prefix) + strlen(fmt) > FORMAT_SIZE / 2) {
  87. sprintf(buf, "%s <OUTPUT message too long>n", prefix);
  88. return;
  89.     }
  90.     sprintf(buf, "%s%sn", prefix, fmt);
  91. }
  92. /* XXX should we also log automatically into main log, too? */
  93. void alog(const char *fmt, ...)
  94. {
  95.     char *buf;
  96.     va_list args;
  97.     if (file == NULL)
  98. return;
  99.     buf = gw_malloc(FORMAT_SIZE + 1);
  100.     format(buf, fmt);
  101.     va_start(args, fmt);
  102.     vfprintf(file, buf, args);
  103.     fflush(file);
  104.     va_end(args);
  105.     gw_free(buf);
  106. }