int main ( int argc, char* argv[] ) { pgm_error_t* pgm_err = NULL; #ifdef CONFIG_WITH_HTTP gboolean enable_http = FALSE; #endif #ifdef CONFIG_WITH_SNMP gboolean enable_snmpx = FALSE; #endif setlocale (LC_ALL, ""); /* pre-initialise PGM messages module to add hook for GLib logging */ pgm_messages_init(); log_init (); g_message ("pgmrecv"); if (!pgm_init (&pgm_err)) { g_error ("Unable to start PGM engine: %s", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); pgm_error_free (pgm_err); pgm_messages_shutdown(); return EXIT_FAILURE; } g_thread_init (NULL); /* parse program arguments */ const char* binary_name = strrchr (argv[0], '/'); static struct option long_options[] = { { "network", required_argument, NULL, 'n' }, { "service", required_argument, NULL, 's' }, { "port", required_argument, NULL, 'p' }, { "enable-loop", no_argument, NULL, 'l' }, #ifdef CONFIG_WITH_HTTP { "enable-http", no_argument, NULL, 'H' }, #endif #ifdef CONFIG_WITH_SNMP { "enable-snmp", no_argument, NULL, 'S' }, #endif { "list", no_argument, NULL, 'i' }, { "help", no_argument, NULL, 'h' }, { NULL, 0, NULL, 0 } }; int c; while ((c = getopt_long (argc, argv, "a:s:n:p:lih" #ifdef CONFIG_WITH_HTTP "H" #endif #ifdef CONFIG_WITH_SNMP "S" #endif , long_options, NULL)) != -1) { switch (c) { case 'n': g_network = optarg; break; case 'a': g_source = optarg; break; case 's': g_port = atoi (optarg); break; case 'p': g_udp_encap_port = atoi (optarg); break; case 'l': g_multicast_loop = TRUE; break; #ifdef CONFIG_WITH_HTTP case 'H': enable_http = TRUE; break; #endif #ifdef CONFIG_WITH_SNMP case 'S': enable_snmpx = TRUE; break; #endif case 'i': pgm_if_print_all(); pgm_messages_shutdown(); return EXIT_SUCCESS; case 'h': case '?': pgm_messages_shutdown(); usage (binary_name); } } #ifdef CONFIG_WITH_HTTP if (enable_http) { if (!pgm_http_init (PGM_HTTP_DEFAULT_SERVER_PORT, &pgm_err)) { g_error ("Unable to start HTTP interface: %s", pgm_err->message); pgm_error_free (pgm_err); pgm_shutdown(); pgm_messages_shutdown(); return EXIT_FAILURE; } } #endif #ifdef CONFIG_WITH_SNMP if (enable_snmpx) { if (!pgm_snmp_init (&pgm_err)) { g_error ("Unable to start SNMP interface: %s", pgm_err->message); pgm_error_free (pgm_err); #ifdef CONFIG_WITH_HTTP if (enable_http) pgm_http_shutdown (); #endif pgm_shutdown (); pgm_messages_shutdown(); return EXIT_FAILURE; } } #endif g_loop = g_main_loop_new (NULL, FALSE); g_quit = FALSE; /* setup signal handlers */ signal (SIGSEGV, on_sigsegv); #ifdef SIGHUP signal (SIGHUP, SIG_IGN); #endif #ifdef G_OS_UNIX const int e = pipe (g_quit_pipe); g_assert (0 == e); pgm_signal_install (SIGINT, on_signal, g_loop); pgm_signal_install (SIGTERM, on_signal, g_loop); #else g_quit_event = CreateEvent (NULL, TRUE, FALSE, TEXT("QuitEvent")); SetConsoleCtrlHandler ((PHANDLER_ROUTINE)on_console_ctrl, TRUE); setvbuf (stdout, (char *) NULL, _IONBF, 0); #endif /* delayed startup */ g_message ("scheduling startup."); g_timeout_add (0, (GSourceFunc)on_startup, NULL); /* dispatch loop */ g_message ("entering main event loop ... "); g_main_loop_run (g_loop); g_message ("event loop terminated, cleaning up."); /* cleanup */ g_quit = TRUE; #ifdef G_OS_UNIX const char one = '1'; const size_t writelen = write (g_quit_pipe[1], &one, sizeof(one)); g_assert (sizeof(one) == writelen); g_thread_join (g_thread); close (g_quit_pipe[0]); close (g_quit_pipe[1]); #else WSASetEvent (g_quit_event); g_thread_join (g_thread); WSACloseEvent (g_quit_event); #endif g_main_loop_unref (g_loop); g_loop = NULL; if (g_sock) { g_message ("closing PGM socket."); pgm_close (g_sock, TRUE); g_sock = NULL; } #ifdef CONFIG_WITH_HTTP if (enable_http) pgm_http_shutdown(); #endif #ifdef CONFIG_WITH_SNMP if (enable_snmpx) pgm_snmp_shutdown(); #endif g_message ("PGM engine shutdown."); pgm_shutdown(); g_message ("finished."); pgm_messages_shutdown(); return EXIT_SUCCESS; }
int main ( int argc, char* argv[] ) { pgm_transport_list = NULL; g_message ("pgmrecv"); #ifdef CONFIG_WITH_HTTP gboolean enable_http = FALSE; #endif #ifdef CONFIG_WITH_SNMP gboolean enable_snmpx = FALSE; #endif /* parse program arguments */ const char* binary_name = strrchr (argv[0], '/'); int c; while ((c = getopt (argc, argv, "a:s:n:p:lh" #ifdef CONFIG_WITH_HTTP "t" #endif #ifdef CONFIG_WITH_SNMP "x" #endif )) != -1) { switch (c) { case 'n': g_network = optarg; break; case 'a': g_source = optarg; break; case 's': g_port = atoi (optarg); break; case 'p': g_udp_encap_port = atoi (optarg); break; case 'l': g_multicast_loop = TRUE; break; #ifdef CONFIG_WITH_HTTP case 't': enable_http = TRUE; break; #endif #ifdef CONFIG_WITH_SNMP case 'x': enable_snmpx = TRUE; break; #endif case 'h': case '?': usage (binary_name); } } log_init(); pgm_init(); #ifdef CONFIG_WITH_HTTP if (enable_http) pgm_http_init(PGM_HTTP_DEFAULT_SERVER_PORT); #endif #ifdef CONFIG_WITH_SNMP if (enable_snmpx) pgm_snmp_init(); #endif g_loop = g_main_loop_new (NULL, FALSE); /* setup signal handlers */ signal(SIGSEGV, on_sigsegv); pgm_signal_install(SIGINT, on_signal); pgm_signal_install(SIGTERM, on_signal); pgm_signal_install(SIGHUP, SIG_IGN); /* delayed startup */ g_message ("scheduling startup."); g_timeout_add (0, (GSourceFunc)on_startup, NULL); /* dispatch loop */ g_message ("entering main event loop ... "); g_main_loop_run (g_loop); g_message ("event loop terminated, cleaning up."); /* cleanup */ g_quit = TRUE; g_thread_join (g_thread); g_main_loop_unref(g_loop); g_loop = NULL; if (g_transport) { g_message ("destroying transport."); pgm_transport_destroy (g_transport, TRUE); g_transport = NULL; } #ifdef CONFIG_WITH_HTTP if (enable_http) pgm_http_shutdown(); #endif #ifdef CONFIG_WITH_SNMP if (enable_snmpx) pgm_snmp_shutdown(); #endif g_message ("finished."); return 0; }