/* Entry point */ int main(int argc, char **argv) { /* Init debugging level */ mem_allocated = 0; debug = 0; /* * Parse command line and set debug level. * bits 0..7 reserved by main.c */ parse_cmdline(argc, argv); openlog(PROG, LOG_PID | ((debug & 1) ? LOG_CONS : 0), log_facility); log_message(LOG_INFO, "Starting " VERSION_STRING); /* Check if keepalived is already running */ if (keepalived_running(daemon_mode)) { log_message(LOG_INFO, "daemon is already running"); goto end; } if (debug & 1) enable_console_log(); /* daemonize process */ if (!(debug & 2)) xdaemon(0, 0, 0); /* write the father's pidfile */ if (!pidfile_write(main_pidfile, getpid())) goto end; #ifndef _DEBUG_ /* Signal handling initialization */ signal_init(); #endif /* Create the master thread */ master = thread_make_master(); /* Init daemon */ start_keepalived(); #ifndef _DEBUG_ /* Launch the scheduling I/O multiplexer */ launch_scheduler(); /* Finish daemon process */ stop_keepalived(); #endif /* * Reached when terminate signal catched. * finally return from system */ end: closelog(); exit(0); }
/* Entry point */ int main(int argc, char **argv) { int report_stopped = true; /* Init debugging level */ debug = 0; /* Initialise daemon_mode */ __set_bit(DAEMON_VRRP, &daemon_mode); __set_bit(DAEMON_CHECKERS, &daemon_mode); /* * Parse command line and set debug level. * bits 0..7 reserved by main.c */ parse_cmdline(argc, argv); openlog(PROG, LOG_PID | ((__test_bit(LOG_CONSOLE_BIT, &debug)) ? LOG_CONS : 0) , log_facility); #ifdef GIT_COMMIT log_message(LOG_INFO, "Starting %s, git commit %s", VERSION_STRING, GIT_COMMIT); #else log_message(LOG_INFO, "Starting %s", VERSION_STRING); #endif /* Check if keepalived is already running */ if (keepalived_running(daemon_mode)) { log_message(LOG_INFO, "daemon is already running"); report_stopped = false; goto end; } if (__test_bit(LOG_CONSOLE_BIT, &debug)) enable_console_log(); /* daemonize process */ if (!__test_bit(DONT_FORK_BIT, &debug)) xdaemon(0, 0, 0); /* write the father's pidfile */ if (!pidfile_write(main_pidfile, getpid())) goto end; #ifndef _DEBUG_ /* Signal handling initialization */ signal_init(); #endif /* Create the master thread */ master = thread_make_master(); /* Init daemon */ start_keepalived(); #ifndef _DEBUG_ /* Launch the scheduling I/O multiplexer */ launch_scheduler(); /* Finish daemon process */ stop_keepalived(); #endif /* * Reached when terminate signal catched. * finally return from system */ end: if (report_stopped) { #ifdef GIT_COMMIT log_message(LOG_INFO, "Stopped %s, git commit %s", VERSION_STRING, GIT_COMMIT); #else log_message(LOG_INFO, "Stopped %s", VERSION_STRING); #endif } closelog(); exit(0); }
/* Entry point */ int main(int argc, char **argv) { int report_stopped = true; /* Init debugging level */ debug = 0; /* Initialise daemon_mode */ __set_bit(DAEMON_VRRP, &daemon_mode); __set_bit(DAEMON_CHECKERS, &daemon_mode); /* * Parse command line and set debug level. * bits 0..7 reserved by main.c */ parse_cmdline(argc, argv); openlog(PROG, LOG_PID | ((__test_bit(LOG_CONSOLE_BIT, &debug)) ? LOG_CONS : 0) , log_facility); #ifdef GIT_COMMIT log_message(LOG_INFO, "Starting %s, git commit %s", VERSION_STRING, GIT_COMMIT); #else log_message(LOG_INFO, "Starting %s", VERSION_STRING); #endif #ifdef _MEM_CHECK_ mem_log_init(PROG); #endif /* Handle any core file requirements */ core_dump_init(); /* Check if keepalived is already running */ if (keepalived_running(daemon_mode)) { log_message(LOG_INFO, "daemon is already running"); report_stopped = false; goto end; } if (__test_bit(LOG_CONSOLE_BIT, &debug)) enable_console_log(); /* daemonize process */ if (!__test_bit(DONT_FORK_BIT, &debug)) xdaemon(0, 0, 0); /* Check we can read the configuration file(s). NOTE: the working directory will be / if we forked, but will be the current working directory when keepalived was run if we haven't forked. This means that if any config file names are not absolute file names, the behaviour will be different depending on whether we forked or not. */ if (!check_conf_file(conf_file)) goto end; /* write the father's pidfile */ if (!pidfile_write(main_pidfile, getpid())) goto end; #ifndef _DEBUG_ /* Signal handling initialization */ signal_init(); #endif /* Create the master thread */ master = thread_make_master(); /* Init daemon */ start_keepalived(); #ifndef _DEBUG_ /* Launch the scheduling I/O multiplexer */ launch_scheduler(); /* Finish daemon process */ stop_keepalived(); #endif /* * Reached when terminate signal catched. * finally return from system */ end: if (report_stopped) { #ifdef GIT_COMMIT log_message(LOG_INFO, "Stopped %s, git commit %s", VERSION_STRING, GIT_COMMIT); #else log_message(LOG_INFO, "Stopped %s", VERSION_STRING); #endif } /* Restore original core_pattern if necessary */ if (orig_core_dump_pattern) update_core_dump_pattern(orig_core_dump_pattern); closelog(); exit(0); }
/* Command line parser */ static void parse_cmdline(int argc, char **argv) { int c; struct option long_options[] = { {"use-file", required_argument, 0, 'f'}, {"vrrp", no_argument, 0, 'P'}, {"check", no_argument, 0, 'C'}, {"log-console", no_argument, 0, 'l'}, {"log-detail", no_argument, 0, 'D'}, {"log-facility", required_argument, 0, 'S'}, {"release-vips", no_argument, 0, 'X'}, {"dont-release-vrrp", no_argument, 0, 'V'}, {"dont-release-ipvs", no_argument, 0, 'I'}, {"dont-respawn", no_argument, 0, 'R'}, {"dont-fork", no_argument, 0, 'n'}, {"dump-conf", no_argument, 0, 'd'}, {"pid", required_argument, 0, 'p'}, {"vrrp_pid", required_argument, 0, 'r'}, {"checkers_pid", required_argument, 0, 'c'}, #ifdef _WITH_SNMP_ {"snmp", no_argument, 0, 'x'}, #endif {"version", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; #ifdef _WITH_SNMP_ while ((c = getopt_long(argc, argv, "vhlndVIDRS:f:PCp:c:r:x", long_options, NULL)) != EOF) { #else while ((c = getopt_long(argc, argv, "vhlndVIDRS:f:PCp:c:r:", long_options, NULL)) != EOF) { #endif switch (c) { case 'v': fprintf(stderr, VERSION_STRING); exit(0); break; case 'h': usage(argv[0]); exit(0); break; case 'l': debug |= DBG_OPT_LOG_CONSOLE; break; case 'n': debug |= DBG_OPT_DONT_FORK; break; case 'd': debug |= DBG_OPT_DUMP_CONF; break; case 'V': debug |= DBG_OPT_DONT_RELEASE_VRRP; break; case 'I': debug |= DBG_OPT_DONT_RELEASE_IPVS; break; case 'D': debug |= DBG_OPT_LOG_DETAIL; break; case 'R': debug |= DBG_OPT_DONT_RESPAWN; break; case 'X': debug |= DBG_OPT_RELEASE_VIPS; break; case 'S': log_facility = LOG_FACILITY[atoi(optarg)].facility; break; case 'f': conf_file = optarg; break; case 'P': daemon_mode |= 1; break; case 'C': daemon_mode |= 2; break; case 'p': main_pidfile = optarg; break; case 'c': checkers_pidfile = optarg; break; case 'r': vrrp_pidfile = optarg; break; #ifdef _WITH_SNMP_ case 'x': snmp = 1; break; #endif default: exit(0); break; } } if (optind < argc) { printf("Unexpected argument(s): "); while (optind < argc) printf("%s ", argv[optind++]); printf("\n"); } } /* Entry point */ int main(int argc, char **argv) { /* Init debugging level */ mem_allocated = 0; debug = 0; /* * Parse command line and set debug level. * bits 0..7 reserved by main.c */ parse_cmdline(argc, argv); openlog(PROG, LOG_PID | ((debug & DBG_OPT_LOG_CONSOLE) ? LOG_CONS : 0), log_facility); log_message(LOG_INFO, "Starting " VERSION_STRING); /* Check if keepalived is already running */ if (keepalived_running(daemon_mode)) { log_message(LOG_INFO, "daemon is already running"); goto end; } if (debug & DBG_OPT_LOG_CONSOLE) enable_console_log(); /* daemonize process */ if (!(debug & DBG_OPT_DONT_FORK)) xdaemon(0, 0, 0); /* write the father's pidfile */ if (!pidfile_write(main_pidfile, getpid())) goto end; #ifndef _DEBUG_ /* Signal handling initialization */ signal_init(); #endif /* Create the master thread */ master = thread_make_master(); /* Init daemon */ start_keepalived(); #ifndef _DEBUG_ /* Launch the scheduling I/O multiplexer */ launch_scheduler(); /* Finish daemon process */ stop_keepalived(); #endif /* * Reached when terminate signal catched. * finally return from system */ end: closelog(); exit(0); }