#include "capsule-util.h"
#include "escape.h"
#include "fd-util.h"
+#include "fdset.h"
#include "fileio.h"
#include "format-table.h"
#include "glyph-util.h"
return 0;
}
-static int message_append_cmdline(sd_bus_message *m, const char *signature, char ***x) {
+static int message_append_cmdline(sd_bus_message *m, const char *signature, FDSet **passed_fdset, char ***x) {
char **p;
int r;
assert(m);
assert(signature);
+ assert(passed_fdset);
assert(x);
p = *x;
return bus_log_create_error(r);
for (unsigned i = 0; i < n; i++) {
- r = message_append_cmdline(m, s, &p);
+ r = message_append_cmdline(m, s, passed_fdset, &p);
if (r < 0)
return r;
}
if (r < 0)
return bus_log_create_error(r);
- r = message_append_cmdline(m, v, &p);
+ r = message_append_cmdline(m, v, passed_fdset, &p);
if (r < 0)
return r;
if (r < 0)
return bus_log_create_error(r);
- r = message_append_cmdline(m, s, &p);
+ r = message_append_cmdline(m, s, passed_fdset, &p);
if (r < 0)
return r;
}
break;
}
- case SD_BUS_TYPE_UNIX_FD:
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "UNIX file descriptor not supported as type.");
+ case SD_BUS_TYPE_UNIX_FD: {
+ int fd;
+
+ fd = parse_fd(v);
+ if (fd < 0)
+ return log_error_errno(fd, "Failed to parse '%s' as a file descriptor: %m", v);
+
+ if (!*passed_fdset) {
+ r = fdset_new_fill(/* filter_cloexec= */ 0, passed_fdset);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create fd set: %m");
+ }
+
+ if (!fdset_contains(*passed_fdset, fd))
+ return log_error_errno(SYNTHETIC_ERRNO(EBADF), "Failed to find file descriptor '%s' among passed file descriptors.", v);
+
+ r = sd_bus_message_append_basic(m, t, &fd);
+ break;
+ }
default:
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
+ _cleanup_fdset_free_ FDSet *passed_fdset = NULL;
int r;
r = acquire_bus(false, &bus);
p = argv+6;
- r = message_append_cmdline(m, argv[5], &p);
+ r = message_append_cmdline(m, argv[5], &passed_fdset, &p);
if (r < 0)
return r;
static int emit_signal(int argc, char **argv, void *userdata) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ _cleanup_fdset_free_ FDSet *passed_fdset = NULL;
int r;
r = acquire_bus(false, &bus);
p = argv+5;
- r = message_append_cmdline(m, argv[4], &p);
+ r = message_append_cmdline(m, argv[4], &passed_fdset, &p);
if (r < 0)
return r;
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_fdset_free_ FDSet *passed_fdset = NULL;
char **p;
int r;
return bus_log_create_error(r);
p = argv + 6;
- r = message_append_cmdline(m, argv[5], &p);
+ r = message_append_cmdline(m, argv[5], &passed_fdset, &p);
if (r < 0)
return r;