#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)
{
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,
};
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;
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;
}
}
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");
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)
/* 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;
}