add new main.c and fix Makefile/headers
authorJohn Crispin <blogic@openwrt.org>
Fri, 8 Mar 2013 22:52:52 +0000 (23:52 +0100)
committerJohn Crispin <blogic@openwrt.org>
Wed, 13 Mar 2013 17:58:14 +0000 (18:58 +0100)
CMakeLists.txt
main.c
procd.h
service.c
ubus.c

index fc1ad3af66bba28558a1a8587929674d3471654e..62e309a99d9ad06239babfe059ca3d4b5a422291 100644 (file)
@@ -10,10 +10,10 @@ IF(APPLE)
   LINK_DIRECTORIES(/opt/local/lib)
 ENDIF()
 
-SET(SOURCES main.c ubus.c service.c instance.c utils.c md5.c hotplug-rule.c hotplug.c)
+SET(SOURCES main.c ubus.c service.c instance.c utils.c md5.c hotplug.c state.c mkdev.c early.c inittab.c preinit.c coldplug.c syslog.c log.c watchdog.c signal.c system.c debug.c)
 
 find_library(json NAMES json-c json)
-SET(LIBS ubox ubus ${json} blobmsg_json)
+SET(LIBS ubox ubus ${json} blobmsg_json json_script)
 
 IF(DEBUG)
   ADD_DEFINITIONS(-DDEBUG -g3)
@@ -26,3 +26,22 @@ TARGET_LINK_LIBRARIES(procd ${LIBS})
 INSTALL(TARGETS procd
        RUNTIME DESTINATION sbin
 )
+
+ADD_EXECUTABLE(askfirst askfirst.c)
+
+INSTALL(TARGETS askfirst
+       RUNTIME DESTINATION sbin
+)
+
+ADD_EXECUTABLE(udevtrigger udevtrigger.c)
+
+INSTALL(TARGETS udevtrigger
+       RUNTIME DESTINATION sbin
+)
+
+ADD_EXECUTABLE(logread logread.c)
+TARGET_LINK_LIBRARIES(logread ${LIBS})
+
+INSTALL(TARGETS logread
+       RUNTIME DESTINATION sbin
+)
diff --git a/main.c b/main.c
index e081109c3b85943784c41425ba601f5b77fdae62..65ed854bf5f24dae1ec82062a34eb3c7783558f6 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,11 +1,31 @@
+/*
+ * Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org>
+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 2.1
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <sys/wait.h>
+#include <sys/types.h>
+
+#include <unistd.h>
 #include <getopt.h>
-#include "procd.h"
+#include <libgen.h>
 
-int debug = 0;
+#include "procd.h"
+#include "hotplug.h"
+#include "watchdog.h"
 
 static int usage(const char *prog)
 {
-       fprintf(stderr, "Usage: %s [options]\n"
+       ERROR("Usage: %s [options]\n"
                "Options:\n"
                "    -s <path>:         Path to ubus socket\n"
                "    -d:                Enable debug messages\n"
@@ -13,10 +33,26 @@ static int usage(const char *prog)
        return 1;
 }
 
+
+static int main_procd_init(int argc, char **argv)
+{
+       procd_early();
+       debug_init();
+       watchdog_init();
+       uloop_init();
+       hotplug("/etc/hotplug-preinit.json");
+       procd_preinit();
+       uloop_run();
+       return 0;
+}
+
 int main(int argc, char **argv)
 {
        int ch;
 
+       if (!strcmp(basename(*argv), "init"))
+               return main_procd_init(argc, argv);
+
        while ((ch = getopt(argc, argv, "ds:")) != -1) {
                switch (ch) {
                case 's':
@@ -30,7 +66,11 @@ int main(int argc, char **argv)
                }
        }
        uloop_init();
-       procd_connect_ubus();
+       procd_signal();
+       if (getpid() != 1)
+               procd_connect_ubus();
+       else
+               procd_state_next();
        uloop_run();
 
        return 0;
diff --git a/procd.h b/procd.h
index 66a08e2d125f7f765f252e19fce0b988e7424030..f3aff895b18364d8b727d9732e7e7fe7479d2f3f 100644 (file)
--- a/procd.h
+++ b/procd.h
@@ -1,26 +1,66 @@
+/*
+ * Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org>
+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 2.1
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
 #ifndef __PROCD_H
 #define __PROCD_H
 
 #include <libubox/uloop.h>
 #include <libubox/utils.h>
 #include <libubus.h>
+
 #include <stdio.h>
+#include <syslog.h>
 
-#define __init __attribute__((constructor))
+#include "syslog.h"
 
-#define DPRINTF(fmt, ...) do { \
-       if (debug) \
-               fprintf(stderr, "DEBUG %s(%d): " fmt, __func__, __LINE__, ## __VA_ARGS__); \
-       } while (0)
+#define __init __attribute__((constructor))
 
 #define DEBUG(level, fmt, ...) do { \
        if (debug >= level) \
-               fprintf(stderr, "DEBUG %s(%d): " fmt, __func__, __LINE__, ## __VA_ARGS__); \
+               fprintf(stderr, "procd: %s(%d): " fmt, __func__, __LINE__, ## __VA_ARGS__); \
+       } while (0)
+
+#define LOG(fmt, ...) do { \
+       syslog(LOG_INFO, fmt, ## __VA_ARGS__); \
+       fprintf(stderr, "procd: "fmt, ## __VA_ARGS__); \
+       } while (0)
+
+#define ERROR(fmt, ...) do { \
+       syslog(LOG_ERR, fmt, ## __VA_ARGS__); \
+       fprintf(stderr, "procd: "fmt, ## __VA_ARGS__); \
        } while (0)
 
-extern int debug;
 extern char *ubus_socket;
+
+extern unsigned int debug;
+void debug_init(void);
+
 void procd_connect_ubus(void);
-void procd_init_service(struct ubus_context *ctx);
+void ubus_init_service(struct ubus_context *ctx);
+void ubus_init_log(struct ubus_context *ctx);
+void ubus_init_system(struct ubus_context *ctx);
+void ubus_notify_log(struct log_head *l);
+
+void procd_state_next(void);
+void procd_shutdown(int event);
+void procd_early(void);
+void procd_preinit(void);
+void procd_coldplug(void);
+void procd_signal(void);
+void procd_inittab(void);
+void procd_inittab_run(const char *action);
+
+int mkdev(const char *progname, int progmode);
 
 #endif
index 16593fc976705c86f399160219ea34a99c802cf9..e51e399f5ee7ee333364f2f953ccff6a963ff835 100644 (file)
--- a/service.c
+++ b/service.c
@@ -284,7 +284,7 @@ static struct ubus_object main_object = {
        .n_methods = ARRAY_SIZE(main_object_methods),
 };
 
-void procd_init_service(struct ubus_context *ctx)
+void ubus_init_service(struct ubus_context *ctx)
 {
        avl_init(&services, avl_strcmp, false, NULL);
        ubus_add_object(ctx, &main_object);
diff --git a/ubus.c b/ubus.c
index 7b96fd666d7f7a29ef1d71eaeec296ac3ba8e029..e6f9922fcacd7973bad5f44252f4f6a2052d25a1 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -61,7 +61,11 @@ static void procd_ubus_try_connect(void)
 
        ctx->connection_lost = procd_ubus_connection_lost;
        ubus_connected = true;
-       procd_init_service(ctx);
+       ubus_init_service(ctx);
+       if (getpid() == 1) {
+               ubus_init_log(ctx);
+               ubus_init_system(ctx);
+       }
 }
 
 static void procd_ubus_connection_lost(struct ubus_context *old_ctx)