static int busname_serialize(Unit *u, FILE *f, FDSet *fds) { BusName *n = BUSNAME(u); assert(n); assert(f); assert(fds); unit_serialize_item(u, f, "state", busname_state_to_string(n->state)); unit_serialize_item(u, f, "result", busname_result_to_string(n->result)); if (n->control_pid > 0) unit_serialize_item_format(u, f, "control-pid", PID_FMT, n->control_pid); if (n->starter_fd >= 0) { int copy; copy = fdset_put_dup(fds, n->starter_fd); if (copy < 0) return copy; unit_serialize_item_format(u, f, "starter-fd", "%i", copy); } return 0; }
static int automount_serialize(Unit *u, FILE *f, FDSet *fds) { Automount *a = AUTOMOUNT(u); void *p; Iterator i; assert(a); assert(f); assert(fds); unit_serialize_item(u, f, "state", automount_state_to_string(a->state)); unit_serialize_item(u, f, "result", automount_result_to_string(a->result)); unit_serialize_item_format(u, f, "dev-id", "%u", (unsigned) a->dev_id); SET_FOREACH(p, a->tokens, i) unit_serialize_item_format(u, f, "token", "%u", PTR_TO_UINT(p)); if (a->pipe_fd >= 0) { int copy; copy = fdset_put_dup(fds, a->pipe_fd); if (copy < 0) return copy; unit_serialize_item_format(u, f, "pipe-fd", "%i", copy); } return 0; }
static void test_fdset_put_dup(void) { _cleanup_close_ int fd = -1; int copyfd = -1; _cleanup_fdset_free_ FDSet *fdset = NULL; char name[] = "/tmp/test-fdset_put_dup.XXXXXX"; fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); fdset = fdset_new(); assert_se(fdset); copyfd = fdset_put_dup(fdset, fd); assert_se(copyfd >= 0 && copyfd != fd); assert_se(fdset_contains(fdset, copyfd)); assert_se(!fdset_contains(fdset, fd)); unlink(name); }
static void test_fdset_close_others(void) { int fd = -1; int copyfd = -1; _cleanup_fdset_free_ FDSet *fdset = NULL; int flags = -1; char name[] = "/tmp/test-fdset_close_others.XXXXXX"; fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); fdset = fdset_new(); assert_se(fdset); copyfd = fdset_put_dup(fdset, fd); assert_se(copyfd >= 0); assert_se(fdset_close_others(fdset) >= 0); flags = fcntl(fd, F_GETFD); assert_se(flags < 0); flags = fcntl(copyfd, F_GETFD); assert_se(flags >= 0); unlink(name); }