[BACK] Return to HTMemLog.c CVS log [TXT] [DIR] Up to [Public] / libwww / Library / src

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

AltStyle によって変換されたページ (->オリジナル) /