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: }