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