Annotation of libwww/Library/src/HTMemLog.c, revision 2.5

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.5     ! eric        6: **     @(#) $Id: HTMemLog.c,v 2.4 1996/12/05 23:20:06 eric 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"
                     15: 
2.2       eric       16: PRIVATE size_t         LogBuffSize = 1024; /* default size is 1k */
                     17: PRIVATE int            LogFd = 2;
                     18: PRIVATE const char *   LogName = NULL;
                     19: PRIVATE char *         LogBuff  = NULL;
                     20: PRIVATE size_t         LogLen = 0;
                     21: PRIVATE BOOL           KeepOpen = YES;
2.1       frystyk    22: 
2.2       eric       23: PUBLIC int HTMemLog_open (const char * logName, const size_t size, BOOL keepOpen)
2.1       frystyk    24: {
                     25: #ifdef USE_SYSLOG
2.2       eric       26:     openlog(LogName, LOG_NDELAY, LOG_USER);
2.1       frystyk    27: #else /* USE_SYSLOG */
2.2       eric       28:     LogName = logName;
                     29:     KeepOpen = keepOpen;
                     30:     if ((LogFd = open(LogName, O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1)
2.1       frystyk    31:        return HT_ERROR;
2.2       eric       32:     if (!KeepOpen)
                     33:        close(LogFd);
2.1       frystyk    34:     LogBuffSize = size;
                     35:     if ((LogBuff = (char *) HT_MALLOC(size)) == NULL)
                     36:        HT_OUTOFMEM("HTMemLog_open");
                     37:     LogLen = 0;
                     38: #endif /* !USE_SYSLOG */
                     39:     return HT_OK;
                     40: }
                     41: 
2.4       eric       42: PUBLIC int HTMemLog_flush(void)
2.1       frystyk    43: {
2.4       eric       44:     if (LogLen) {
                     45:        if (!KeepOpen)
                     46:            if ((LogFd = open(LogName, O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1)
                     47:                return HT_ERROR;
                     48:        write(LogFd, LogBuff, LogLen);
                     49:        LogLen = 0;
                     50:     }
2.2       eric       51:     if (!KeepOpen)
                     52:        close(LogFd);
2.1       frystyk    53:     return HT_OK;
                     54: }
                     55: 
2.5     ! eric       56: PUBLIC int HTMemLog_add(char * buf, size_t len)
2.1       frystyk    57: {
2.3       frystyk    58:     if (LogBuff) {
                     59:        /*
                     60:        **      Dump everything that won't fit in buffer
                     61:        */
                     62:        while (len + LogLen > LogBuffSize) {
                     63:            size_t toWrite = LogBuffSize-LogLen;
                     64:            memcpy(LogBuff+LogLen, buf, toWrite);
                     65:            LogLen = LogBuffSize;       /* same as += toWrite */
                     66:            HTMemLog_flush();
                     67:            buf += toWrite;
                     68:            len -= toWrite;
                     69:        }
                     70:        memcpy(LogBuff+LogLen, buf, len);
                     71:        LogLen += len;
                     72:        return HT_OK;
2.1       frystyk    73:     }
2.3       frystyk    74:     return HT_ERROR;
2.1       frystyk    75: }
                     76: 
                     77: PRIVATE int HTMemLog_adjustGMT(long theTime)
                     78: {
                     79:     static long adjustment = -1;
                     80:     if (adjustment == -1) {
                     81:         tzset();
                     82:         adjustment = timezone;
                     83:     }
                     84:     return theTime-adjustment;
                     85: }
                     86: 
                     87: PRIVATE int HTMemLog_addTime(void)
                     88: {
                     89:     char buff[20];
                     90:     int len;
                     91:     struct timeval tp;
2.5     ! eric       92: #ifdef WWW_MSWINDOWS
        !            93:     return GetTickCount();
        !            94: #else /* WWW_MSWINDOWS */
2.1       frystyk    95:     struct timezone tz = {300, DST_USA};
                     96: 
                     97:     gettimeofday(&tp, &tz);
                     98:     tp.tv_sec = HTMemLog_adjustGMT(tp.tv_sec)%(24*60*60);
2.2       eric       99:     len = sprintf(buff, "%02d:%02d:%02d.%d", tp.tv_sec/3600, (tp.tv_sec%3600)/60, tp.tv_sec%60, tp.tv_usec);
2.1       frystyk   100:     HTMemLog_add(buff, len);
                    101:     return tp.tv_sec;
2.5     ! eric      102: #endif /* !WWW_MSWINDOWS */
2.1       frystyk   103: }
                    104: 
                    105: PUBLIC void HTMemLog_close (void)
                    106: {
                    107: #ifdef USE_SYSLOG
                    108:     closelog();
                    109: #else /* USE_SYSLOG */
2.4       eric      110:     HTMemLog_flush();
2.2       eric      111:     if (LogFd > 2)
                    112:        close(LogFd);
2.1       frystyk   113:     if (LogBuff != NULL)
                    114:        HT_FREE(LogBuff);
                    115: #endif /* !USE_SYSLOG */
                    116: }
                    117: 
2.2       eric      118: #ifdef USE_SYSLOG
                    119: #define PRINT_BUFF_SIZE        8200
                    120: #else /* USE_SYSLOG */
                    121: #define PRINT_BUFF_SIZE        200
                    122: #endif /* !USE_SYSLOG */
                    123: 
2.1       frystyk   124: PUBLIC int HTMemLog_callback (const char * data, const size_t len, const char * fmt, va_list pArgs)
                    125: {
2.2       eric      126:     char buff[PRINT_BUFF_SIZE];
2.1       frystyk   127:     int ret;
2.2       eric      128: #ifdef USE_SYSLOG
2.1       frystyk   129:     ret = vsprintf(buff, fmt, pArgs);
                    130:     syslog(LOG_DEBUG, "%s\n", buff);
                    131:     if (len > 8192)
                    132:        len = 8192;
                    133:     strncpy(buff, data, len);
                    134:     buff[len] = 0;
                    135:     syslog(LOG_DEBUG, "%s\n", buff);
                    136: #else /* USE_SYSLOG */
                    137:     HTMemLog_addTime();
2.2       eric      138: 
                    139:     ret = sprintf(buff, " %d ", len);
2.1       frystyk   140:     HTMemLog_add(buff, ret);
2.2       eric      141: 
                    142:     if (fmt) {
                    143:       ret = vsprintf(buff, fmt, pArgs);
                    144:       HTMemLog_add(buff, ret);
                    145:     }
2.1       frystyk   146:     HTMemLog_add("\n", 1);
2.2       eric      147: 
2.1       frystyk   148:     HTMemLog_add(data, len);
2.2       eric      149:     HTMemLog_add("\n", 1);
2.1       frystyk   150: #endif /* !USE_SYSLOG */
                    151:     return ret;
                    152: }
                    153: 

Webmaster