chiark / gitweb /
logging: Provide lg_perror and lg_vperror
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 22 Sep 2014 01:00:50 +0000 (02:00 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 Oct 2014 22:29:37 +0000 (23:29 +0100)
These are convenience functions for logging module, config location,
errno value, etc., along with a full formatted message.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
log.c
secnet.h

diff --git a/log.c b/log.c
index 6dbf25aa3492afba341a511ff7e29441a2894ce6..156f3549df18c23c481cc017f587ea96b475be79 100644 (file)
--- 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;
index 2c55a329313c5c8c89c1b87934381455e2422cce..54d84a5143ad014bf984934049cc68cf851a0d1a 100644 (file)
--- a/secnet.h
+++ b/secnet.h
@@ -587,6 +587,17 @@ extern NORETURN(fatal_status(int status, const char *message, ...))
 extern NORETURN(fatal_perror_status(int status, const char *message, ...))
        FORMAT(printf,2,3);
 
+/* Convenient nonfatal logging.  Requires message that does not end in '\n'.
+ * If class contains M_FATAL, exits (after entering PHASE_SHUTDOWN).
+ * lg, errnoval and loc may sensibly be 0.  desc must NOT be 0.
+ * lg_[v]perror save and restore errno. */
+void lg_vperror(struct log_if *lg, const char *desc, struct cloc *loc,
+               int class, int errnoval, const char *fmt, va_list al)
+    FORMAT(printf,6,0);
+void lg_perror(struct log_if *lg, const char *desc, struct cloc *loc,
+              int class, int errnoval, const char *fmt, ...)
+    FORMAT(printf,6,7);
+
 /* The cfgfatal() family of functions require messages that end in '\n' */
 extern NORETURN(cfgfatal(struct cloc loc, cstring_t facility,
                         const char *message, ...)) FORMAT(printf,3,4);