X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=log.c;h=156f3549df18c23c481cc017f587ea96b475be79;hp=6dbf25aa3492afba341a511ff7e29441a2894ce6;hb=5c679ae0bf87d5d53b65c5e7667a1fa304bdcdeb;hpb=32fc582f43a9a3841d2782674e055113729c2814 diff --git a/log.c b/log.c index 6dbf25a..156f354 100644 --- a/log.c +++ b/log.c @@ -189,6 +189,42 @@ static void log_vmulti(void *sst, int class, const char *message, va_list args) } } +void lg_vperror(struct log_if *lg, const char *desc, struct cloc *loc, + int class, int errnoval, const char *fmt, va_list al) +{ + int status=current_phase; + int esave=errno; + + if (!lg) + lg=system_log; + + if (class & M_FATAL) + enter_phase(PHASE_SHUTDOWN); + + slilog_part(lg,class,"%s",desc); + if (loc) + slilog_part(lg,class," (%s:%d)",loc->file,loc->line); + slilog_part(lg,class,": "); + vslilog_part(lg,class,fmt,al); + if (errnoval) + slilog_part(lg,class,": %s",strerror(errnoval)); + slilog_part(lg,class,"\n"); + + if (class & M_FATAL) + exit(status); + + errno=esave; +} + +void lg_perror(struct log_if *lg, const char *desc, struct cloc *loc, + int class, int errnoval, const char *fmt, ...) +{ + va_list al; + va_start(al,fmt); + lg_vperror(lg,desc,loc,class,errnoval,fmt,al); + va_end(al); +} + struct log_if *init_log(list_t *ll) { int i=0;