]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/forbrun/forbrun.c
forbrun: Support --serverid command line switch
[frescor/forb.git] / src / forbrun / forbrun.c
index 1f1d47216505fa3a8c7fc6ca1367d218bb7261e7..81e815471104f48094a90e9b01831842f692bbc7 100644 (file)
@@ -5,27 +5,31 @@
 #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>
 #include <pthread.h>
+#include <forb/server_id.h>
 
 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' },
+    { "serverid", required_argument, NULL, 's' },
     { 0, 0, 0, 0}
 };
 
 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");
+       printf("  -s, --serverid <serverid> fixed server id of this server\n");
 }
 
 int print_log_domain(ul_log_domain_t *domain, void *context)
@@ -46,19 +50,23 @@ void *forb_main_thread(void *arg)
 {
        struct forb_main_data *data = arg;
        int ret;
+       optind = 1;
        ret = data->forb_main(data->orb, data->argc, data->argv);
+       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;
+       int i, ret;
+       forb_server_id *server_id;
        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,
@@ -69,22 +77,19 @@ 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::hi:l:p:s:", &long_opts[0], NULL)) != EOF) {
                switch (opt) {
-#if 0                  
                        case 'l':
                                if (*optarg == '?') {
                                        ul_logreg_for_each_domain(print_log_domain, NULL);
                                        exit(0);
                                }
                                {
-                                       int ret;
                                        ret = ul_log_domain_arg2levels(optarg);
                                        if (ret) 
                                                error(1, EINVAL, "Error parsing -l argument at char %d\n", ret);
                                }
                                break;
-#endif
                        case 'd':
                                opt_daemon = true;
                                opt_pidfile = optarg;
@@ -100,6 +105,11 @@ int main(int argc, char *argv[])
                        case 'p':
                                attr.fixed_tcp_port = atol(optarg);
                                break;
+                       case 's':
+                               server_id = forb_server_id_from_string(&attr.fixed_server_id, optarg);
+                               if (!server_id)
+                                       error(1, 0, "Invalid server id: '%s'\n", optarg);
+                               break;
                }
        }
 
@@ -109,6 +119,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");
@@ -117,22 +128,32 @@ 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);
+               ret = forb_wait_for_server_ready(orb);
+               if (ret)
+                       error(1, errno, "forb_wait_for_server_ready");
        }
 
        if (opt_daemon)
@@ -140,7 +161,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;
 }