logd: add udebug support
[project/ubox.git] / log / logd.c
index 5d6c458342490515d32560263ebfd07202927bfb..96042964a5f8c07041d4e899fc7f0fe31e910b9c 100644 (file)
@@ -24,6 +24,7 @@
 #include <libubox/blobmsg.h>
 #include <libubox/list.h>
 #include <libubox/ustream.h>
+#include <libubox/utils.h>
 #include <libubus.h>
 
 #include "syslog.h"
@@ -31,6 +32,7 @@
 int debug = 0;
 static struct blob_buf b;
 static struct ubus_auto_conn conn;
+static struct udebug_ubus udebug;
 static LIST_HEAD(clients);
 
 enum {
@@ -207,7 +209,7 @@ ubus_notify_log(struct log_head *l)
 {
        struct client *c;
 
-       if (list_empty(&clients))
+       if (list_empty(&clients) && !log_object.has_subscribers)
                return;
 
        blob_buf_init(&b, 0);
@@ -217,6 +219,9 @@ ubus_notify_log(struct log_head *l)
        blobmsg_add_u32(&b, "source", l->source);
        blobmsg_add_u64(&b, "time", (((__u64) l->ts.tv_sec) * 1000) + (l->ts.tv_nsec / 1000000));
 
+       if (log_object.has_subscribers)
+               ubus_notify(&conn.ctx, &log_object, "message", b.head, -1);
+
        list_for_each_entry(c, &clients, list)
                ustream_write(&c->s.stream, (void *) b.head, blob_len(b.head) + sizeof(struct blob_attr), false);
 
@@ -258,19 +263,21 @@ main(int argc, char **argv)
        log_init(log_size);
        conn.cb = ubus_connect_handler;
        ubus_auto_connect(&conn);
+       udebug_ubus_init(&udebug, &conn.ctx, "log", log_udebug_config);
        p = getpwnam("logd");
        if (p) {
-               if (setuid(p->pw_uid) < 0) {
-                       fprintf(stderr, "setuid() failed: %s\n", strerror(errno));
+               if (setgid(p->pw_gid) < 0) {
+                       fprintf(stderr, "setgid() failed: %s\n", strerror(errno));
                        exit(1);
                }
 
-               if (setgid(p->pw_gid) < 0) {
-                       fprintf(stderr, "setgid() failed: %s\n", strerror(errno));
+               if (setuid(p->pw_uid) < 0) {
+                       fprintf(stderr, "setuid() failed: %s\n", strerror(errno));
                        exit(1);
                }
        }
        uloop_run();
+       udebug_ubus_free(&udebug);
        log_shutdown();
        uloop_done();
        ubus_auto_shutdown(&conn);