Annotation of 43BSD/usr.lib/sendmail/lib/nsyslog.c, revision 1.1.1.1

1.1       root        1: #include <syslog.h>
                      2: #include <sys/types.h>
                      3: #include <sys/stat.h>
                      4: #include <sgtty.h>
                      5: #ifdef LOG_IPC
                      6: #include <sys/socket.h>
                      7: #include <netinet/in.h>
                      8: #include <netdb.h>
                      9: #endif LOG_IPC
                     10: 
                     11: static char    SccsId[] =      "%W%    %Y%     %G%";
                     12: 
                     13: 
                     14: /*
                     15: **  SYSLOG -- print message on log file
                     16: **
                     17: **     This routine looks a lot like printf, except that it
                     18: **     outputs to the log file instead of the standard output.
                     19: **     Also, it prints the module name in front of lines,
                     20: **     and has some other formatting types (or will sometime).
                     21: **     Also, it adds a newline on the end of messages.
                     22: **
                     23: **     The output of this routine is intended to be read by
                     24: **     /etc/syslog, which will add timestamps.
                     25: **
                     26: **     Parameters:
                     27: **             pri -- the message priority.
                     28: **             fmt -- the format string.
                     29: **             p0 -- the first of many parameters.
                     30: **
                     31: **     Returns:
                     32: **             none
                     33: **
                     34: **     Side Effects:
                     35: **             output to log.
                     36: */
                     37: 
                     38: #define MAXLINE                1000            /* maximum line length */
                     39: #define BUFSLOP                20              /* space to allow for "extra stuff" */
                     40: #define NULL           0               /* manifest */
                     41: 
                     42: static int     SyslogFile      = -1;           /* fd for log */
                     43: static int     SyslogStat      = 0;            /* status bits; see below */
                     44: static char    *SyslogTag      = NULL;         /* tag for each entry */
                     45: static int     SyslogMask      = LOG_DEBUG;    /* lowest priority logged */
                     46: #ifdef LOG_IPC
                     47: static struct sockaddr_in      SyslogAddr;     /* address of syslog daemon */
                     48: static char    *SyslogHost     = LOG_HOST;     /* name of this host */
                     49: #endif LOG_IPC
                     50: 
                     51: syslog(pri, fmt, p0, p1, p2, p3, p4)
                     52:        int pri;
                     53:        char *fmt;
                     54: {
                     55:        char buf[MAXLINE+BUFSLOP];
                     56:        register char *b;
                     57:        char *f;
                     58:        int prec;
                     59:        int len;
                     60:        register char c;
                     61:        register char *p;
                     62:        int i;
                     63:        extern int errno;
                     64:        extern int sys_nerr;
                     65:        extern char *sys_errlist[];
                     66:        extern char *logcvt();
                     67:        char outline[MAXLINE + 1];
                     68: 
                     69:        /* if we have no log, open it */
                     70:        if (SyslogFile < 0)
                     71:                openlog(0, 0);
                     72: 
                     73:        /* see if we should just throw out this message */
                     74:        if (pri > SyslogMask)
                     75:                return;
                     76: 
                     77:        f = fmt;
                     78: 
                     79:        while (*f != '\0')
                     80:        {
                     81:                /* beginning of line */
                     82:                b = buf;
                     83: 
                     84:                /* insert priority code */
                     85:                if (pri > 0 && (SyslogStat & LOG_COOLIT) == 0)
                     86:                {
                     87:                        *b++ = '<';
                     88:                        *b++ = pri + '0';
                     89:                        *b++ = '>';
                     90:                }
                     91: 
                     92:                /* output current process ID */
                     93:                if ((SyslogStat & LOG_PID) != 0)
                     94:                {
                     95:                        sprintf(b, "%d ", getpid());
                     96:                        b += strlen(b);
                     97:                }
                     98: 
                     99:                /* and module name */
                    100:                if (SyslogTag != 0)
                    101:                {
                    102:                        for (p = SyslogTag; *p != '\0'; )
                    103:                                *b++ = *p++;
                    104:                        *b++ = ':';
                    105:                        *b++ = ' ';
                    106:                }
                    107:                while ((c = *f++) != '\0' && c != '\n')
                    108:                {
                    109:                        /* output character directly if not interpolated */
                    110:                        if (c != '%')
                    111:                        {
                    112:                                *b++ = c;
                    113:                                continue;
                    114:                        }
                    115:                        c = *f++;
                    116:                        switch (c)
                    117:                        {
                    118:                          case 'm':     /* output error code */
                    119:                                if (errno < 0 || errno > sys_nerr)
                    120:                                        sprintf(b, "error %d", errno);
                    121:                                else
                    122:                                        sprintf(b, "%s", sys_errlist[errno]);
                    123:                                break;
                    124: 
                    125:                          default:
                    126:                                *b++ = '%';
                    127:                                *b++ = c;
                    128:                                *b = '\0';
                    129:                                break;
                    130:                        }
                    131:                        b += strlen(b);
                    132:                        if (b >= &buf[MAXLINE])
                    133:                                break;
                    134:                }
                    135:                if (c == '\0')
                    136:                        f--;
                    137: 
                    138:                /* add trailing newline */
                    139:                *b++ = '\n';
                    140:                *b = '\0';
                    141:                
                    142:                /* output string */
                    143:                sprintf(outline, buf, p0, p1, p2, p3, p4);
                    144: #ifdef LOG_IPC
                    145:                if (SyslogStat & LOG_DGRAM)
                    146:                {
                    147:                        register int r;
                    148: 
                    149:                        r = sendto(SyslogFile, outline, strlen(outline), 0,
                    150:                                   &SyslogAddr, sizeof SyslogAddr);
                    151: #ifdef DEBUG
                    152:                        if (r < 0)
                    153:                                perror("syslog: send");
                    154: #endif DEBUG
                    155:                }
                    156:                else
                    157: #endif LOG_IPC
                    158:                        write(SyslogFile, outline, strlen(outline));
                    159:        }
                    160: }
                    161: /*
                    162: **  OPENLOG -- open system log
                    163: **
                    164: **     This happens automatically with reasonable defaults if you
                    165: **     do nothing.
                    166: **
                    167: **     Parameters:
                    168: **             ident -- the name to be printed as a header for
                    169: **                     all messages.
                    170: **             logstat -- a status word, interpreted as follows:
                    171: **                     LOG_PID -- log the pid with each message.
                    172: **
                    173: **     Returns:
                    174: **             0 -- success.
                    175: **             -1 -- failure; logging on /dev/console instead.
                    176: **
                    177: **     Side Effects:
                    178: **             Several global variables get set.
                    179: */
                    180: 
                    181: openlog(ident, logstat)
                    182:        char *ident;
                    183:        int logstat;
                    184: {
                    185:        register int i;
                    186:        register int fd;
                    187:        struct stat st;
                    188: #ifdef LOG_IPC
                    189:        struct servent *sp;
                    190:        struct hostent *hp;
                    191: #endif LOG_IPC
                    192: 
                    193:        SyslogTag = ident;
                    194:        SyslogStat = logstat;
                    195: 
                    196:        if (SyslogFile >= 0)
                    197:                return;
                    198: #ifdef LOG_IPC
                    199:        sp = getservbyname("syslog", "udp");
                    200:        hp = gethostbyname(SyslogHost);
                    201:        if (sp != NULL && hp != NULL)
                    202:        {
                    203:                bzero(&SyslogAddr, sizeof SyslogAddr);
                    204:                SyslogAddr.sin_family = AF_INET;
                    205:                SyslogFile = socket(AF_INET, SOCK_DGRAM, 0, 0);
                    206:                if (SyslogFile >= 0 && bind(SyslogFile, &SyslogAddr, sizeof SyslogAddr, 0) < 0)
                    207:                {
                    208:                        close(SyslogFile);
                    209:                        SyslogFile = -1;
                    210:                }
                    211: #ifdef DEBUG
                    212:                if (SyslogFile < 0)
                    213:                        perror("syslog: socket");
                    214: #endif DEBUG
                    215:                SyslogAddr.sin_port = sp->s_port;
                    216:                bcopy(hp->h_addr, (char *) &SyslogAddr.sin_addr, hp->h_length);
                    217:                SyslogStat |= LOG_DGRAM;
                    218:        }
                    219: #else LOG_IPC
                    220:        SyslogFile = open("/dev/log", 1);
                    221: #endif LOG_IPC
                    222:        if (SyslogFile < 0)
                    223:        {
                    224:          nolog:
                    225:                SyslogStat |= LOG_COOLIT;
                    226:                SyslogStat &= ~LOG_DGRAM;
                    227:                SyslogMask = LOG_CRIT;
                    228:                SyslogFile = open("/dev/console", 1);
                    229:                if (SyslogFile < 0)
                    230:                {
                    231:                        perror("syslog: cannot open /dev/console");
                    232:                        SyslogFile = 2;
                    233:                }
                    234:        }
                    235: #ifndef LOG_IPC
                    236:        if (fstat(SyslogFile, &st) < 0)
                    237:                goto nolog;
                    238:        switch (st.st_mode & S_IFMT)
                    239:        {
                    240:          case S_IFREG:
                    241:          case S_IFDIR:
                    242:                (void) close(SyslogFile);
                    243:                goto nolog;
                    244:        }
                    245: 
                    246: #ifdef FIOCLEX
                    247:        /* have it close automatically on exec */
                    248:        ioctl(SyslogFile, FIOCLEX, NULL);
                    249: #endif FIOCLEX
                    250: #endif LOG_IPC
                    251: }
                    252: /*
                    253: **  CLOSELOG -- close the system log
                    254: **
                    255: **     Parameters:
                    256: **             none.
                    257: **
                    258: **     Returns:
                    259: **             none.
                    260: **
                    261: **     Side Effects:
                    262: **             The system log is closed.
                    263: */
                    264: 
                    265: closelog()
                    266: {
                    267:        (void) close(SyslogFile);
                    268:        SyslogFile = -1;
                    269: }

unix.superglobalmegacorp.com

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