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