]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/forbrun/forbrun.c
forbrun: Enable uLUt-based logging
[frescor/forb.git] / src / forbrun / forbrun.c
index 6f33ade5888da70e202ebd697a6e3c90ace5b79e..9219cee4da3893b60d378b8881fc6ec1c96db62a 100644 (file)
@@ -5,6 +5,7 @@
 #include <errno.h>
 #include <stdio.h>
 #include <ul_log.h>
+#include <ul_logreg.h>
 #include <stdbool.h>
 #include <dlfcn.h>
 #include <forb/forb-internal.h>
@@ -13,7 +14,7 @@
 static struct option long_opts[] = {
     { "daemon",   optional_argument, NULL, 'd' },
     { "id",      required_argument, NULL, 'i' },
-/*     { "loglevel", required_argument, NULL, 'l' }, */
+    { "loglevel", required_argument, NULL, 'l' },
     { "port",            required_argument, NULL, 'p' },
     { 0, 0, 0, 0}
 };
@@ -21,10 +22,10 @@ static struct option long_opts[] = {
 static void
 usage(void)
 {
-       printf("usage: forbrun [ options ] <forb-server>.so ... [-- <options for forb_main()>] \n");
+       printf("usage: forbrun [ options ] -- <forb-server>.so [ options for forb_main() ] [-- ...]\n");
        printf("  -d, --daemon [pid-file]   go to background after initialization of servers\n");
-       printf("  -i, --id <orb id>         \n");
-/*     printf("  -l, --loglevel <number>|<domain>=<number>,...\n"); */
+       printf("  -i, --id <textual orb id>\n");
+       printf("  -l, --loglevel <number>|<domain>=<number>,...\n");
        printf("  -p, --port <number>       listen on a fixed port number\n");
 }
 
@@ -47,20 +48,20 @@ void *forb_main_thread(void *arg)
        struct forb_main_data *data = arg;
        int ret;
        ret = data->forb_main(data->orb, data->argc, data->argv);
-       if (ret != 0)
-               fprintf(stderr, "forb_main() in %s returned %d\n",
-                       data->filename, ret);
+       free(data);
+       exit(ret);
        return NULL;
 }
 
 int main(int argc, char *argv[])
 {
+       unsigned libs_loaded_cnt = 0;
        forb_orb orb;
        bool opt_daemon = false;
        char *opt_pidfile = NULL;
        int i;
        forb_init_attr_t attr = {
-               .orb_id = "org.frescor.fcb",
+               .orb_id = "",
                .peer_discovery_callback = NULL, /* TODO */
                .peer_dead_callback = NULL,      /* TODO */
                .fixed_tcp_port = 0,
@@ -71,9 +72,8 @@ int main(int argc, char *argv[])
        };
        int  opt;
 
-       while ((opt = getopt_long(argc, argv, "d::hil:p:", &long_opts[0], NULL)) != EOF) {
+       while ((opt = getopt_long(argc, argv, "d::hil:p:x", &long_opts[0], NULL)) != EOF) {
                switch (opt) {
-#if 0                  
                        case 'l':
                                if (*optarg == '?') {
                                        ul_logreg_for_each_domain(print_log_domain, NULL);
@@ -86,7 +86,6 @@ int main(int argc, char *argv[])
                                                error(1, EINVAL, "Error parsing -l argument at char %d\n", ret);
                                }
                                break;
-#endif
                        case 'd':
                                opt_daemon = true;
                                opt_pidfile = optarg;
@@ -111,6 +110,7 @@ int main(int argc, char *argv[])
        orb = forb_init(&argc, &argv, &attr);
        if (!orb) error(1, errno, "FORB initialization failed");
 
+
 #if CONFIG_FCB_INET && !CONFIG_FORB_PROTO_INET_DEFAULT
        ret = register_inet_port(orb);
        if (ret) error(0, errno, "INET port registration failed");
@@ -119,20 +119,28 @@ int main(int argc, char *argv[])
        for (i = optind; i < argc; i++) {
                void *handle;
                fosa_thread_id_t tid;
-               struct forb_main_data data;
+               struct forb_main_data *data = malloc(sizeof(*data));
 
-               data.filename = argv[i];
-               handle = dlopen(data.filename, RTLD_LOCAL|RTLD_LAZY);
+               data->filename = argv[i];
+               handle = dlopen(data->filename, RTLD_LOCAL|RTLD_LAZY);
                if (!handle)
-                       error(1, errno, "dlopen(\"%s\") failed", data.filename);
-               data.forb_main = dlsym(handle, "forb_main");
-               if (!data.forb_main)
-                       error(1, errno, "Cannot find forb_main() in %s", data.filename);
-
-               data.orb = orb;
-               data.argc = 0;  /* TODO argc and argv after "--" */
-               data.argv = NULL; /* TODO argc and argv after "--" */
-               fosa_thread_create(&tid, NULL, forb_main_thread, &data);
+                       error(1, errno, "dlopen(\"%s\") failed", data->filename);
+               data->forb_main = dlsym(handle, "forb_main");
+               if (!data->forb_main)
+                       error(1, errno, "Cannot find forb_main() in %s", data->filename);
+
+               data->orb = orb;
+               
+               // prepare forb_main() parameters
+               data->argc = 0;
+               data->argv = &argv[i];
+               while (i < argc && strcmp(argv[i], "--")) {
+                       i++;
+                       data->argc++;
+               }
+               
+               fosa_thread_create(&tid, NULL, forb_main_thread, data);
+               libs_loaded_cnt++;
 
                forb_wait_for_server_ready(orb);
        }
@@ -142,7 +150,8 @@ int main(int argc, char *argv[])
 
        /* Allow other threads to continue execution, but exit
         * ourselves (without exit()ing the whole process. */
-       pthread_exit(NULL);     
+       if (libs_loaded_cnt > 0)
+               pthread_exit(NULL);     
 
        return 0;
 }