int main(int argc, char **argv) { int rc = 0; rc = config_load(); if (rc) { ERROR("configuration loading failed\n"); exit(EXIT_FAILURE); } rc = uloop_init(); if (rc) { ERROR("uloop init failed\n"); exit(EXIT_FAILURE); } rc = ssh_netconf_init(); if (rc) { ERROR("ssh init failed\n"); exit(EXIT_FAILURE); } rc = ubus_init(); if (rc) { ERROR("ubus init failed\n"); exit(EXIT_FAILURE); } LOG("freenetconfd is listening on address:'%s', port:'%s'\n", config.addr, config.port); /* main loop */ uloop_run(); ssh_netconf_exit(); uloop_done(); ubus_exit(); config_exit(); return EXIT_SUCCESS; }
int main (int argc, char **argv) { int c; int start_event = 0; bool foreground = false; while (1) { c = getopt_long(argc, argv, "fhbgv", long_opts, NULL); if (c == EOF) break; switch (c) { case 'b': start_event |= START_BOOT; break; case 'f': foreground = true; break; case 'g': start_event |= START_GET_RPC_METHOD; break; case 'h': print_help(); exit(EXIT_SUCCESS); case 'v': print_version(); exit(EXIT_SUCCESS); default: print_help(); exit(EXIT_FAILURE); } } log_message(NAME, L_DEBUG, "daemon started\n"); setlocale(LC_CTYPE, ""); umask(0037); if (getuid() != 0) { D("run %s as root\n", NAME); exit(EXIT_FAILURE); } /* run early cwmp initialization */ cwmp = calloc(1, sizeof(struct cwmp_internal)); if (!cwmp) return -1; INIT_LIST_HEAD(&cwmp->events); INIT_LIST_HEAD(&cwmp->notifications); INIT_LIST_HEAD(&cwmp->downloads); INIT_LIST_HEAD(&cwmp->scheduled_informs); uloop_init(); backup_init(); config_load(); cwmp_init_deviceid(); if (start_event & START_BOOT) { cwmp_add_event(EVENT_BOOT, NULL, 0, EVENT_BACKUP); cwmp_add_inform_timer(); } if (start_event & START_GET_RPC_METHOD) { cwmp->get_rpc_methods = true; cwmp_add_event(EVENT_PERIODIC, NULL, 0, EVENT_BACKUP); cwmp_add_inform_timer(); } if (netlink_init()) { D("netlink initialization failed\n"); exit(EXIT_FAILURE); } if (ubus_init()) D("ubus initialization failed\n"); http_server_init(); pid_t pid, sid; if (!foreground) { pid = fork(); if (pid < 0) exit(EXIT_FAILURE); if (pid > 0) exit(EXIT_SUCCESS); sid = setsid(); if (sid < 0) { D("setsid() returned error\n"); exit(EXIT_FAILURE); } char *directory = "/"; if ((chdir(directory)) < 0) { D("chdir() returned error\n"); exit(EXIT_FAILURE); } } log_message(NAME, L_DEBUG, "entering main loop\n"); uloop_run(); ubus_exit(); uloop_done(); http_client_exit(); xml_exit(); config_exit(); cwmp_free_deviceid(); free(cwmp); closelog(); log_message(NAME, L_DEBUG, "exiting\n"); return 0; }