コード例 #1
0
ファイル: dispd-dbus.c プロジェクト: derekdai/miraclecast
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;
	}
コード例 #2
0
ファイル: dispd-dbus.c プロジェクト: derekdai/miraclecast
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;
}
コード例 #3
0
ファイル: wifid.c プロジェクト: Al3n/miraclecast
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;
}