if libevent dies it would be nice to have some kind of record of
why it decided that was a good idea. by default those messages go
nowhere.

this has tftp register a log callback for libevent to call. if
something goes wrong it should end up in the logs.

ok?

Index: tftpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/tftpd/tftpd.c,v
retrieving revision 1.34
diff -u -p -r1.34 tftpd.c
--- tftpd.c     14 Dec 2015 16:34:55 -0000      1.34
+++ tftpd.c     16 Dec 2015 01:08:55 -0000
@@ -189,6 +189,8 @@ int         parse_options(struct tftp_client *,
                    struct opt_client *);
 int            validate_access(struct tftp_client *, const char *);
 
+void           log_libevent(int, const char *);
+
 struct tftp_client *
                client_alloc(void);
 void           client_free(struct tftp_client *client);
@@ -361,6 +363,7 @@ main(int argc, char *argv[])
        if (pledge("stdio rpath wpath cpath fattr dns inet", NULL) == -1)
                err(1, "pledge");
 
+       event_set_log_callback(log_libevent);
        event_init();
 
        if (rewrite != NULL)
@@ -1625,3 +1628,30 @@ syslog_info(const char *fmt, ...)
        va_end(ap);
 }
 
+void
+log_libevent(int severity, const char *msg)
+{
+       const char *level = "msg";
+
+       switch (severity) {
+       case _EVENT_LOG_DEBUG:
+               if (!verbose)
+                       return;
+               level = "debug";
+               break;
+       case _EVENT_LOG_MSG:
+               level = "msg";
+               break;
+       case _EVENT_LOG_WARN:
+               level = "warn";
+               break;
+       case _EVENT_LOG_ERR:
+               level = "err";
+               break;
+       default:
+               lerrx(1, "%s severity %d", __func__, severity);
+               return;
+       }
+
+       lwarnx("event %s: %s", level, msg);
+}

Reply via email to