/* * ZFS Event Daemon (ZED). */ int main(int argc, char *argv[]) { struct zed_conf *zcp; uint64_t saved_eid; int64_t saved_etime[2]; zed_log_init(argv[0]); zed_log_stderr_open(LOG_NOTICE); zcp = zed_conf_create(); zed_conf_parse_opts(zcp, argc, argv); if (zcp->do_verbose) zed_log_stderr_open(LOG_INFO); if (geteuid() != 0) zed_log_die("Must be run as root"); zed_conf_parse_file(zcp); zed_file_close_from(STDERR_FILENO + 1); (void) umask(0); if (chdir("/") < 0) zed_log_die("Failed to change to root directory"); if (zed_conf_scan_dir(zcp) < 0) exit(EXIT_FAILURE); if (!zcp->do_foreground) { _start_daemonize(); zed_log_syslog_open(LOG_DAEMON); } _setup_sig_handlers(); if (zcp->do_memlock) _lock_memory(); if ((zed_conf_write_pid(zcp) < 0) && (!zcp->do_force)) exit(EXIT_FAILURE); if (!zcp->do_foreground) _finish_daemonize(); zed_log_msg(LOG_NOTICE, "ZFS Event Daemon %s-%s (PID %d)", ZFS_META_VERSION, ZFS_META_RELEASE, (int) getpid()); if (zed_conf_open_state(zcp) < 0) exit(EXIT_FAILURE); if (zed_conf_read_state(zcp, &saved_eid, saved_etime) < 0) exit(EXIT_FAILURE); retry: if (zed_event_init(zcp)) { /* * If we failed to open /dev/zfs, but force was requested, we * sleep waiting for it to come alive. This lets zed sit around * waiting for the kernel module to load. */ if (zcp->do_force) { sleep(30); if (!_got_exit) goto retry; } zed_log_die("Failed to initialize libzfs"); } zed_event_seek(zcp, saved_eid, saved_etime); while (!_got_exit) { if (_got_hup) { _got_hup = 0; (void) zed_conf_scan_dir(zcp); } if (zed_event_service(zcp)) break; } zed_log_msg(LOG_NOTICE, "Exiting"); zed_event_fini(zcp); if (zcp->do_force && !_got_exit) { goto retry; } zed_conf_destroy(zcp); zed_log_fini(); exit(EXIT_SUCCESS); }
/* * ZFS Event Daemon (ZED). */ int main(int argc, char *argv[]) { struct zed_conf *zcp; uint64_t saved_eid; int64_t saved_etime[2]; zed_log_init(argv[0]); zed_log_stderr_open(LOG_NOTICE); zcp = zed_conf_create(); zed_conf_parse_opts(zcp, argc, argv); if (zcp->do_verbose) zed_log_stderr_open(LOG_INFO); if (geteuid() != 0) zed_log_die("Must be run as root"); zed_conf_parse_file(zcp); zed_file_close_from(STDERR_FILENO + 1); (void) umask(0); if (chdir("/") < 0) zed_log_die("Failed to change to root directory"); if (zed_conf_scan_dir(zcp) < 0) exit(EXIT_FAILURE); if (!zcp->do_foreground) { _start_daemonize(); zed_log_syslog_open(LOG_DAEMON); } _setup_sig_handlers(); if (zcp->do_memlock) _lock_memory(); (void) zed_conf_write_pid(zcp); if (!zcp->do_foreground) _finish_daemonize(); zed_log_msg(LOG_NOTICE, "ZFS Event Daemon %s-%s (PID %d)", ZFS_META_VERSION, ZFS_META_RELEASE, (int) getpid()); if (zed_conf_open_state(zcp) < 0) exit(EXIT_FAILURE); if (zed_conf_read_state(zcp, &saved_eid, saved_etime) < 0) exit(EXIT_FAILURE); zed_event_init(zcp); zed_event_seek(zcp, saved_eid, saved_etime); while (!_got_exit) { if (_got_hup) { _got_hup = 0; (void) zed_conf_scan_dir(zcp); } zed_event_service(zcp); } zed_log_msg(LOG_NOTICE, "Exiting"); zed_event_fini(zcp); zed_conf_destroy(zcp); zed_log_fini(); exit(EXIT_SUCCESS); }