X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=log.c;h=156f3549df18c23c481cc017f587ea96b475be79;hb=7d31df0e8ab53aec525ae75b04f84f0e0dc8e859;hp=326a891955fed55f07a21d9db86fda216a12f1c9;hpb=0757576591ae7ba84ee28067c04fa7d5490632c4;p=secnet.git diff --git a/log.c b/log.c index 326a891..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; @@ -485,9 +521,11 @@ static int log_from_fd_beforepoll(void *sst, struct pollfd *fds, int *nfds_io, { struct fdlog *st=sst; if (!st->finished) { - *nfds_io=1; + BEFOREPOLL_WANT_FDS(1); fds[0].fd=st->fd; fds[0].events=POLLIN; + } else { + BEFOREPOLL_WANT_FDS(0); } return 0; } @@ -543,7 +581,7 @@ void log_from_fd(int fd, cstring_t prefix, struct log_if *log) st->i=0; st->finished=False; - register_for_poll(st,log_from_fd_beforepoll,log_from_fd_afterpoll,1, + register_for_poll(st,log_from_fd_beforepoll,log_from_fd_afterpoll, prefix); }