trace: use standard POSIX header for basename()
[project/procd.git] / procd.c
diff --git a/procd.c b/procd.c
index 6fb0a72c687e4f1eee7ba748555502625740ba17..1223283c3e96eecb6e77b5c1dc8fbf9a10812c04 100644 (file)
--- a/procd.c
+++ b/procd.c
@@ -15,6 +15,7 @@
 #include <sys/wait.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/reboot.h>
 
 #include <unistd.h>
 #include <getopt.h>
 
 unsigned int debug;
 
+static struct udebug ud;
+static struct udebug_buf udb;
+static bool udebug_enabled;
+
+static void procd_udebug_vprintf(const char *format, va_list ap)
+{
+       if (!udebug_enabled)
+               return;
+
+       udebug_entry_init(&udb);
+       udebug_entry_vprintf(&udb, format, ap);
+       udebug_entry_add(&udb);
+}
+
+void procd_udebug_printf(const char *format, ...)
+{
+       va_list ap;
+
+       va_start(ap, format);
+       procd_udebug_vprintf(format, ap);
+       va_end(ap);
+}
+
+void procd_udebug_set_enabled(bool val)
+{
+       static const struct udebug_buf_meta meta = {
+               .name = "procd_log",
+               .format = UDEBUG_FORMAT_STRING,
+       };
+
+       if (udebug_enabled == val)
+               return;
+
+       udebug_enabled = val;
+       if (!val) {
+               ulog_udebug(NULL);
+               udebug_buf_free(&udb);
+               udebug_free(&ud);
+               return;
+       }
+
+       udebug_init(&ud);
+       udebug_auto_connect(&ud, NULL);
+       udebug_buf_init(&udb, 1024, 64 * 1024);
+       udebug_buf_add(&ud, &udb, &meta);
+       ulog_udebug(&udb);
+}
+
+
 static int usage(const char *prog)
 {
-       ERROR("Usage: %s [options]\n"
+       fprintf(stderr, "Usage: %s [options]\n"
                "Options:\n"
-               "\t-s <path>\tPath to ubus socket\n"
-               "\t-h <path>\trun as hotplug daemon\n"
-               "\t-d <level>\tEnable debug messages\n"
+               "       -s <path>       Path to ubus socket\n"
+               "       -h <path>       run as hotplug daemon\n"
+               "       -d <level>      Enable debug messages\n"
+               "       -S              Print messages to stdout\n"
                "\n", prog);
        return 1;
 }
@@ -40,8 +91,15 @@ static int usage(const char *prog)
 int main(int argc, char **argv)
 {
        int ch;
+       char *dbglvl = getenv("DBGLVL");
+       int ulog_channels = ULOG_KMSG;
 
-       while ((ch = getopt(argc, argv, "d:s:h:")) != -1) {
+       if (dbglvl) {
+               debug = atoi(dbglvl);
+               unsetenv("DBGLVL");
+       }
+
+       while ((ch = getopt(argc, argv, "d:s:h:S")) != -1) {
                switch (ch) {
                case 'h':
                        return hotplug_run(optarg);
@@ -51,18 +109,27 @@ int main(int argc, char **argv)
                case 'd':
                        debug = atoi(optarg);
                        break;
+               case 'S':
+                       ulog_channels = ULOG_STDIO;
+                       break;
                default:
                        return usage(argv[0]);
                }
        }
+
+       ulog_open(ulog_channels, LOG_DAEMON, "procd");
+       ulog_threshold(LOG_DEBUG + 1);
+
+       setsid();
        uloop_init();
        procd_signal();
-       trigger_init();
+       procd_udebug_set_enabled(true);
        if (getpid() != 1)
                procd_connect_ubus();
        else
                procd_state_next();
        uloop_run();
+       uloop_done();
 
        return 0;
 }