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