X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/2f4a1cd04229183e06d720caba941d2dc3d120bc..ea0caf4a83b273a8b146ffa0b87e07cb66c8ed3e:/lib/critical.c?ds=sidebyside diff --git a/lib/critical.c b/lib/critical.c index c3502e03..c6971ded 100644 --- a/lib/critical.c +++ b/lib/critical.c @@ -1,107 +1,123 @@ -/* $Header$ +/* $Id$ * * Log and send a zephyrgram about any critical errors. * - * (c) Copyright 1988 by the Massachusetts Institute of Technology. - * For copying and distribution information, please see the file - * . + * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology. + * For copying and distribution information, please see the file + * . */ -/* At Athena, we use zephyr & not syslog. Change the following line - * if necessary */ -#define ZEPHYR +#ifdef HAVE_ZEPHYR +/* need to include before moira.h, which includes krb_et.h, because + zephyr.h is broken */ +#include +/* zephyr.h doesn't prototype this */ +extern Code_t ZSendNotice(ZNotice_t *notice, Z_AuthProc cert_routine); +#endif #include +#include +#include + #include -#include -#ifdef ZEPHYR -#include -#endif -#ifdef SYSLOG +#include +#include +#ifndef HAVE_ZEPHYR #include #endif -#include +#include +RCSID("$Header$"); /* mode to create the file with */ #define LOGFILEMODE 0644 extern char *whoami; +/* This routine sends a class MOIRA zephyrgram of specified instance + * and logs to a special logfile the message passed to it via msg + * and args in printf format. *** It expects the global variable + * whoami to be defined and contain the name of the calling program. + */ -void critical_alert(instance, msg, args) - char *instance; /* Instance for zephyr gram */ - char *msg; /* printf format message */ - /* args = arguements, printf style */ - /* This routine sends a class SMS zephyrgram of specified instance - and logs to a special logfile the message passed to it via msg - and args in printf format. *** It expects the global variable - whoami to be defined and contain the name of the calling program. */ - /* Note: The part of this code that process the variable arguements - was stolen from sprintf(). */ +void critical_alert(char *instance, char *msg, ...) { - FILE _bufstr; /* For _doprnt() */ - FILE *crit; /* FILE for critical log file */ - char buf[BUFSIZ]; /* Holds the formatted message */ - - /* Put the fully formatted message into buf */ - _bufstr._flag = _IOWRT + _IOSTRG; - _bufstr._ptr = buf; - _bufstr._cnt = BUFSIZ; - _doprnt(msg, &args, &_bufstr); - putc('\0', &_bufstr); - - /* Send zephyr notice */ - send_zgram(instance, buf); - - /* Log message to critical file */ - if ((crit = fopen(CRITERRLOG, "a")) != (FILE *)NULL) - { - long t; - char *time_s; + FILE *crit; + char *buf; + va_list ap; + long start; - time(&t); - time_s = ctime(&t) + 4; - time_s[strlen(time_s)-6] = '\0'; - - fprintf(crit, "%s <%d> %s\n", time_s, getpid(), buf); - fclose(crit); + /* Log message to critical file */ + if ((crit = fopen(CRITERRLOG, "a"))) + { + time_t t; + char *time_s; + + time(&t); + time_s = ctime(&t) + 4; + time_s[strlen(time_s) - 6] = '\0'; + + fprintf(crit, "%s <%ld>", time_s, (long)getpid()); + start = ftell(crit); + va_start(ap, msg); + vfprintf(crit, msg, ap); + va_end(ap); + fprintf(crit, "\n"); + + buf = malloc(ftell(crit) - start); + fclose(crit); + + if (buf) + { + va_start(ap, msg); + vsprintf(buf, msg, ap); + va_end(ap); + + send_zgram(instance, buf); + com_err(whoami, 0, buf); + + free(buf); + } } - com_err(whoami, 0, buf); + if (!crit || !buf) + { + send_zgram(instance, "Couldn't format critical syslog!"); + com_err(whoami, 0, "Couldn't format critical syslog!"); + } } - -/* Sends a zephyrgram of class "SMS", instance as a parameter. Ignores +/* Sends a zephyrgram of class "MOIRA", instance as a parameter. Ignores * errors while sending message. */ -send_zgram(inst, msg) -char *inst; -char *msg; +void send_zgram(char *inst, char *msg) { -#ifdef ZEPHYR - ZNotice_t znotice; - - bzero (&znotice, sizeof (znotice)); - znotice.z_kind = UNSAFE; - znotice.z_class = "SMS"; - znotice.z_class_inst = inst; - znotice.z_default_format = "SMS $instance:\n $message\n"; - (void) ZInitialize (); - znotice.z_message = msg; - znotice.z_message_len = strlen(msg) + 1; - znotice.z_opcode = ""; - znotice.z_recipient = ""; - ZSendNotice(&znotice, ZNOAUTH); -#endif -#ifdef SYSLOG +#ifdef HAVE_ZEPHYR + ZNotice_t znotice; + + memset(&znotice, 0, sizeof(znotice)); + znotice.z_kind = UNSAFE; + znotice.z_class = "MOIRA"; + znotice.z_class_inst = inst; + znotice.z_default_format = "MOIRA $instance on $fromhost:\n $message\n"; + ZInitialize(); + znotice.z_message = msg; + znotice.z_message_len = strlen(msg) + 1; + znotice.z_opcode = ""; + znotice.z_recipient = ""; + ZSendNotice(&znotice, ZNOAUTH); +#else + char *buf; + + buf = malloc(9 + strlen(inst) + strlen(msg)); + if (buf) { - char buf[512]; - sprintf(buf, "SMS: %s %s", inst, msg); - syslog(LOG_ERR, buf); + sprintf(buf, "MOIRA: %s %s", inst, msg); + syslog(LOG_ERR, buf); + free(buf); } #endif }