void manager_workqueue_create(struct _pthread_workqueue *workq) { pthread_mutex_lock(&wqlist_mtx); if (!workq->overcommit && !wqlist_has_manager) manager_start(); if (workq->overcommit) { if (ocwq[workq->queueprio] == NULL) { ocwq[workq->queueprio] = workq; workq->wqlist_index = workq->queueprio; } else { puts("queue already exists\n"); abort(); } } else { if (wqlist[workq->queueprio] == NULL) { wqlist[workq->queueprio] = workq; //FIXME: sort by priority workq->wqlist_index = workq->queueprio; } else { puts("queue already exists\n"); abort(); } } pthread_mutex_unlock(&wqlist_mtx); }
int main(int argc, char *argv[]) { _cleanup_(manager_freep) Manager *m = NULL; const char *user = "******"; uid_t uid; gid_t gid; int r; log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); if (argc != 1) { log_error("This program takes no arguments."); r = -EINVAL; goto finish; } umask(0022); r = mac_selinux_init(NULL); if (r < 0) { log_error_errno(r, "SELinux setup failed: %m"); goto finish; } r = get_user_creds(&user, &uid, &gid, NULL, NULL); if (r < 0) { log_error_errno(r, "Cannot resolve user name %s: %m", user); goto finish; } /* Always create the directory where resolv.conf will live */ r = mkdir_safe_label("/run/systemd/resolve", 0755, uid, gid); if (r < 0) { log_error_errno(r, "Could not create runtime directory: %m"); goto finish; } r = drop_privileges(uid, gid, 0); if (r < 0) goto finish; assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, -1) >= 0); r = manager_new(&m); if (r < 0) { log_error_errno(r, "Could not create manager: %m"); goto finish; } r = manager_start(m); if (r < 0) { log_error_errno(r, "Failed to start manager: %m"); goto finish; } /* Write finish default resolv.conf to avoid a dangling * symlink */ r = manager_write_resolv_conf(m); if (r < 0) log_warning_errno(r, "Could not create resolv.conf: %m"); sd_notify(false, "READY=1\n" "STATUS=Processing requests..."); r = sd_event_loop(m->event); if (r < 0) { log_error_errno(r, "Event loop failed: %m"); goto finish; } sd_event_get_exit_code(m->event, &r); finish: sd_notify(false, "STOPPING=1\n" "STATUS=Shutting down..."); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }
int main(int argc, char *argv[]) { _cleanup_(manager_freep) Manager *m = NULL; const char *user = "******"; uid_t uid; gid_t gid; int r; log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); if (argc != 1) { log_error("This program takes no arguments."); r = -EINVAL; goto finish; } umask(0022); r = mac_selinux_init(); if (r < 0) { log_error_errno(r, "SELinux setup failed: %m"); goto finish; } r = get_user_creds(&user, &uid, &gid, NULL, NULL); if (r < 0) { log_error_errno(r, "Cannot resolve user name %s: %m", user); goto finish; } /* Always create the directory where resolv.conf will live */ r = mkdir_safe_label("/run/systemd/resolve", 0755, uid, gid, false); if (r < 0) { log_error_errno(r, "Could not create runtime directory: %m"); goto finish; } /* Drop privileges, but only if we have been started as root. If we are not running as root we assume all * privileges are already dropped. */ if (getuid() == 0) { /* Drop privileges, but keep three caps. Note that we drop those too, later on (see below) */ r = drop_privileges(uid, gid, (UINT64_C(1) << CAP_NET_RAW)| /* needed for SO_BINDTODEVICE */ (UINT64_C(1) << CAP_NET_BIND_SERVICE)| /* needed to bind on port 53 */ (UINT64_C(1) << CAP_SETPCAP) /* needed in order to drop the caps later */); if (r < 0) goto finish; } assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, SIGUSR2, SIGRTMIN+1, -1) >= 0); r = manager_new(&m); if (r < 0) { log_error_errno(r, "Could not create manager: %m"); goto finish; } r = manager_start(m); if (r < 0) { log_error_errno(r, "Failed to start manager: %m"); goto finish; } /* Write finish default resolv.conf to avoid a dangling symlink */ (void) manager_write_resolv_conf(m); /* Let's drop the remaining caps now */ r = capability_bounding_set_drop(0, true); if (r < 0) { log_error_errno(r, "Failed to drop remaining caps: %m"); goto finish; } sd_notify(false, "READY=1\n" "STATUS=Processing requests..."); r = sd_event_loop(m->event); if (r < 0) { log_error_errno(r, "Event loop failed: %m"); goto finish; } sd_event_get_exit_code(m->event, &r); finish: sd_notify(false, "STOPPING=1\n" "STATUS=Shutting down..."); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }
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 plugin_pthread_manager_start() { manager_start(); context_iterate(plugin_pthread_connection_loop); }