afb-debug: add features for debugging
[src/app-framework-binder.git] / src / main.c
index b5d9281..a989a70 100644 (file)
  */
 
 #define _GNU_SOURCE
-#define NO_BINDING_VERBOSE_MACRO
+#define AFB_BINDING_PRAGMA_NO_VERBOSE_MACRO
 
 #include <stdlib.h>
+#include <stdio.h>
 #include <stdint.h>
 #include <signal.h>
 #include <string.h>
 #include "afb-session.h"
 #include "verbose.h"
 #include "afb-common.h"
+#include "afb-monitor.h"
 #include "afb-hook.h"
 #include "sd-fds.h"
+#include "afb-debug.h"
 
 /*
    if SELF_PGROUP == 0 the launched command is the group leader
@@ -111,7 +114,6 @@ static void exit_handler()
                killpg(0, SIGTERM);
        else if (childpid > 0)
                killpg(childpid, SIGTERM);
-       exit(0);
 }
 
 static void on_sigterm(int signum, siginfo_t *info, void *uctx)
@@ -446,11 +448,11 @@ struct startup_req
        struct afb_session *session;
 };
 
-static void startup_call_reply(struct afb_xreq *xreq, int iserror, struct json_object *obj)
+static void startup_call_reply(struct afb_xreq *xreq, int status, struct json_object *obj)
 {
        struct startup_req *sreq = CONTAINER_OF_XREQ(struct startup_req, xreq);
 
-       if (!iserror)
+       if (status >= 0)
                NOTICE("startup call %s returned %s", sreq->current->value, json_object_get_string(obj));
        else {
                ERROR("startup call %s ERROR! %s", sreq->current->value, json_object_get_string(obj));
@@ -528,10 +530,17 @@ static void run_startup_calls()
  | job for starting the daemon
  +--------------------------------------------------------- */
 
-static void start()
+static void start(int signum)
 {
        struct afb_hsrv *hsrv;
 
+       afb_debug("start-entry");
+
+       if (signum) {
+               ERROR("start aborted: received signal %s", strsignal(signum));
+               exit(1);
+       }
+
        // ------------------ sanity check ----------------------------------------
        if (config->httpdPort <= 0) {
                ERROR("no port is defined");
@@ -550,14 +559,18 @@ static void start()
        }
 
        /* configure the daemon */
+       afb_session_init(config->nbSessionMax, config->cntxTimeout, config->token);
+       if (!afb_hreq_init_cookie(config->httpdPort, config->rootapi, config->cntxTimeout)) {
+               ERROR("initialisation of cookies failed");
+               goto error;
+       }
        main_apiset = afb_apiset_create("main", config->apiTimeout);
        if (!main_apiset) {
                ERROR("can't create main api set");
                goto error;
        }
-       afb_session_init(config->nbSessionMax, config->cntxTimeout, config->token);
-       if (!afb_hreq_init_cookie(config->httpdPort, config->rootapi, config->cntxTimeout)) {
-               ERROR("initialisation of cookies failed");
+       if (afb_monitor_init() < 0) {
+               ERROR("failed to setup monitor");
                goto error;
        }
 
@@ -566,8 +579,13 @@ static void start()
                afb_hook_create_xreq(NULL, NULL, NULL, config->tracereq, NULL, NULL);
        if (config->traceditf)
                afb_hook_create_ditf(NULL, config->traceditf, NULL, NULL);
+       if (config->tracesvc)
+               afb_hook_create_svc(NULL, config->tracesvc, NULL, NULL);
+       if (config->traceevt)
+               afb_hook_create_evt(NULL, config->traceevt, NULL, NULL);
 
        /* load bindings */
+       afb_debug("start-load");
        apiset_start_list(config->dbus_clients, afb_api_dbus_add_client, "the afb-dbus client");
        apiset_start_list(config->ws_clients, afb_api_ws_add_client, "the afb-websocket client");
        apiset_start_list(config->ldpaths, afb_api_so_add_pathset, "the binding path set");
@@ -579,25 +597,29 @@ static void start()
        DEBUG("Init config done");
 
        /* start the services */
+       afb_debug("start-start");
        if (afb_apiset_start_all_services(main_apiset, 1) < 0)
                goto error;
 
        /* start the HTTP server */
+       afb_debug("start-http");
        if (!config->noHttpd) {
                hsrv = start_http_server();
                if (hsrv == NULL)
                        goto error;
        }
 
+       /* run the startup calls */
+       afb_debug("start-call");
+       run_startup_calls();
+
        /* run the command */
+       afb_debug("start-exec");
        if (execute_command() < 0)
                goto error;
 
        /* ready */
        sd_notify(1, "READY=1");
-
-       /* run the startup calls */
-       run_startup_calls();
        return;
 error:
        exit(1);
@@ -610,6 +632,8 @@ error:
 
 int main(int argc, char *argv[])
 {
+       afb_debug("main-entry");
+
        // let's run this program with a low priority
        nice(20);
 
@@ -617,7 +641,8 @@ int main(int argc, char *argv[])
 
        // ------------- Build session handler & init config -------
        config = afb_config_parse_arguments(argc, argv);
-       INFO("running with pid %d", getpid());
+
+       afb_debug("main-args");
 
        // --------- run -----------
        if (config->background) {
@@ -628,10 +653,13 @@ int main(int argc, char *argv[])
                // ---- in foreground mode --------------------
                INFO("entering foreground mode");
        }
+       INFO("running with pid %d", getpid());
 
        /* set the daemon environment */
        setup_daemon();
 
+       afb_debug("main-start");
+
        /* enter job processing */
        jobs_start(3, 0, 50, start);
        WARNING("hoops returned from jobs_enter! [report bug]");