Annotation of sbbs/src/xpdev/xp_syslog.c, revision 1.1.1.1

1.1       root        1: #include <stdarg.h>
                      2: #ifdef __unix__
                      3: #include <syslog.h>
                      4: #endif
                      5: 
                      6: #include "xp_syslog.h"
                      7: #include "sockwrap.h"
                      8: #include "gen_defs.h"
                      9: 
                     10: static SOCKET syslog_sock=INVALID_SOCKET;
                     11: static char log_host[1025]=
                     12: static int log_opts=LOG_CONS;
                     13: #ifdef __unix__
                     14: "";
                     15: #else
                     16: "localhost";
                     17: #endif
                     18: 
                     19: static char syslog_tag[33]="undefined";
                     20: static int default_facility=LOG_USER;
                     21: 
                     22: static u_long resolve_ip(char *addr)
                     23: {
                     24:        HOSTENT*        host;
                     25:        char*           p;
                     26: 
                     27:        if(*addr==0)
                     28:                return((u_long)INADDR_NONE);
                     29: 
                     30:        for(p=addr;*p;p++)
                     31:                if(*p!='.' && !isdigit(*p))
                     32:                        break;
                     33:        if(!(*p))
                     34:                return(inet_addr(addr));
                     35:        if((host=gethostbyname(addr))==NULL)
                     36:                return((u_long)INADDR_NONE);
                     37:        return(*((ulong*)host->h_addr_list[0]));
                     38: }
                     39: 
                     40: void xp_set_loghost(const char *hostname)
                     41: {
                     42:        SAFECOPY(log_host, hostname);
                     43: }
                     44: 
                     45: void xp_openlog(const char *ident, int logopt, int facility)
                     46: {
                     47:        int             sock;
                     48:        SOCKADDR_IN     syslog_addr;
                     49:        socklen_t       syslog_len;
                     50: 
                     51: #ifdef __unix__
                     52:        if(!log_host[0]) {
                     53:                openlog(ident,logopt,facility);
                     54:                return;
                     55:        }
                     56: #endif
                     57: 
                     58:        memset(&syslog_addr, 0, sizeof(syslog_addr));
                     59:        syslog_addr.sin_addr.s_addr=INADDR_ANY;
                     60:        syslog_addr.sin_family=AF_INET;
                     61:        syslog_addr.sin_port=htons(SYSLOG_PORT);
                     62: 
                     63:        syslog_sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
                     64:        if(syslog_sock==INVALID_SOCKET)
                     65:                return;
                     66:        if(bind(syslog_sock, (struct sockaddr *)&syslog_addr, sizeof(syslog_addr))) {
                     67:                syslog_addr.sin_port=0;
                     68:                if(bind(syslog_sock, (struct sockaddr *)&syslog_addr, sizeof(syslog_addr)))
                     69:                        return;
                     70:        }
                     71:        syslog_addr.sin_addr.s_addr=resolve_ip(log_host);
                     72:        syslog_addr.sin_port=htons(SYSLOG_PORT);
                     73:        if(connect(syslog_sock, (struct sockaddr *)&syslog_addr, sizeof(syslog_addr))) {
                     74:                closesocket(syslog_sock);
                     75:                syslog_sock=INVALID_SOCKET;
                     76:                return;
                     77:        }
                     78: 
                     79:        log_opts=logopt;
                     80: 
                     81:        SAFECOPY(syslog_tag, ident);
                     82: }
                     83: 
                     84: void xp_vsyslog(int priority, const char *message, va_list va)
                     85: {
                     86:        int orig_errno=ERROR_VALUE;
                     87:        time_t  now;
                     88:        char    timestr[32];
                     89:        char    msg_to_send[1025];
                     90:        char    format[1025];
                     91:        char    *msg_end;
                     92:        char    *p;
                     93:        int             i;
                     94: 
                     95: #ifdef __unix__
                     96:        if(!log_host[0]) {
                     97:                vsyslog(priority, message, va);
                     98:                return;
                     99:        }
                    100: #endif
                    101: 
                    102:        /* Ensure we can even send this thing */
                    103:        if(syslog_sock==INVALID_SOCKET && !(log_opts & LOG_CONS) && !(log_opts & LOG_PERROR))
                    104:                return;
                    105: 
                    106:        /* Check for valid priority */
                    107:        if(priority & ~(LOG_PRIMASK|LOG_FACMASK)) {
                    108:                i=priority;
                    109:                /* Fix to something legal */
                    110:                priority &= (LOG_PRIMASK|LOG_FACMASK);
                    111:                /* Ooooo... re-entrant! */
                    112:                syslog(priority,"Unknown priority %x",i);
                    113:        }
                    114: 
                    115:        /* Set default facility if needed */
                    116:        if(!(priority & LOG_FACMASK))
                    117:                priority |= default_facility;
                    118: 
                    119:        time(&now);
                    120:        ctime_r(&now, timestr);
                    121:        /* Remove trailing \n */
                    122:        timestr[24]=0;
                    123: 
                    124:        snprintf(format, sizeof(format), "<%d>%.15s %.32s: %s", priority, timestr+4 /* Remove day of week */, syslog_tag, message);
                    125:        format[sizeof(format)-1]=0;
                    126:        vsnprintf(msg_to_send, sizeof(msg_to_send), format, va);
                    127:        msg_to_send[sizeof(msg_to_send)-1]=0;
                    128: 
                    129:        /* Clean out invalid chars (as per RFC3164) */
                    130:        msg_end=msg_to_send+sizeof(msg_to_send)-1;
                    131:        for(p=msg_to_send; *p; p++) {
                    132:                if(*p<32) {
                    133:                        i=strlen(p);
                    134:                        memmove(p, p+1, i);
                    135:                        *p='^';
                    136:                        p++;
                    137:                        *p|=0x40;
                    138:                        if(p+i > msg_end)
                    139:                                *msg_end=0;
                    140:                        else
                    141:                                *(p+i)=0;
                    142:                }
                    143:                else if(*p>126)
                    144:                        *p=' ';
                    145:        }
                    146:        if(syslog_sock!=INVALID_SOCKET)
                    147:                sendsocket(syslog_sock, msg_to_send, strlen(msg_to_send));
                    148:        else if(log_opts & LOG_CONS)
                    149:                puts(msg_to_send);
                    150:        if(log_opts & LOG_PERROR) {
                    151:                fputs(stderr,msg_to_send);
                    152:                fputs(stderr,"\n");
                    153:        }
                    154: }
                    155: 
                    156: void xp_syslog(int priority, const char *message, ...)
                    157: {
                    158:        va_list va;
                    159: 
                    160:        va_start(va, message);
                    161:        vsyslog(priority, message, va);
                    162:        va_end(va);
                    163: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.