static void plugin_pthread_manager_stop() { context_iterate(plugin_pthread_cancel_connection_loop); manager_stop(); }
int main(int argc, char *argv[]) { GOptionContext *context; GError *gerr = NULL; GIOChannel *inotify_io; struct stat sb; int err, retval = 0; int inotifyFD, wd; guint watch_id; context = g_option_context_new(NULL); g_option_context_add_main_entries(context, options, NULL); if (!g_option_context_parse(context, &argc, &argv, &gerr)) { g_printerr("Invalid arguments: %s\n", gerr->message); g_error_free(gerr); g_option_context_free(context); return EXIT_FAILURE; } g_option_context_free(context); if (stat(opt_cfg, &sb) == -1) { err = errno; g_printerr("%s: %s(%d)\n", opt_cfg, strerror(err), err); return EXIT_FAILURE; } if ((sb.st_mode & S_IFMT) != S_IFREG) { g_printerr("%s is not a regular file!\n", opt_cfg); return EXIT_FAILURE; } if (!opt_nodes) { g_printerr("Missing KNOT known nodes file!\n"); return EXIT_FAILURE; } signal(SIGTERM, sig_term); signal(SIGINT, sig_term); signal(SIGPIPE, SIG_IGN); main_loop = g_main_loop_new(NULL, FALSE); hal_log_init("nrfd", opt_detach); hal_log_info("KNOT HAL nrfd"); if (opt_host) hal_log_error("Development mode: %s:%u", opt_host, opt_port); err = manager_start(opt_cfg, opt_host, opt_port, opt_spi, opt_channel, opt_dbm, opt_nodes); if (err < 0) { hal_log_error("manager_start(): %s(%d)", strerror(-err), -err); g_main_loop_unref(main_loop); hal_log_close(); return EXIT_FAILURE; } /* Set user id to nobody */ if (setuid(65534) != 0) { err = errno; hal_log_error("Set uid to nobody failed. %s(%d). Exiting...", strerror(err), err); manager_stop(); hal_log_close(); return EXIT_FAILURE; } /* Starting inotify */ inotifyFD = inotify_init(); wd = inotify_add_watch(inotifyFD, opt_cfg, IN_MODIFY); if (wd == -1) { hal_log_error("Error adding watch on: %s", opt_cfg); close(inotifyFD); manager_stop(); hal_log_close(); return EXIT_FAILURE; } /* Setting gio channel to watch inotify fd*/ inotify_io = g_io_channel_unix_new(inotifyFD); watch_id = g_io_add_watch(inotify_io, G_IO_IN, inotify_cb, NULL); g_io_channel_set_close_on_unref(inotify_io, TRUE); if (opt_detach) { if (daemon(0, 0)) { hal_log_error("Can't start daemon!"); retval = EXIT_FAILURE; goto done; } } g_main_loop_run(main_loop); done: g_source_remove(watch_id); inotify_rm_watch(inotifyFD, wd); g_io_channel_unref(inotify_io); manager_stop(); hal_log_error("exiting ..."); hal_log_close(); g_main_loop_unref(main_loop); return retval; }
static void _break_cond(int i) { if (i > 1) manager_stop(); }