[BACK]Return to message.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / rdist

Annotation of src/usr.bin/rdist/message.c, Revision 1.1

1.1     ! dm          1: /*
        !             2:  * Copyright (c) 1983 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms, with or without
        !             6:  * modification, are permitted provided that the following conditions
        !             7:  * are met:
        !             8:  * 1. Redistributions of source code must retain the above copyright
        !             9:  *    notice, this list of conditions and the following disclaimer.
        !            10:  * 2. Redistributions in binary form must reproduce the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer in the
        !            12:  *    documentation and/or other materials provided with the distribution.
        !            13:  * 3. All advertising materials mentioning features or use of this software
        !            14:  *    must display the following acknowledgement:
        !            15:  *     This product includes software developed by the University of
        !            16:  *     California, Berkeley and its contributors.
        !            17:  * 4. Neither the name of the University nor the names of its contributors
        !            18:  *    may be used to endorse or promote products derived from this software
        !            19:  *    without specific prior written permission.
        !            20:  *
        !            21:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            31:  * SUCH DAMAGE.
        !            32:  */
        !            33:
        !            34: #ifndef lint
        !            35: static char RCSid[] =
        !            36: "$Id: message.c,v 6.22 1995/12/11 23:37:35 mcooper Exp $";
        !            37:
        !            38: static char sccsid[] = "@(#)common.c";
        !            39:
        !            40: static char copyright[] =
        !            41: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
        !            42:  All rights reserved.\n";
        !            43: #endif /* !lint */
        !            44:
        !            45: /*
        !            46:  * Message handling functions for both rdist and rdistd.
        !            47:  */
        !            48:
        !            49: #include "defs.h"
        !            50:
        !            51: #define MSGBUFSIZ      32*1024
        !            52:
        !            53: int                    debug = 0;              /* Debugging level */
        !            54: int                    nerrs = 0;              /* Number of errors */
        !            55: char                  *tempfile = NULL;        /* Name of temporary file */
        !            56:
        !            57: /*
        !            58:  * Message Types
        !            59:  */
        !            60: MSGTYPE msgtypes[] = {
        !            61:        { MT_CHANGE,    "change" },
        !            62:        { MT_INFO,      "info" },
        !            63:        { MT_NOTICE,    "notice" },
        !            64:        { MT_NERROR,    "nerror" },
        !            65:        { MT_FERROR,    "ferror" },
        !            66:        { MT_WARNING,   "warning" },
        !            67:        { MT_VERBOSE,   "verbose" },
        !            68:        { MT_ALL,       "all" },
        !            69:        { MT_DEBUG,     "debug" },
        !            70:        { 0 },
        !            71: };
        !            72:
        !            73: static void msgsendstdout(), msgsendfile(), msgsendsyslog(),
        !            74:        msgsendnotify();
        !            75:
        !            76: /*
        !            77:  * Message Facilities
        !            78:  */
        !            79: MSGFACILITY msgfacility[] = {
        !            80:        { MF_STDOUT,    "stdout",       msgsendstdout },
        !            81:        { MF_FILE,      "file",         msgsendfile },
        !            82:        { MF_SYSLOG,    "syslog",       msgsendsyslog },
        !            83:        { MF_NOTIFY,    "notify",       msgsendnotify },
        !            84:        { 0 },
        !            85: };
        !            86:
        !            87: /*
        !            88:  * Print message logging usage message
        !            89:  */
        !            90: extern void msgprusage()
        !            91: {
        !            92:        register int i, x;
        !            93:
        !            94:        (void) fprintf(stderr, "\nWhere <msgopt> is of form\n");
        !            95:        (void) fprintf(stderr,
        !            96:        "\t<facility1>=<type1>,<type2>,...:<facility2>=<type1>,<type2>...\n");
        !            97:
        !            98:        (void) fprintf(stderr, "Valid <facility> names:");
        !            99:
        !           100:        for (i = 0; msgfacility[i].mf_name; ++i)
        !           101:                (void) fprintf(stderr, " %s", msgfacility[i].mf_name);
        !           102:
        !           103:        (void) fprintf(stderr, "\nValid <type> names:");
        !           104:        for (x = 0; msgtypes[x].mt_name; ++x)
        !           105:                (void) fprintf(stderr, " %s", msgtypes[x].mt_name);
        !           106:
        !           107:        (void) fprintf(stderr, "\n");
        !           108: }
        !           109:
        !           110: /*
        !           111:  * Print enabled message logging info
        !           112:  */
        !           113: extern void msgprconfig()
        !           114: {
        !           115:        register int i, x;
        !           116:        static char buf[MSGBUFSIZ];
        !           117:
        !           118:        debugmsg(DM_MISC, "Current message logging config:");
        !           119:        for (i = 0; msgfacility[i].mf_name; ++i) {
        !           120:                (void) sprintf(buf, "    %s=", msgfacility[i].mf_name);
        !           121:                for (x = 0; msgtypes[x].mt_name; ++x)
        !           122:                        if (IS_ON(msgfacility[i].mf_msgtypes,
        !           123:                                  msgtypes[x].mt_type)) {
        !           124:                                if (x > 0)
        !           125:                                        (void) strcat(buf, ",");
        !           126:                                (void) strcat(buf, msgtypes[x].mt_name);
        !           127:                        }
        !           128:                debugmsg(DM_MISC, "%s", buf);
        !           129:        }
        !           130:
        !           131: }
        !           132:
        !           133: /*
        !           134:  * Get the Message Facility entry "name"
        !           135:  */
        !           136: static MSGFACILITY *getmsgfac(name)
        !           137:        char *name;
        !           138: {
        !           139:        register int i;
        !           140:
        !           141:        for (i = 0; msgfacility[i].mf_name; ++i)
        !           142:                if (strcasecmp(name, msgfacility[i].mf_name) == 0)
        !           143:                        return(&msgfacility[i]);
        !           144:
        !           145:        return((MSGFACILITY *) NULL);
        !           146: }
        !           147:
        !           148: /*
        !           149:  * Get the Message Type entry named "name"
        !           150:  */
        !           151: static MSGTYPE *getmsgtype(name)
        !           152:        char *name;
        !           153: {
        !           154:        register int i;
        !           155:
        !           156:        for (i = 0; msgtypes[i].mt_name; ++i)
        !           157:                if (strcasecmp(name, msgtypes[i].mt_name) == 0)
        !           158:                        return(&msgtypes[i]);
        !           159:
        !           160:        return((MSGTYPE *) NULL);
        !           161: }
        !           162:
        !           163: /*
        !           164:  * Set Message Type information for Message Facility "msgfac" as
        !           165:  * indicated by string "str".
        !           166:  */
        !           167: static char *setmsgtypes(msgfac, str)
        !           168:        MSGFACILITY *msgfac;
        !           169:        char *str;
        !           170: {
        !           171:        static char ebuf[BUFSIZ];
        !           172:        register char *cp;
        !           173:        register char *strptr, *word;
        !           174:        register MSGTYPE *mtp;
        !           175:
        !           176:        /*
        !           177:         * MF_SYSLOG is the only supported message facility for the server
        !           178:         */
        !           179:        if (isserver && (msgfac->mf_msgfac != MF_SYSLOG &&
        !           180:                         msgfac->mf_msgfac != MF_FILE)) {
        !           181:                (void) sprintf(ebuf,
        !           182:                "The \"%s\" message facility cannot be used by the server.",
        !           183:                               msgfac->mf_name);
        !           184:                return(ebuf);
        !           185:        }
        !           186:
        !           187:        strptr = str;
        !           188:
        !           189:        /*
        !           190:         * Do any necessary Message Facility preparation
        !           191:         */
        !           192:        switch(msgfac->mf_msgfac) {
        !           193:        case MF_FILE:
        !           194:                /*
        !           195:                 * The MF_FILE string should look like "<file>=<types>".
        !           196:                 */
        !           197:                if ((cp = strchr(strptr, '=')) == NULL)
        !           198:                        return(
        !           199:                           "No file name found for \"file\" message facility");
        !           200:                *cp++ = CNULL;
        !           201:
        !           202:                if ((msgfac->mf_fptr = fopen(strptr, "w")) == NULL)
        !           203:                        fatalerr("Cannot open log file for writing: %s: %s.",
        !           204:                                 strptr, SYSERR);
        !           205:                msgfac->mf_filename = strdup(strptr);
        !           206:
        !           207:                strptr = cp;
        !           208:                break;
        !           209:
        !           210:        case MF_NOTIFY:
        !           211:                break;
        !           212:
        !           213:        case MF_STDOUT:
        !           214:                msgfac->mf_fptr = stdout;
        !           215:                break;
        !           216:
        !           217:        case MF_SYSLOG:
        !           218: #if defined(LOG_OPTS)
        !           219: #if    defined(LOG_FACILITY)
        !           220:                openlog(progname, LOG_OPTS, LOG_FACILITY);
        !           221: #else
        !           222:                openlog(progname, LOG_OPTS);
        !           223: #endif /* LOG_FACILITY */
        !           224: #endif /* LOG_OPTS */
        !           225:                break;
        !           226:        }
        !           227:
        !           228:        /*
        !           229:         * Parse each type word
        !           230:         */
        !           231:        msgfac->mf_msgtypes = 0;        /* Start from scratch */
        !           232:        while (strptr) {
        !           233:                word = strptr;
        !           234:                if (cp = strchr(strptr, ','))
        !           235:                        *cp++ = CNULL;
        !           236:                strptr = cp;
        !           237:
        !           238:                if (mtp = getmsgtype(word)) {
        !           239:                        msgfac->mf_msgtypes |= mtp->mt_type;
        !           240:                        /*
        !           241:                         * XXX This is really a kludge until we add real
        !           242:                         * control over debugging.
        !           243:                         */
        !           244:                        if (!debug && isserver &&
        !           245:                            strcasecmp(word, "debug") == 0)
        !           246:                                debug = DM_ALL;
        !           247:                } else {
        !           248:                        (void) sprintf(ebuf, "Message type \"%s\" is invalid.",
        !           249:                                       word);
        !           250:                        return(ebuf);
        !           251:                }
        !           252:        }
        !           253:
        !           254:        return((char *) NULL);
        !           255: }
        !           256:
        !           257: /*
        !           258:  * Parse a message logging option string
        !           259:  */
        !           260: extern char *msgparseopts(msgstr, doset)
        !           261:        char *msgstr;
        !           262:        int doset;
        !           263: {
        !           264:        static char ebuf[BUFSIZ], msgbuf[MSGBUFSIZ];
        !           265:        register char *cp, *optstr;
        !           266:        register char *word;
        !           267:        MSGFACILITY *msgfac;
        !           268:
        !           269:        if (msgstr == NULL)
        !           270:                return("NULL message string");
        !           271:
        !           272:        /* strtok() is harmful */
        !           273:        (void) strcpy(msgbuf, msgstr);
        !           274:
        !           275:        /*
        !           276:         * Each <facility>=<types> list is seperated by ":".
        !           277:         */
        !           278:        for (optstr = strtok(msgbuf, ":"); optstr;
        !           279:             optstr = strtok((char *)NULL, ":")) {
        !           280:
        !           281:                if ((cp = strchr(optstr, '=')) == NULL)
        !           282:                        return("No '=' found");
        !           283:
        !           284:                *cp++ = CNULL;
        !           285:                word = optstr;
        !           286:                if ((int)strlen(word) <= 0)
        !           287:                        return("No message facility specified");
        !           288:                if ((int)strlen(cp) <= 0)
        !           289:                        return("No message type specified");
        !           290:
        !           291:                if ((msgfac = getmsgfac(word)) == NULL) {
        !           292:                        (void) sprintf(ebuf,
        !           293:                                       "%s is not a valid message facility",
        !           294:                                       word);
        !           295:                        return(ebuf);
        !           296:                }
        !           297:
        !           298:                if (doset) {
        !           299:                        char *mcp;
        !           300:
        !           301:                        if (mcp = setmsgtypes(msgfac, cp))
        !           302:                                return(mcp);
        !           303:                }
        !           304:        }
        !           305:
        !           306:        if (isserver && debug) {
        !           307:                debugmsg(DM_MISC, "%s", getversion());
        !           308:                msgprconfig();
        !           309:        }
        !           310:
        !           311:        return((char *) NULL);
        !           312: }
        !           313:
        !           314: /*
        !           315:  * Send a message to facility "stdout".
        !           316:  * For rdistd, this is really the rdist client.
        !           317:  */
        !           318: static void msgsendstdout(msgfac, mtype, flags, msgbuf)
        !           319:        /*ARGSUSED*/
        !           320:        MSGFACILITY *msgfac;
        !           321:        int mtype;
        !           322:        int flags;
        !           323:        char *msgbuf;
        !           324: {
        !           325:        char cmd;
        !           326:
        !           327:        if (isserver) {
        !           328:                if (rem_w < 0 || IS_ON(flags, MT_NOREMOTE))
        !           329:                        return;
        !           330:
        !           331:                cmd = CNULL;
        !           332:
        !           333:                switch(mtype) {
        !           334:                case MT_NERROR:         cmd = C_ERRMSG;         break;
        !           335:                case MT_FERROR:         cmd = C_FERRMSG;        break;
        !           336:                case MT_NOTICE:         cmd = C_NOTEMSG;        break;
        !           337:                case MT_REMOTE:         cmd = C_LOGMSG;         break;
        !           338:                }
        !           339:
        !           340:                if (cmd != CNULL)
        !           341:                        (void) sendcmd(cmd, "%s", msgbuf);
        !           342:        } else {
        !           343:                switch(mtype) {
        !           344:                case MT_FERROR:
        !           345:                case MT_NERROR:
        !           346:                        if (msgbuf && *msgbuf) {
        !           347:                                (void) fprintf(stderr, "%s\n", msgbuf);
        !           348:                                (void) fflush(stderr);
        !           349:                        }
        !           350:                        break;
        !           351:
        !           352:                case MT_DEBUG:
        !           353:                        /*
        !           354:                         * Only things that are strictly MT_DEBUG should
        !           355:                         * be shown.
        !           356:                         */
        !           357:                        if (flags != MT_DEBUG)
        !           358:                                return;
        !           359:                case MT_NOTICE:
        !           360:                case MT_CHANGE:
        !           361:                case MT_INFO:
        !           362:                case MT_VERBOSE:
        !           363:                case MT_WARNING:
        !           364:                        if (msgbuf && *msgbuf) {
        !           365:                                (void) printf("%s\n", msgbuf);
        !           366:                                (void) fflush(stdout);
        !           367:                        }
        !           368:                        break;
        !           369:                }
        !           370:        }
        !           371: }
        !           372:
        !           373: /*
        !           374:  * Send a message to facility "syslog"
        !           375:  */
        !           376: static void msgsendsyslog(msgfac, mtype, flags, msgbuf)
        !           377:        /*ARGSUSED*/
        !           378:        MSGFACILITY *msgfac;
        !           379:        int mtype;
        !           380:        int flags;
        !           381:        char *msgbuf;
        !           382: {
        !           383:        int syslvl = 0;
        !           384:
        !           385:        if (!msgbuf || !*msgbuf)
        !           386:                return;
        !           387:
        !           388:        switch(mtype) {
        !           389: #if    defined(SL_NERROR)
        !           390:        case MT_NERROR:         syslvl = SL_NERROR;     break;
        !           391: #endif
        !           392: #if    defined(SL_FERROR)
        !           393:        case MT_FERROR:         syslvl = SL_FERROR;     break;
        !           394: #endif
        !           395: #if    defined(SL_WARNING)
        !           396:        case MT_WARNING:        syslvl = SL_WARNING;    break;
        !           397: #endif
        !           398: #if    defined(SL_CHANGE)
        !           399:        case MT_CHANGE:         syslvl = SL_CHANGE;     break;
        !           400: #endif
        !           401: #if    defined(SL_INFO)
        !           402:        case MT_SYSLOG:
        !           403:        case MT_VERBOSE:
        !           404:        case MT_INFO:           syslvl = SL_INFO;       break;
        !           405: #endif
        !           406: #if    defined(SL_NOTICE)
        !           407:        case MT_NOTICE:         syslvl = SL_NOTICE;     break;
        !           408: #endif
        !           409: #if    defined(SL_DEBUG)
        !           410:        case MT_DEBUG:          syslvl = SL_DEBUG;      break;
        !           411: #endif
        !           412:        }
        !           413:
        !           414:        if (syslvl)
        !           415:                syslog(syslvl, "%s", msgbuf);
        !           416: }
        !           417:
        !           418: /*
        !           419:  * Send a message to a "file" facility.
        !           420:  */
        !           421: static void msgsendfile(msgfac, mtype, flags, msgbuf)
        !           422:        /*ARGSUSED*/
        !           423:        MSGFACILITY *msgfac;
        !           424:        int mtype;
        !           425:        int flags;
        !           426:        char *msgbuf;
        !           427: {
        !           428:        if (msgfac->mf_fptr == NULL)
        !           429:                return;
        !           430:
        !           431:        if (!msgbuf || !*msgbuf)
        !           432:                return;
        !           433:
        !           434:        (void) fprintf(msgfac->mf_fptr, "%s\n", msgbuf);
        !           435:        (void) fflush(msgfac->mf_fptr);
        !           436: }
        !           437:
        !           438: /*
        !           439:  * Same method as msgsendfile()
        !           440:  */
        !           441: static void msgsendnotify(msgfac, mtype, flags, msgbuf)
        !           442:        /*ARGSUSED*/
        !           443:        MSGFACILITY *msgfac;
        !           444:        int mtype;
        !           445:        int flags;
        !           446:        char *msgbuf;
        !           447: {
        !           448:        if (IS_ON(flags, MT_DEBUG))
        !           449:                return;
        !           450:
        !           451:        if (!msgbuf || !*msgbuf)
        !           452:                return;
        !           453:
        !           454:        if (!msgfac->mf_fptr) {
        !           455:                register char *cp;
        !           456:                char *getenv();
        !           457:
        !           458:                /*
        !           459:                 * Create and open a new temporary file
        !           460:                 */
        !           461:                if ((cp = getenv("TMPDIR")) == (char *) NULL)
        !           462:                        cp = _PATH_TMP;
        !           463:                tempfile = (char *) xmalloc(strlen(cp) + 1 +
        !           464:                                            strlen(_RDIST_TMP) + 2);
        !           465:                (void) sprintf(tempfile, "%s/%s", cp, _RDIST_TMP);
        !           466:
        !           467:                msgfac->mf_filename = tempfile;
        !           468:                (void) mktemp(msgfac->mf_filename);
        !           469:                if ((msgfac->mf_fptr = fopen(msgfac->mf_filename, "w"))==NULL)
        !           470:                        fatalerr("Cannot open notify file for writing: %s: %s.",
        !           471:                              msgfac->mf_filename, SYSERR);
        !           472:                debugmsg(DM_MISC, "Created notify temp file '%s'",
        !           473:                         msgfac->mf_filename);
        !           474:        }
        !           475:
        !           476:        if (msgfac->mf_fptr == NULL)
        !           477:                return;
        !           478:
        !           479:        (void) fprintf(msgfac->mf_fptr, "%s\n", msgbuf);
        !           480:        (void) fflush(msgfac->mf_fptr);
        !           481: }
        !           482:
        !           483: /*
        !           484:  * Insure currenthost is set to something reasonable.
        !           485:  */
        !           486: extern void checkhostname()
        !           487: {
        !           488:        static char mbuf[MAXHOSTNAMELEN];
        !           489:        char *cp;
        !           490:
        !           491:        if (!currenthost) {
        !           492:                if (gethostname(mbuf, sizeof(mbuf)) == 0) {
        !           493:                        if ((cp = strchr(mbuf, '.')) != NULL)
        !           494:                                *cp = CNULL;
        !           495:                        currenthost = strdup(mbuf);
        !           496:                } else
        !           497:                        currenthost = "(unknown)";
        !           498:        }
        !           499: }
        !           500:
        !           501: /*
        !           502:  * Print a message contained in "msgbuf" if a level "lvl" is set.
        !           503:  */
        !           504: static void _message(flags, msgbuf)
        !           505:        int flags;
        !           506:        char *msgbuf;
        !           507: {
        !           508:        register int i, x;
        !           509:        register char *cp;
        !           510:        static char mbuf[2048];
        !           511:
        !           512:        if (msgbuf && *msgbuf) {
        !           513:                /*
        !           514:                 * Ensure no stray newlines are present
        !           515:                 */
        !           516:                if (cp = strchr(msgbuf, '\n'))
        !           517:                        *cp = CNULL;
        !           518:
        !           519:                checkhostname();
        !           520:                if (strncmp(currenthost, msgbuf, strlen(currenthost)) == 0)
        !           521:                        (void) strcpy(mbuf, msgbuf);
        !           522:                else
        !           523:                        (void) sprintf(mbuf, "%s: %s", currenthost, msgbuf);
        !           524:        } else
        !           525:                (void) strcpy(mbuf, "");
        !           526:
        !           527:        /*
        !           528:         * Special case for messages that only get
        !           529:         * logged to the system log facility
        !           530:         */
        !           531:        if (IS_ON(flags, MT_SYSLOG)) {
        !           532:                msgsendsyslog((MSGFACILITY *)NULL, MT_SYSLOG, flags, mbuf);
        !           533:                return;
        !           534:        }
        !           535:
        !           536:        /*
        !           537:         * Special cases
        !           538:         */
        !           539:        if (isserver && IS_ON(flags, MT_REMOTE))
        !           540:                msgsendstdout((MSGFACILITY *)NULL, MT_REMOTE, flags, mbuf);
        !           541:        else if (isserver && IS_ON(flags, MT_NERROR))
        !           542:                msgsendstdout((MSGFACILITY *)NULL, MT_NERROR, flags, mbuf);
        !           543:        else if (isserver && IS_ON(flags, MT_FERROR))
        !           544:                msgsendstdout((MSGFACILITY *)NULL, MT_FERROR, flags, mbuf);
        !           545:        else if (isserver && IS_ON(flags, MT_NOTICE)) {
        !           546:                msgsendstdout((MSGFACILITY *)NULL, MT_NOTICE, flags, mbuf);
        !           547:                return;
        !           548:        }
        !           549:
        !           550:        /*
        !           551:         * For each Message Facility, check each Message Type to see
        !           552:         * if the bits in "flags" are set.  If so, call the appropriate
        !           553:         * Message Facility to dispatch the message.
        !           554:         */
        !           555:        for (i = 0; msgfacility[i].mf_name; ++i)
        !           556:                for (x = 0; msgtypes[x].mt_name; ++x)
        !           557:                        /*
        !           558:                         * XXX MT_ALL should not be used directly
        !           559:                         */
        !           560:                        if (msgtypes[x].mt_type != MT_ALL &&
        !           561:                            IS_ON(flags, msgtypes[x].mt_type) &&
        !           562:                            IS_ON(msgfacility[i].mf_msgtypes,
        !           563:                                  msgtypes[x].mt_type))
        !           564:                                (*msgfacility[i].mf_sendfunc)(&msgfacility[i],
        !           565:                                                           msgtypes[x].mt_type,
        !           566:                                                              flags,
        !           567:                                                              mbuf);
        !           568: }
        !           569:
        !           570: #if    defined(ARG_TYPE) && ARG_TYPE == ARG_VARARGS
        !           571: /*
        !           572:  * Varargs front-end to _message()
        !           573:  */
        !           574: extern void message(va_alist)
        !           575:        va_dcl
        !           576: {
        !           577:        static char buf[MSGBUFSIZ];
        !           578:        va_list args;
        !           579:        char *fmt;
        !           580:        int lvl;
        !           581:
        !           582:        va_start(args);
        !           583:        lvl = (int) va_arg(args, int);
        !           584:        fmt = (char *) va_arg(args, char *);
        !           585:        va_end(args);
        !           586:
        !           587:        (void) vsprintf(buf, fmt, args);
        !           588:
        !           589:        _message(lvl, buf);
        !           590: }
        !           591: #endif /* ARG_VARARGS */
        !           592:
        !           593: #if    defined(ARG_TYPE) && ARG_TYPE == ARG_STDARG
        !           594: /*
        !           595:  * Stdarg front-end to _message()
        !           596:  */
        !           597: extern void message(int lvl, char *fmt, ...)
        !           598: {
        !           599:        static char buf[MSGBUFSIZ];
        !           600:        va_list args;
        !           601:
        !           602:        va_start(args, fmt);
        !           603:        (void) vsprintf(buf, fmt, args);
        !           604:        va_end(args);
        !           605:
        !           606:        _message(lvl, buf);
        !           607: }
        !           608: #endif /* ARG_STDARG */
        !           609:
        !           610:
        !           611: #if    !defined(ARG_TYPE)
        !           612: /*
        !           613:  * Simple front-end to _message()
        !           614:  */
        !           615: /*VARARGS2*/
        !           616: extern void message(lvl, fmt, a1, a2, a3, a4, a5)
        !           617:        int lvl;
        !           618:        char *fmt;
        !           619: {
        !           620:        static char buf[MSGBUFSIZ];
        !           621:
        !           622:        (void) sprintf(buf, fmt, a1, a2, a3, a4, a5);
        !           623:
        !           624:        _message(lvl, buf);
        !           625: }
        !           626: #endif /* !ARG_TYPE */
        !           627:
        !           628: /*
        !           629:  * Display a debugging message
        !           630:  */
        !           631: static void _debugmsg(lvl, buf)
        !           632:        int lvl;
        !           633:        char *buf;
        !           634: {
        !           635:        if (IS_ON(debug, lvl))
        !           636:                _message(MT_DEBUG, buf);
        !           637: }
        !           638:
        !           639: #if    defined(ARG_TYPE) && ARG_TYPE == ARG_VARARGS
        !           640: /*
        !           641:  * Varargs front-end to _debugmsg()
        !           642:  */
        !           643: extern void debugmsg(va_alist)
        !           644:        va_dcl
        !           645: {
        !           646:        static char buf[MSGBUFSIZ];
        !           647:        va_list args;
        !           648:        char *fmt;
        !           649:        int lvl;
        !           650:
        !           651:        va_start(args);
        !           652:        lvl = (int) va_arg(args, int);
        !           653:        fmt = (char *) va_arg(args, char *);
        !           654:        va_end(args);
        !           655:
        !           656:        (void) vsprintf(buf, fmt, args);
        !           657:
        !           658:        _debugmsg(lvl, buf);
        !           659: }
        !           660: #endif /* ARG_VARARGS */
        !           661:
        !           662: #if    defined(ARG_TYPE) && ARG_TYPE == ARG_STDARG
        !           663: /*
        !           664:  * Stdarg front-end to _debugmsg()
        !           665:  */
        !           666: extern void debugmsg(int lvl, char *fmt, ...)
        !           667: {
        !           668:        static char buf[MSGBUFSIZ];
        !           669:        va_list args;
        !           670:
        !           671:        va_start(args, fmt);
        !           672:        (void) vsprintf(buf, fmt, args);
        !           673:        va_end(args);
        !           674:
        !           675:        _debugmsg(lvl, buf);
        !           676: }
        !           677: #endif /* ARG_STDARG */
        !           678:
        !           679: #if    !defined(ARG_TYPE)
        !           680: /*
        !           681:  * Simple front-end to _debugmsg()
        !           682:  */
        !           683: /*VARARGS2*/
        !           684: extern void debugmsg(lvl, fmt, a1, a2, a3, a4, a5)
        !           685:        int lvl;
        !           686:        char *fmt;
        !           687: {
        !           688:        static char buf[MSGBUFSIZ];
        !           689:
        !           690:        (void) sprintf(buf, fmt, a1, a2, a3, a4, a5);
        !           691:
        !           692:        _debugmsg(lvl, buf);
        !           693: }
        !           694: #endif /* ARG_TYPE */
        !           695:
        !           696: /*
        !           697:  * Print an error message
        !           698:  */
        !           699: static void _error(msg)
        !           700:        char *msg;
        !           701: {
        !           702:        static char buf[MSGBUFSIZ];
        !           703:
        !           704:        nerrs++;
        !           705:        buf[0] = CNULL;
        !           706:
        !           707:        if (msg) {
        !           708:                if (isserver)
        !           709:                        (void) sprintf(buf, "REMOTE ERROR: %s", msg);
        !           710:                else
        !           711:                        (void) sprintf(buf, "LOCAL ERROR: %s", msg);
        !           712:        }
        !           713:
        !           714:        _message(MT_NERROR, (buf[0]) ? buf : NULL);
        !           715: }
        !           716:
        !           717: #if    defined(ARG_TYPE) && ARG_TYPE == ARG_VARARGS
        !           718: /*
        !           719:  * Varargs frontend to _error()
        !           720:  */
        !           721: extern void error(va_alist)
        !           722:        va_dcl
        !           723: {
        !           724:        static char buf[MSGBUFSIZ];
        !           725:        va_list args;
        !           726:        char *fmt;
        !           727:
        !           728:        buf[0] = CNULL;
        !           729:        va_start(args);
        !           730:        fmt = (char *) va_arg(args, char *);
        !           731:        if (fmt)
        !           732:                (void) vsprintf(buf, fmt, args);
        !           733:        va_end(args);
        !           734:
        !           735:        _error((buf[0]) ? buf : NULL);
        !           736: }
        !           737: #endif /* ARG_VARARGS */
        !           738:
        !           739: #if    defined(ARG_TYPE) && ARG_TYPE == ARG_STDARG
        !           740: /*
        !           741:  * Stdarg frontend to _error()
        !           742:  */
        !           743: extern void error(char *fmt, ...)
        !           744: {
        !           745:        static char buf[MSGBUFSIZ];
        !           746:        va_list args;
        !           747:
        !           748:        buf[0] = CNULL;
        !           749:        va_start(args, fmt);
        !           750:        if (fmt)
        !           751:                (void) vsprintf(buf, fmt, args);
        !           752:        va_end(args);
        !           753:
        !           754:        _error((buf[0]) ? buf : NULL);
        !           755: }
        !           756: #endif /* ARG_STDARG */
        !           757:
        !           758: #if    !defined(ARG_TYPE)
        !           759: /*
        !           760:  * Simple frontend to _error()
        !           761:  */
        !           762: /*VARARGS1*/
        !           763: extern void error(fmt, a1, a2, a3, a4, a5, a6)
        !           764:        char *fmt;
        !           765: {
        !           766:        static char buf[MSGBUFSIZ];
        !           767:
        !           768:        buf[0] = CNULL;
        !           769:        if (fmt)
        !           770:                (void) sprintf(buf, fmt, a1, a2, a3, a4, a5, a6);
        !           771:
        !           772:        _error((buf[0]) ? buf : NULL);
        !           773: }
        !           774: #endif /* ARG_TYPE */
        !           775:
        !           776: /*
        !           777:  * Display a fatal message
        !           778:  */
        !           779: static void _fatalerr(msg)
        !           780:        char *msg;
        !           781: {
        !           782:        static char buf[MSGBUFSIZ];
        !           783:
        !           784:        ++nerrs;
        !           785:
        !           786:        if (isserver)
        !           787:                (void) sprintf(buf, "REMOTE ERROR: %s", msg);
        !           788:        else
        !           789:                (void) sprintf(buf, "LOCAL ERROR: %s", msg);
        !           790:
        !           791:        _message(MT_FERROR, buf);
        !           792:
        !           793:        exit(nerrs);
        !           794: }
        !           795:
        !           796: #if    defined(ARG_TYPE) && ARG_TYPE == ARG_VARARGS
        !           797: /*
        !           798:  * Varargs front-end to _fatalerr()
        !           799:  */
        !           800: extern void fatalerr(va_alist)
        !           801:        va_dcl
        !           802: {
        !           803:        static char buf[MSGBUFSIZ];
        !           804:        va_list args;
        !           805:        char *fmt;
        !           806:
        !           807:        va_start(args);
        !           808:        fmt = (char *) va_arg(args, char *);
        !           809:        (void) vsprintf(buf, fmt, args);
        !           810:        va_end(args);
        !           811:
        !           812:        _fatalerr(buf);
        !           813: }
        !           814: #endif /* ARG_VARARGS */
        !           815:
        !           816: #if    defined(ARG_TYPE) && ARG_TYPE == ARG_STDARG
        !           817: /*
        !           818:  * Stdarg front-end to _fatalerr()
        !           819:  */
        !           820: extern void fatalerr(char *fmt, ...)
        !           821: {
        !           822:        static char buf[MSGBUFSIZ];
        !           823:        va_list args;
        !           824:
        !           825:        va_start(args, fmt);
        !           826:        (void) vsprintf(buf, fmt, args);
        !           827:        va_end(args);
        !           828:
        !           829:        _fatalerr(buf);
        !           830: }
        !           831: #endif /* ARG_STDARG */
        !           832:
        !           833: #if    !defined(ARG_TYPE)
        !           834: /*
        !           835:  * Simple front-end to _fatalerr()
        !           836:  */
        !           837: /*VARARGS1*/
        !           838: extern void fatalerr(fmt, a1, a2, a3, a4, a5)
        !           839:        char *fmt;
        !           840: {
        !           841:        static char buf[MSGBUFSIZ];
        !           842:
        !           843:        (void) sprintf(buf, fmt, a1, a2, a3, a4, a5);
        !           844:
        !           845:        _fatalerr(buf);
        !           846: }
        !           847: #endif /* !ARG_TYPE */
        !           848:
        !           849: /*
        !           850:  * Get the name of the file used for notify.
        !           851:  * A side effect is that the file pointer to the file
        !           852:  * is closed.  We assume this function is only called when
        !           853:  * we are ready to read the file.
        !           854:  */
        !           855: extern char *getnotifyfile()
        !           856: {
        !           857:        register int i;
        !           858:
        !           859:        for (i = 0; msgfacility[i].mf_name; i++)
        !           860:                if (msgfacility[i].mf_msgfac == MF_NOTIFY &&
        !           861:                    msgfacility[i].mf_fptr) {
        !           862:                        (void) fclose(msgfacility[i].mf_fptr);
        !           863:                        msgfacility[i].mf_fptr = NULL;
        !           864:                        return(msgfacility[i].mf_filename);
        !           865:                }
        !           866:
        !           867:        return((char *) NULL);
        !           868: }