int tcf(void) { #else int main(int argc, char ** argv) { int c; int ind; int daemon = 0; const char * log_name = NULL; const char * log_level = NULL; #endif int interactive = 0; int print_server_properties = 0; const char * url = DEFAULT_SERVER_URL; Protocol * proto; TCFBroadcastGroup * bcg; ini_mdep(); ini_trace(); ini_events_queue(); ini_asyncreq(); #if defined(_WRS_KERNEL) progname = "tcf"; open_log_file("-"); log_mode = 0; #else progname = argv[0]; /* Parse arguments */ for (ind = 1; ind < argc; ind++) { const char * s = argv[ind]; if (*s != '-') { break; } s++; while ((c = *s++) != '\0') { switch (c) { case 'i': interactive = 1; break; case 't': #if ENABLE_RCBP_TEST test_proc(); #endif exit(0); break; case 'd': daemon = 1; break; case 'c': generate_ssl_certificate(); exit(0); break; case 'S': print_server_properties = 1; break; case 'h': show_help(); exit(0); case 'I': case 'l': case 'L': case 's': #if ENABLE_Plugins case 'P': #endif if (*s == '\0') { if (++ind >= argc) { fprintf(stderr, "%s: error: no argument given to option '%c'\n", progname, c); exit(1); } s = argv[ind]; } switch (c) { case 'I': idle_timeout = strtol(s, 0, 0); break; case 'l': log_level = s; parse_trace_mode(log_level, &log_mode); break; case 'L': log_name = s; break; case 's': url = s; break; #if ENABLE_Plugins case 'P': plugins_path = s; break; #endif } s = ""; break; default: fprintf(stderr, "%s: error: illegal option '%c'\n", progname, c); show_help(); exit(1); } } } if (daemon && log_name != NULL && strcmp (log_name, LOG_NAME_STDERR) != 0) { fprintf(stderr, "%s: error: can only log to stderr when in daemon " "mode.\n", progname); exit (1); } if (daemon) become_daemon(); open_log_file(log_name); #endif bcg = broadcast_group_alloc(); proto = protocol_alloc(); /* The static services must be initialised before the plugins */ #if ENABLE_Cmdline if (interactive) ini_cmdline_handler(interactive, proto); #else if (interactive) fprintf(stderr, "Warning: This version does not support interactive mode.\n"); #endif ini_services(proto, bcg); #if !defined(_WRS_KERNEL) /* Reparse log level in case initialization cause additional * levels to be registered */ if (log_level != NULL && parse_trace_mode(log_level, &log_mode) != 0) { fprintf(stderr, "Cannot parse log level: %s\n", log_level); exit(1); } #endif if (ini_server(url, proto, bcg) < 0) { fprintf(stderr, "Cannot create TCF server: %s\n", errno_to_str(errno)); exit(1); } discovery_start(); if (print_server_properties) { ChannelServer * s; char * server_properties; assert(!list_is_empty(&channel_server_root)); s = servlink2channelserverp(channel_server_root.next); server_properties = channel_peer_to_json(s->ps); printf("Server-Properties: %s\n", server_properties); fflush(stdout); trace(LOG_ALWAYS, "Server-Properties: %s", server_properties); loc_free(server_properties); } #if ENABLE_SignalHandlers signal(SIGABRT, signal_handler); signal(SIGILL, signal_handler); signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); #if defined(_WIN32) SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); AddVectoredExceptionHandler(1, VectoredExceptionHandler); #endif #endif /* ENABLE_SignalHandlers */ if (idle_timeout != 0) { add_channel_close_listener(channel_closed); check_idle_timeout(NULL); } /* Process events - must run on the initial thread since ptrace() * returns ECHILD otherwise, thinking we are not the owner. */ run_event_loop(); #if ENABLE_Plugins plugins_destroy(); #endif /* ENABLE_Plugins */ return 0; }
int tcf(void) { #else int main(int argc, char ** argv) { int c; int ind; int daemon = 0; const char * log_name = NULL; const char * log_level = NULL; #endif int interactive = 0; int print_server_properties = 0; const char * url = DEFAULT_SERVER_URL; Protocol * proto; TCFBroadcastGroup * bcg; PRE_INIT_HOOK; ini_mdep(); ini_trace(); ini_events_queue(); ini_asyncreq(); PRE_THREADING_HOOK; #if defined(_WRS_KERNEL) progname = "tcf"; open_log_file("-"); log_mode = 0; #else progname = argv[0]; /* Parse arguments */ for (ind = 1; ind < argc; ind++) { char * s = argv[ind]; if (*s++ != '-') break; while (s && (c = *s++) != '\0') { switch (c) { case 'i': interactive = 1; break; case 't': #if ENABLE_RCBP_TEST test_proc(); #endif exit(0); break; case 'd': #if defined(_WIN32) || defined(__CYGWIN__) /* For Windows the only way to detach a process is to * create a new process, so we patch the -d option to * -D for the second time we get invoked so we don't * keep on creating new processes forever. */ s[-1] = 'D'; daemon = 2; break; case 'D': #endif daemon = 1; break; case 'c': generate_ssl_certificate(); exit(0); break; case 'S': print_server_properties = 1; break; case 'h': show_help(); exit(0); case 'I': #if ENABLE_Trace case 'l': #endif case 'L': case 's': case 'g': #if ENABLE_Plugins case 'P': #endif if (*s == '\0') { if (++ind >= argc) { fprintf(stderr, "%s: error: no argument given to option '%c'\n", progname, c); exit(1); } s = argv[ind]; } switch (c) { case 'I': idle_timeout = strtol(s, 0, 0); break; #if ENABLE_Trace case 'l': log_level = s; parse_trace_mode(log_level, &log_mode); break; #endif case 'L': log_name = s; break; case 's': url = s; break; #if ENABLE_DebugContext case 'g': if (ini_gdb_rsp(s) < 0) { fprintf(stderr, "Cannot create GDB server: %s\n", errno_to_str(errno)); exit(1); } break; #endif #if ENABLE_Plugins case 'P': plugins_path = s; break; #endif } s = NULL; break; default: ILLEGAL_OPTION_HOOK; fprintf(stderr, "%s: error: illegal option '%c'\n", progname, c); show_help(); exit(1); } } } POST_OPTION_HOOK; if (daemon) { #if defined(_WIN32) || defined(__CYGWIN__) become_daemon(daemon > 1 ? argv : NULL); #else become_daemon(); #endif } open_log_file(log_name); #endif bcg = broadcast_group_alloc(); proto = protocol_alloc(); /* The static services must be initialised before the plugins */ #if ENABLE_Cmdline if (interactive) ini_cmdline_handler(interactive, proto); #else if (interactive) fprintf(stderr, "Warning: This version does not support interactive mode.\n"); #endif ini_services(proto, bcg); #if !defined(_WRS_KERNEL) /* Reparse log level in case initialization cause additional * levels to be registered */ if (log_level != NULL && parse_trace_mode(log_level, &log_mode) != 0) { fprintf(stderr, "Cannot parse log level: %s\n", log_level); exit(1); } #endif if (ini_server(url, proto, bcg) < 0) { fprintf(stderr, "Cannot create TCF server: %s\n", errno_to_str(errno)); exit(1); } discovery_start(); if (print_server_properties) { ChannelServer * s; char * server_properties; assert(!list_is_empty(&channel_server_root)); s = servlink2channelserverp(channel_server_root.next); server_properties = channel_peer_to_json(s->ps); printf("Server-Properties: %s\n", server_properties); fflush(stdout); trace(LOG_ALWAYS, "Server-Properties: %s", server_properties); loc_free(server_properties); } PRE_DAEMON_HOOK; #if !defined(_WRS_KERNEL) if (daemon) close_out_and_err(); #endif #if ENABLE_SignalHandlers signal(SIGABRT, signal_handler); signal(SIGILL, signal_handler); signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); #if defined(_WIN32) || defined(__CYGWIN__) SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); AddVectoredExceptionHandler(1, VectoredExceptionHandler); #endif #endif /* ENABLE_SignalHandlers */ if (idle_timeout != 0) { add_channel_close_listener(channel_closed); check_idle_timeout(NULL); } /* Process events - must run on the initial thread since ptrace() * returns ECHILD otherwise, thinking we are not the owner. */ run_event_loop(); #if ENABLE_Plugins plugins_destroy(); #endif /* ENABLE_Plugins */ return 0; }