static int dispd_dbus_enum(sd_bus *bus, const char *path, void *userdata, char ***out, sd_bus_error *out_error) { int r = 0, i = 0; char **nodes, *node; struct dispd_sink *sink; struct dispd_session *session; struct dispd *dispd = dispd_get(); if(strcmp("/org/freedesktop/miracle/wfd", path)) { return 0; } if(!dispd->n_sinks) { return 0; } nodes = malloc((dispd->n_sinks + dispd->n_sessions + 1) * sizeof(char *)); if(!nodes) { return log_ENOMEM(); } dispd_foreach_sink(sink, dispd) { r = dispd_dbus_get_sink_path(sink, &node); if(0 > r) { goto free_nodes; } nodes[i ++] = node; }
int dispd_dbus_new(struct dispd_dbus **out, sd_event *loop, sd_bus *bus) { struct dispd_dbus *dispd_dbus = calloc(1, sizeof(struct dispd_dbus)); if(!dispd_dbus) { return log_ENOMEM(); } dispd_dbus->bus = sd_bus_ref(bus); dispd_dbus->loop = sd_event_ref(loop); *out = dispd_dbus; return 0; }
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; }