This is errorstuff.c in view mode; [Download] [Up]
/* $Id: errorstuff.c,v 1.2 1995/12/19 19:30:47 eilts Exp eilts $ */ #include "bbs.h" #define ERRORDEST(a,b) (a&b) void errormsg(const int destmask, const confrecordtyp *confrecord, const char *hpname, const char *upname, const char *fmt, ...) /* Sendet eine Fehlermeldung an die angegebenen Addressen. Moeglich sind: E_SYSLOG (syslog), E_LOGFILE (Logfile), E_CONSOLE (DEV_CONSOLE), E_USER (user) Die Fehlermeldung 'fmt' ist dabei ein Format wie fuer 'printf', zusaetzlich wird '%m' durch den aktuellen errno-String ersetzt. Datum, PID werden ergaenzt, die Strings 'hpname' und 'upname' werden eingefuegt, sofern sie nicht Nullzeiger sind, und sollten den Programmnamen und dessen aktuelles Unterprogramm bezeichnen. errno wird erhalten E_FILE darf vom Daemon nicht benutzt werden. */ { va_list ap; int saved_errno, logc, len; char c, *cp1, *cp2, str[MSG_MAX+1], fmt_cpy[MSG_MAX+1], upstr[S_STRLEN+1], hpstr[S_STRLEN+1]; saved_errno = errno; va_start(ap, fmt); for (cp1=fmt_cpy; (c=*fmt)!='\0'; ++fmt) { if (c=='%' && fmt[1]=='m') { ++fmt; for (cp2=strerror(saved_errno); (*cp1=*cp2++)!='\0'; ++cp1); } else { *cp1++ = c; } } *cp1 = '\0'; vsprintf(str,fmt_cpy,ap); len = strlen(str) - 1; if (str[len++]!='\n') { str[len++] = '\n'; str[len] = '\0'; } va_end(ap); if (upname != NULL) { sprintf(upstr,"(%s): ",upname); } else { upstr[0] = '\0'; } if (hpname != NULL) { strcpy(hpstr,hpname); } else { hpstr[0] = '\0'; } if (ERRORDEST(E_USER,destmask)) { #if defined(BBSD_SOURCE) || defined(BBSMAIL_SOURCE) fprintf(stderr,"%s",str); #else if (confrecord->curses_on) { windowtext(str," ERROR: ",0,confrecord); } else { fprintf(stderr,"%s",str); } #endif } strprepend(str,upstr); if (ERRORDEST(E_SYSLOG,destmask)) { syslogn(LOG_ERR,str); } strprepend(str,hpstr); if (ERRORDEST(E_LOGFILE,destmask)) { if (bbsdaemon) { syslogn(LOG_ERR,"bbsd(errormsg): E_LOGFILE darf vom Daemon nicht verwendet werden"); exit(-1); } #ifndef BBSD_SOURCE bbslog(LOG_FILE,confrecord,str); #endif } if (ERRORDEST(E_CONSOLE,destmask)) { if ((logc=open(DEV_CONSOLE,O_WRONLY))<0) { bgerror("errormsg",DEV_CONSOLE); perror(DEV_CONSOLE); } else { sprintf(fmt_cpy,"%.15s %s%s[%ld]: %s",gettime()+4*sizeof(char), hpstr,upstr,(long)getpid(),str); writen(logc,(void *)fmt_cpy,strlen(fmt_cpy)); close(logc); } } errno = saved_errno; return; } void bgerror(const char *upname, const char *fmt, ...) /* Sendet 'fmt' zum syslog. Der String 'upname' muss global definiert sein und soll den Namen des aufrufenden Untrprogramms enthalten. errno wird erhalten */ { va_list ap; int saved_errno; char str[MSG_MAX+1]; saved_errno = errno; va_start(ap, fmt); if (upname != NULL) { sprintf(str,"(%s): %s",upname,fmt); vsyslogn(LOG_ERR,str,ap); } else { vsyslogn(LOG_ERR,fmt,ap); } va_end(ap); errno = saved_errno; return; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.