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