int main(int argc, char **argv) { struct manager *m = NULL; int r; srand(time(NULL)); r = parse_argv(argc, argv); if (r < 0) return EXIT_FAILURE; if (!r) return EXIT_SUCCESS; r = manager_new(&m); if (r < 0) goto finish; r = sd_notify(false, "READY=1\n" "STATUS=Running.."); if (r < 0) { log_vERR(r); goto finish; } r = manager_run(m); finish: sd_notify(false, "STATUS=Exiting.."); manager_free(m); log_debug("exiting.."); return abs(r); }
static int manager_new(struct manager **out) { struct manager *m; static const int sigs[] = { SIGINT, SIGTERM, SIGQUIT, SIGHUP, SIGPIPE, SIGCHLD, 0 }; unsigned int i; sigset_t mask; int r; m = calloc(1, sizeof(*m)); if (!m) return log_ENOMEM(); shl_htable_init_uint(&m->links); r = sd_event_default(&m->event); if (r < 0) { log_vERR(r); goto error; } r = sd_event_set_watchdog(m->event, true); if (r < 0) { log_vERR(r); goto error; } r = sd_bus_default_system(&m->bus); if (r < 0) { log_error("cannot connect to system bus: %d", r); goto error; } r = sd_bus_attach_event(m->bus, m->event, 0); if (r < 0) { log_vERR(r); goto error; } for (i = 0; sigs[i]; ++i) { sigemptyset(&mask); sigaddset(&mask, sigs[i]); sigprocmask(SIG_BLOCK, &mask, NULL); r = sd_event_add_signal(m->event, &m->sigs[i], sigs[i], manager_signal_fn, m); if (r < 0) { log_vERR(r); goto error; } /* low-priority to allow others to handle it first */ sd_event_source_set_priority(m->sigs[i], 100); } m->udev = udev_new(); if (!m->udev) { r = log_ENOMEM(); goto error; } m->udev_mon = udev_monitor_new_from_netlink(m->udev, "udev"); if (!m->udev_mon) { r = log_ENOMEM(); goto error; } r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_mon, "net", "wlan"); if (r < 0) { log_vERR(r); goto error; } r = udev_monitor_enable_receiving(m->udev_mon); if (r < 0) { log_vERR(r); goto error; } r = sd_event_add_io(m->event, &m->udev_mon_source, udev_monitor_get_fd(m->udev_mon), EPOLLHUP | EPOLLERR | EPOLLIN, manager_udev_fn, m); if (r < 0) { log_vERR(r); goto error; } r = manager_dbus_connect(m); if (r < 0) goto error; if (out) *out = m; return 0; error: manager_free(m); return r; }