void doveadm_master_send_signal(int signo) { const char *pidfile_path; unsigned int i; pid_t pid; pidfile_path = t_strconcat(doveadm_settings->base_dir, "/"MASTER_PID_FILE_NAME, NULL); if (!pid_file_read(pidfile_path, &pid)) i_fatal("Dovecot is not running (read from %s)", pidfile_path); if (kill(pid, signo) < 0) i_fatal("kill(%s, %d) failed: %m", dec2str(pid), signo); if (signo == SIGTERM) { /* wait for a while for the process to die */ usleep(1000); for (i = 0; i < 30; i++) { if (kill(pid, 0) < 0) { if (errno != ESRCH) i_error("kill() failed: %m"); break; } usleep(100000); } } }
static void cmd_instance_list(int argc, char *argv[]) { struct master_instance_list *list; struct master_instance_list_iter *iter; const struct master_instance *inst; const char *instance_path, *pidfile_path; bool show_config = FALSE; int c; while ((c = getopt(argc, argv, "c")) > 0) { switch (c) { case 'c': show_config = TRUE; break; default: help(&doveadm_cmd_instance[0]); } } argv += optind; if (!show_config) { doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); doveadm_print_header("path", "path", DOVEADM_PRINT_HEADER_FLAG_EXPAND); doveadm_print_header_simple("name"); doveadm_print_header_simple("last used"); doveadm_print_header_simple("running"); } instance_path = t_strconcat(service_set->state_dir, "/"MASTER_INSTANCE_FNAME, NULL); list = master_instance_list_init(instance_path); iter = master_instance_list_iterate_init(list); while ((inst = master_instance_iterate_list_next(iter)) != NULL) { if (argv[0] != NULL && strcmp(argv[0], inst->name) != 0) continue; if (show_config) { printf("%s\n", inst->config_path == NULL ? "" : inst->config_path); continue; } doveadm_print(inst->base_dir); doveadm_print(inst->name); doveadm_print(unixdate2str(inst->last_used)); pidfile_path = t_strconcat(inst->base_dir, "/master.pid", NULL); if (pid_file_read(pidfile_path)) doveadm_print("yes"); else doveadm_print("no"); } master_instance_iterate_list_deinit(&iter); master_instance_list_deinit(&list); }