Annotation of libwww/Library/src/HTMemLog.c, revision 2.20
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.20 ! frystyk 6: ** @(#) $Id: HTMemLog.c,v 2.19 1999/02/02 20:28:11 frystyk Exp $
2.1 frystyk 7: **
8: ** 26 Nov 96 (EGP) started
9: */
10:
11: /* Library include files */
2.17 frystyk 12: #include "wwwsys.h"
2.1 frystyk 13: #include "HTUtils.h"
2.15 frystyk 14: #include "HTInet.h"
2.1 frystyk 15: #include "HTMemLog.h"
2.6 eric 16: #include "HTTimer.h"
2.1 frystyk 17:
2.19 frystyk 18: #ifdef O_SYNC
19: #define OPEN_FLAGS O_WRONLY|O_CREAT|O_TRUNC|O_SYNC
20: #else
2.11 frystyk 21: #define OPEN_FLAGS O_WRONLY|O_CREAT|O_TRUNC
2.19 frystyk 22: #endif
2.7 eric 23:
2.2 eric 24: PRIVATE size_t LogBuffSize = 1024; /* default size is 1k */
25: PRIVATE int LogFd = 2;
26: PRIVATE const char * LogName = NULL;
27: PRIVATE char * LogBuff = NULL;
28: PRIVATE size_t LogLen = 0;
29: PRIVATE BOOL KeepOpen = YES;
2.6 eric 30: PRIVATE HTTimer * Timer = NULL;
2.1 frystyk 31:
2.6 eric 32: PRIVATE int MemLogTimeout (HTTimer * timer, void * param, HTEventType type)
33: {
2.7 eric 34: int ret;
35:
2.20 ! frystyk 36: if (CORE_TRACE) HTTrace("MemLog...... flushing on timeout\n");
2.7 eric 37: ret = HTMemLog_flush();
38:
39: #if 0
40: /* Force flush */
41: if (close(LogFd) == -1 || (LogFd = open(LogName, OPEN_FLAGS, 0666)) == -1)
42: return HT_ERROR;
43: #endif
44:
45: return ret;
2.6 eric 46: }
47:
48: PUBLIC int HTMemLog_open (char * logName, size_t size, BOOL keepOpen)
2.1 frystyk 49: {
50: #ifdef USE_SYSLOG
2.2 eric 51: openlog(LogName, LOG_NDELAY, LOG_USER);
2.1 frystyk 52: #else /* USE_SYSLOG */
2.2 eric 53: LogName = logName;
54: KeepOpen = keepOpen;
2.7 eric 55: if ((LogFd = open(LogName, OPEN_FLAGS, 0666)) == -1)
2.1 frystyk 56: return HT_ERROR;
2.2 eric 57: if (!KeepOpen)
58: close(LogFd);
2.1 frystyk 59: LogBuffSize = size;
60: if ((LogBuff = (char *) HT_MALLOC(size)) == NULL)
61: HT_OUTOFMEM("HTMemLog_open");
62: LogLen = 0;
63: #endif /* !USE_SYSLOG */
2.6 eric 64: HTTraceData_setCallback(HTMemLog_callback);
2.18 frystyk 65: Timer = HTTimer_new(NULL, MemLogTimeout, NULL, 10000, YES, YES);
2.1 frystyk 66: return HT_OK;
67: }
68:
2.4 eric 69: PUBLIC int HTMemLog_flush(void)
2.1 frystyk 70: {
2.4 eric 71: if (LogLen) {
72: if (!KeepOpen)
2.7 eric 73: if ((LogFd = open(LogName, O_WRONLY|O_CREAT|O_APPEND, 0666)) == -1)
2.4 eric 74: return HT_ERROR;
75: write(LogFd, LogBuff, LogLen);
76: LogLen = 0;
77: }
2.2 eric 78: if (!KeepOpen)
79: close(LogFd);
2.1 frystyk 80: return HT_OK;
81: }
82:
2.5 eric 83: PUBLIC int HTMemLog_add(char * buf, size_t len)
2.1 frystyk 84: {
2.3 frystyk 85: if (LogBuff) {
86: /*
87: ** Dump everything that won't fit in buffer
88: */
89: while (len + LogLen > LogBuffSize) {
90: size_t toWrite = LogBuffSize-LogLen;
91: memcpy(LogBuff+LogLen, buf, toWrite);
92: LogLen = LogBuffSize; /* same as += toWrite */
93: HTMemLog_flush();
94: buf += toWrite;
95: len -= toWrite;
96: }
97: memcpy(LogBuff+LogLen, buf, len);
98: LogLen += len;
99: return HT_OK;
2.1 frystyk 100: }
2.3 frystyk 101: return HT_ERROR;
2.1 frystyk 102: }
103:
2.15 frystyk 104: PRIVATE ms_t HTMemLog_addTime(void)
2.1 frystyk 105: {
106: char buff[20];
2.15 frystyk 107: ms_t ms = HTGetTimeInMillis();
108: int len = sprintf(buff, "%lu", ms);
2.1 frystyk 109: HTMemLog_add(buff, len);
2.15 frystyk 110: return ms;
2.1 frystyk 111: }
112:
113: PUBLIC void HTMemLog_close (void)
114: {
115: #ifdef USE_SYSLOG
116: closelog();
117: #else /* USE_SYSLOG */
2.4 eric 118: HTMemLog_flush();
2.2 eric 119: if (LogFd > 2)
120: close(LogFd);
2.1 frystyk 121: if (LogBuff != NULL)
122: HT_FREE(LogBuff);
123: #endif /* !USE_SYSLOG */
124: }
125:
2.2 eric 126: #ifdef USE_SYSLOG
127: #define PRINT_BUFF_SIZE 8200
128: #else /* USE_SYSLOG */
129: #define PRINT_BUFF_SIZE 200
130: #endif /* !USE_SYSLOG */
131:
2.6 eric 132: #ifdef USE_EXCLUDES
133: typedef struct {char * str; int len;} StrIndexIndex;
134:
135: PRIVATE int StrIndex (char * str, StrIndexIndex element[], int elements)
136: {
137: int i;
138: for (i = 0; i < elements; i++)
139: if (!strncmp(element[i].str, str, element[i].len))
140: return i + 1;
141: return 0;
142: }
143:
144: PRIVATE StrIndexIndex Excludes[] = {{"HTReader_read", 13}, {"HTWriter_write", 14}, {"HTEventList_loop", 16}};
145:
146: #endif /* USE_EXCLUDES */
147:
148: PUBLIC int HTMemLog_callback (char * data, size_t len, char * fmt, va_list pArgs)
2.1 frystyk 149: {
2.2 eric 150: char buff[PRINT_BUFF_SIZE];
2.1 frystyk 151: int ret;
2.6 eric 152: #ifdef USE_EXCLUDES
153: if (StrIndex(fmt, Excludes, sizeof(Excludes)/sizeof(Excludes[0])))
154: return 0;
155: #endif /* USE_EXCLUDES */
2.2 eric 156: #ifdef USE_SYSLOG
2.1 frystyk 157: ret = vsprintf(buff, fmt, pArgs);
158: syslog(LOG_DEBUG, "%s\n", buff);
159: if (len > 8192)
160: len = 8192;
161: strncpy(buff, data, len);
162: buff[len] = 0;
163: syslog(LOG_DEBUG, "%s\n", buff);
164: #else /* USE_SYSLOG */
165: HTMemLog_addTime();
2.16 frystyk 166: #ifdef HAVE_LONG_SIZE_T
167: ret = sprintf(buff, " %ld ", len);
168: #else
2.2 eric 169: ret = sprintf(buff, " %d ", len);
2.16 frystyk 170: #endif
2.1 frystyk 171: HTMemLog_add(buff, ret);
2.2 eric 172:
173: if (fmt) {
174: ret = vsprintf(buff, fmt, pArgs);
175: HTMemLog_add(buff, ret);
176: }
2.1 frystyk 177: HTMemLog_add("\n", 1);
2.2 eric 178:
2.1 frystyk 179: HTMemLog_add(data, len);
2.2 eric 180: HTMemLog_add("\n", 1);
2.1 frystyk 181: #endif /* !USE_SYSLOG */
182: return ret;
183: }
184:
Webmaster