int main (int argc, char **argv) { err_init (argv[0]); err_set_flags (ERROR_STDERR); ipmidetectd_argp_parse (argc, argv, &cmd_args); ipmidetectd_config_setup (argc, argv); if (!cmd_args.debug) { daemonize_common (IPMIDETECTD_PIDFILE); err_set_flags (ERROR_SYSLOG); } else err_set_flags (ERROR_STDERR); daemon_signal_handler_setup (_signal_handler_callback); /* Call after daemonization, since daemonization closes currently * open fds */ openlog (argv[0], LOG_ODELAY | LOG_PID, LOG_DAEMON); _ipmidetectd_loop (); return (0); }
int main(int argc, char *argv[]) { err_init(argv[0]); err_set_flags(ERROR_STDERR); #if CEREBRO_DEBUG cerebro_err_init(argv[0]); #endif /* CEREBRO_DEBUG */ _init_cerebro_stat(); _cmdline_parse(argc, argv); /* Checks in _cmdline_parse ensure only one of four below will be called */ if (event_list_flag || (event_name && !strcmp(event_name, CEREBRO_EVENT_NAMES))) _event_list(); if (metric_list_flag || (metric_name && !strcmp(metric_name, CEREBRO_METRIC_METRIC_NAMES))) _metric_list(); if (metric_name && strcmp(metric_name, CEREBRO_METRIC_METRIC_NAMES)) _metric_data(); if (event_name) _event_data(); _cleanup_cerebro_stat(); exit(0); }
int main(int argc, char *argv[]) { const char *func = __FUNCTION__; int rv = 0; err_init(argv[0]); err_set_flags(ERROR_STDERR); #if CEREBRO_DEBUG cerebro_err_init(argv[0]); #endif /* CEREBRO_DEBUG */ _init_cerebro_admin(); _cmdline_parse(argc, argv); if (operation == CEREBRO_ADMIN_REGISTER) rv = cerebro_register_metric(handle, metric_name); else if (operation == CEREBRO_ADMIN_UNREGISTER) rv = cerebro_unregister_metric(handle, metric_name); else if (operation == CEREBRO_ADMIN_UPDATE) rv = cerebro_update_metric_value(handle, metric_name, metric_value_type, metric_value_len, metric_value_ptr); else if (operation == CEREBRO_ADMIN_RESEND) rv = cerebro_resend_metric(handle, metric_name); else if (operation == CEREBRO_ADMIN_FLUSH) rv = cerebro_flush_metric(handle, metric_name); if (rv < 0) { char *msg = cerebro_strerror(cerebro_errnum(handle)); _clean_err_exit(cerebro_errnum(handle)); err_exit("%s: %s", func, msg); } _cleanup_cerebro_stat(); exit(0); }
int main (int argc, char **argv) { err_init (argv[0]); err_set_flags (ERROR_STDERR); ipmi_disable_coredump (); bmc_watchdog_argp_parse (argc, argv, &cmd_args); /* Early initialization. Daemon must do all initialization in * daemon_init() b/c daemon_init() needs to close all formerly open * file descriptors. */ if (!cmd_args.daemon) _init_bmc_watchdog (); if (cmd_args.set) _set_cmd (); else if (cmd_args.get) _get_cmd (); else if (cmd_args.reset) _reset_cmd (); else if (cmd_args.start) _start_cmd (); else if (cmd_args.stop) _stop_cmd (); else if (cmd_args.clear) _clear_cmd (); else if (cmd_args.daemon) _daemon_cmd (argv[0]); else err_exit ("internal error, command not set"); ipmi_ctx_close (ipmi_ctx); ipmi_ctx_destroy (ipmi_ctx); closelog (); exit (EXIT_SUCCESS); }
static void _daemon_cmd (const char *progname) { uint32_t reset_period = BMC_WATCHDOG_RESET_PERIOD_DEFAULT; uint8_t timer_use, timer_state, log, timeout_action, pre_timeout_interrupt, pre_timeout_interval; uint16_t initial_countdown_seconds; uint16_t previous_present_countdown_seconds = 0; uint16_t present_countdown_seconds; assert (progname); /* Run in foreground if debugging */ if (!cmd_args.common_args.debug) daemonize_common (BMC_WATCHDOG_PIDFILE); daemon_signal_handler_setup (_signal_handler_callback); /* move error outs to syslog from stderr */ if (!cmd_args.no_logging) err_set_flags (ERROR_SYSLOG); else err_set_flags (0); openlog (progname, LOG_ODELAY | LOG_PID, LOG_DAEMON); _init_bmc_watchdog (); _daemon_setup (); if (cmd_args.reset_period) reset_period = cmd_args.reset_period_arg; retry_wait_time = BMC_WATCHDOG_RETRY_WAIT_TIME_DEFAULT; retry_attempts = BMC_WATCHDOG_RETRY_ATTEMPTS_DEFAULT; if ((retry_wait_time * retry_attempts) > reset_period) { retry_wait_time = 0; retry_attempts = 0; } else if (reset_period > retry_wait_time && reset_period < (retry_wait_time * retry_attempts)) retry_attempts = reset_period/retry_wait_time; /* IPMI Workaround * * Discovered on Sun x4100M2 and x4200M2 * * If implementing the IGNORE_STATE_FLAG workaround flag below, we * need to sleep a little bit to make sure the BMC timer has really * started. * * From 27.7 "Internal delays in the BMC may require software to * delay up to 100 ms before seeing the countdown value change and * be reflected in the Get Watchdog Timer command". */ if (cmd_args.common_args.section_specific_workaround_flags & IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IGNORE_STATE_FLAG) daemon_sleep (1); while (shutdown_flag) { struct timeval start_tv, end_tv; uint32_t adjusted_period; if (gettimeofday (&start_tv, NULL) < 0) err_exit ("gettimeofday: %s", strerror (errno)); if (_get_watchdog_timer_cmd (NULL, &timer_state, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &present_countdown_seconds) < 0) { _daemon_cmd_err_no_exit ("Get Watchdog Timer"); goto sleep_now; } /* IPMI Workaround * * Discovered on Sun x4100M2 and x4200M2 * * On some BMCs, the timer state flag is not functional. Therefore, * to have an operational BMC watchdog, it must function without it. * We instead look to see if the timer is changing. */ if (cmd_args.common_args.section_specific_workaround_flags & IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IGNORE_STATE_FLAG) { if (previous_present_countdown_seconds == present_countdown_seconds) { err_output ("timer stopped by another process"); return; } previous_present_countdown_seconds = present_countdown_seconds; } else { if (timer_state == IPMI_BMC_WATCHDOG_TIMER_TIMER_STATE_STOPPED) { err_output ("timer stopped by another process"); return; } } if (_reset_watchdog_timer_cmd () < 0) { _daemon_cmd_err_no_exit ("Reset Watchdog Timer"); goto sleep_now; } /* IPMI Workaround * * Discovered on Sun x4100M2 and x4200M2 * * If implementing the IGNORE_STATE_FLAG workaround flag above, * we need to reset the previous_present_countdown_seconds to * what it is after the timer reset. */ if (cmd_args.common_args.section_specific_workaround_flags & IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IGNORE_STATE_FLAG) { /* From 27.7 "Internal delays in the BMC may require software to * delay up to 100 ms before seeing the countdown value change and * be reflected in the Get Watchdog Timer command". */ daemon_sleep (1); if (_get_watchdog_timer_cmd (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &present_countdown_seconds) < 0) { _daemon_cmd_err_no_exit ("Get Watchdog Timer"); goto sleep_now; } previous_present_countdown_seconds = present_countdown_seconds; } sleep_now: if (gettimeofday (&end_tv, NULL) < 0) err_exit ("gettimeofday: %s", strerror (errno)); adjusted_period = reset_period; /* Ignore micro secs, just seconds is good enough */ if ((end_tv.tv_sec - start_tv.tv_sec) < adjusted_period) adjusted_period -= (end_tv.tv_sec - start_tv.tv_sec); daemon_sleep (adjusted_period); } /* Need to stop the timer, don't want it to keep on going. Don't * give up until its shut off. */ /* set back to defaults, no reset-period adjustment anymore */ retry_wait_time = BMC_WATCHDOG_RETRY_WAIT_TIME_DEFAULT; retry_attempts = BMC_WATCHDOG_RETRY_ATTEMPTS_DEFAULT; while (1) { if (_get_watchdog_timer_cmd (&timer_use, NULL, &log, &timeout_action, &pre_timeout_interrupt, &pre_timeout_interval, NULL, NULL, NULL, NULL, NULL, &initial_countdown_seconds, NULL) < 0) { _daemon_cmd_err_no_exit ("Get Watchdog Timer"); daemon_sleep (BMC_WATCHDOG_RETRY_WAIT_TIME_DEFAULT); continue; } break; } while (1) { if (_set_watchdog_timer_cmd (timer_use, IPMI_BMC_WATCHDOG_TIMER_STOP_TIMER_ENABLE, log, timeout_action, pre_timeout_interrupt, pre_timeout_interval, 0, 0, 0, 0, 0, initial_countdown_seconds) < 0) { _daemon_cmd_err_no_exit ("Set Watchdog Timer"); daemon_sleep (BMC_WATCHDOG_RETRY_WAIT_TIME_DEFAULT); continue; } break; } }