Annotation of libwww/Library/src/HTMemLog.c, revision 2.14
2.1 frystyk 1: /* HTMemLog.c
2: ** MEMORY BUFFERED DATA LOGGING UTILITIES
3: **
4: ** (c) COPYRIGHT MIT 1996.
5: ** Please first read the full copyright statement in the file COPYRIGH.
2.14 ! frystyk 6: ** @(#) $Id: HTMemLog.c,v 2.13 1997/12/22 14:46:09 frystyk Exp $
2.1 frystyk 7: **
8: ** 26 Nov 96 (EGP) started
9: */
10:
11: /* Library include files */
12: #include "sysdep.h"
13: #include "HTUtils.h"
14: #include "HTMemLog.h"
2.6 eric 15: #include "HTTimer.h"
2.1 frystyk 16:
2.11 frystyk 17: #ifdef WWW_MSWINDOWS
18: #define OPEN_FLAGS O_WRONLY|O_CREAT|O_TRUNC
2.12 eric 19: #else /* WWW_MSWINDOWS */
2.7 eric 20: #define OPEN_FLAGS O_WRONLY|O_CREAT|O_TRUNC|O_SYNC
2.12 eric 21: #endif /* !WWW_MSWINDOWS */
2.7 eric 22:
2.2 eric 23: PRIVATE size_t LogBuffSize = 1024; /* default size is 1k */
24: PRIVATE int LogFd = 2;
25: PRIVATE const char * LogName = NULL;
26: PRIVATE char * LogBuff = NULL;
27: PRIVATE size_t LogLen = 0;
28: PRIVATE BOOL KeepOpen = YES;
2.6 eric 29: PRIVATE HTTimer * Timer = NULL;
2.1 frystyk 30:
2.6 eric 31: PRIVATE int MemLogTimeout (HTTimer * timer, void * param, HTEventType type)
32: {
2.7 eric 33: int ret;
34:
2.10 frystyk 35: if (WWWTRACE) HTTrace("MemLog...... flushing on timeout\n");
2.7 eric 36: ret = HTMemLog_flush();
37:
38: #if 0
39: /* Force flush */
40: if (close(LogFd) == -1 || (LogFd = open(LogName, OPEN_FLAGS, 0666)) == -1)
41: return HT_ERROR;
42: #endif
43:
44: return ret;
2.6 eric 45: }
46:
47: PUBLIC int HTMemLog_open (char * logName, size_t size, BOOL keepOpen)
2.1 frystyk 48: {
49: #ifdef USE_SYSLOG
2.2 eric 50: openlog(LogName, LOG_NDELAY, LOG_USER);
2.1 frystyk 51: #else /* USE_SYSLOG */
2.2 eric 52: LogName = logName;
53: KeepOpen = keepOpen;
2.7 eric 54: if ((LogFd = open(LogName, OPEN_FLAGS, 0666)) == -1)
2.1 frystyk 55: return HT_ERROR;
2.2 eric 56: if (!KeepOpen)
57: close(LogFd);
2.1 frystyk 58: LogBuffSize = size;
59: if ((LogBuff = (char *) HT_MALLOC(size)) == NULL)
60: HT_OUTOFMEM("HTMemLog_open");
61: LogLen = 0;
62: #endif /* !USE_SYSLOG */
2.6 eric 63: HTTraceData_setCallback(HTMemLog_callback);
64: Timer = HTTimer_new(NULL, MemLogTimeout, NULL, 10000, YES);
2.1 frystyk 65: return HT_OK;
66: }
67:
2.4 eric 68: PUBLIC int HTMemLog_flush(void)
2.1 frystyk 69: {
2.4 eric 70: if (LogLen) {
71: if (!KeepOpen)
2.7 eric 72: if ((LogFd = open(LogName, O_WRONLY|O_CREAT|O_APPEND, 0666)) == -1)
2.4 eric 73: return HT_ERROR;
74: write(LogFd, LogBuff, LogLen);
75: LogLen = 0;
76: }
2.2 eric 77: if (!KeepOpen)
78: close(LogFd);
2.1 frystyk 79: return HT_OK;
80: }
81:
2.5 eric 82: PUBLIC int HTMemLog_add(char * buf, size_t len)
2.1 frystyk 83: {
2.3 frystyk 84: if (LogBuff) {
85: /*
86: ** Dump everything that won't fit in buffer
87: */
88: while (len + LogLen > LogBuffSize) {
89: size_t toWrite = LogBuffSize-LogLen;
90: memcpy(LogBuff+LogLen, buf, toWrite);
91: LogLen = LogBuffSize; /* same as += toWrite */
92: HTMemLog_flush();
93: buf += toWrite;
94: len -= toWrite;
95: }
96: memcpy(LogBuff+LogLen, buf, len);
97: LogLen += len;
98: return HT_OK;
2.1 frystyk 99: }
2.3 frystyk 100: return HT_ERROR;
2.1 frystyk 101: }
102:
103: PRIVATE int HTMemLog_adjustGMT(long theTime)
104: {
105: static long adjustment = -1;
106: if (adjustment == -1) {
107: tzset();
108: adjustment = timezone;
109: }
110: return theTime-adjustment;
111: }
112:
113: PRIVATE int HTMemLog_addTime(void)
114: {
115: char buff[20];
116: int len;
2.6 eric 117: int ret;
2.5 eric 118: #ifdef WWW_MSWINDOWS
2.6 eric 119: SYSTEMTIME systemTime;
120:
121: GetLocalTime(&systemTime);
122: ret = systemTime.wSecond;
123: len = sprintf(buff, "%02d:%02d:%02d.%d", systemTime.wHour, systemTime.wMinute, systemTime.wSecond, systemTime.wMilliseconds);
2.5 eric 124: #else /* WWW_MSWINDOWS */
2.13 frystyk 125: #ifdef HAVE_GETTIMEOFDAY
2.6 eric 126: struct timeval tp;
2.13 frystyk 127: struct timezone tz;
2.1 frystyk 128:
129: gettimeofday(&tp, &tz);
130: tp.tv_sec = HTMemLog_adjustGMT(tp.tv_sec)%(24*60*60);
2.6 eric 131: ret = tp.tv_sec;
2.14 ! frystyk 132: len = sprintf(buff, "%02ld:%02ld:%02ld.%ld", tp.tv_sec/3600, (tp.tv_sec%3600)/60, tp.tv_sec%60, tp.tv_usec);
2.13 frystyk 133: #endif /* HAVE_GETTIMEOFDAY */
2.6 eric 134: #endif /* !WWW_MSWINDOWS */
2.1 frystyk 135: HTMemLog_add(buff, len);
2.6 eric 136: return ret;
2.1 frystyk 137: }
138:
139: PUBLIC void HTMemLog_close (void)
140: {
141: #ifdef USE_SYSLOG
142: closelog();
143: #else /* USE_SYSLOG */
2.4 eric 144: HTMemLog_flush();
2.2 eric 145: if (LogFd > 2)
146: close(LogFd);
2.1 frystyk 147: if (LogBuff != NULL)
148: HT_FREE(LogBuff);
149: #endif /* !USE_SYSLOG */
150: }
151:
2.2 eric 152: #ifdef USE_SYSLOG
153: #define PRINT_BUFF_SIZE 8200
154: #else /* USE_SYSLOG */
155: #define PRINT_BUFF_SIZE 200
156: #endif /* !USE_SYSLOG */
157:
2.6 eric 158: #ifdef USE_EXCLUDES
159: typedef struct {char * str; int len;} StrIndexIndex;
160:
161: PRIVATE int StrIndex (char * str, StrIndexIndex element[], int elements)
162: {
163: int i;
164: for (i = 0; i < elements; i++)
165: if (!strncmp(element[i].str, str, element[i].len))
166: return i + 1;
167: return 0;
168: }
169:
170: PRIVATE StrIndexIndex Excludes[] = {{"HTReader_read", 13}, {"HTWriter_write", 14}, {"HTEventList_loop", 16}};
171:
172: #endif /* USE_EXCLUDES */
173:
174: PUBLIC int HTMemLog_callback (char * data, size_t len, char * fmt, va_list pArgs)
2.1 frystyk 175: {
2.2 eric 176: char buff[PRINT_BUFF_SIZE];
2.1 frystyk 177: int ret;
2.6 eric 178: #ifdef USE_EXCLUDES
179: if (StrIndex(fmt, Excludes, sizeof(Excludes)/sizeof(Excludes[0])))
180: return 0;
181: #endif /* USE_EXCLUDES */
2.2 eric 182: #ifdef USE_SYSLOG
2.1 frystyk 183: ret = vsprintf(buff, fmt, pArgs);
184: syslog(LOG_DEBUG, "%s\n", buff);
185: if (len > 8192)
186: len = 8192;
187: strncpy(buff, data, len);
188: buff[len] = 0;
189: syslog(LOG_DEBUG, "%s\n", buff);
190: #else /* USE_SYSLOG */
191: HTMemLog_addTime();
2.2 eric 192:
193: ret = sprintf(buff, " %d ", len);
2.1 frystyk 194: HTMemLog_add(buff, ret);
2.2 eric 195:
196: if (fmt) {
197: ret = vsprintf(buff, fmt, pArgs);
198: HTMemLog_add(buff, ret);
199: }
2.1 frystyk 200: HTMemLog_add("\n", 1);
2.2 eric 201:
2.1 frystyk 202: HTMemLog_add(data, len);
2.2 eric 203: HTMemLog_add("\n", 1);
2.1 frystyk 204: #endif /* !USE_SYSLOG */
205: return ret;
206: }
207:
Webmaster