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

unix.superglobalmegacorp.com

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