static int reply_dump_by_fd(sd_bus_message *message, char *dump) {
_cleanup_close_ int fd = -EBADF;
- fd = acquire_data_fd(dump, strlen(dump), 0);
+ fd = acquire_data_fd(dump);
if (fd < 0)
return fd;
case EXEC_INPUT_DATA: {
int fd;
- fd = acquire_data_fd(context->stdin_data, context->stdin_data_size, 0);
+ fd = acquire_data_fd_full(context->stdin_data, context->stdin_data_size, /* flags = */ 0);
if (fd < 0)
return fd;
if (r < 0)
return r;
- stdin_fd = acquire_data_fd(formatted, strlen(formatted), 0);
+ stdin_fd = acquire_data_fd(formatted);
if (stdin_fd < 0)
return stdin_fd;
pid_t mount_pid;
int exit_status;
- passwd_fd = acquire_data_fd(*pw, strlen(*pw), /* flags= */ 0);
+ passwd_fd = acquire_data_fd(*pw);
if (passwd_fd < 0)
return log_error_errno(passwd_fd, "Failed to create data FD for password: %m");
if (r < 0)
return r;
- fd = acquire_data_fd(dump, strlen(dump), 0);
+ fd = acquire_data_fd(dump);
if (fd < 0)
return fd;
if (r < 0)
return r;
- fd = acquire_data_fd(dump, dump_size, 0);
+ fd = acquire_data_fd_full(dump, dump_size, /* flags = */ 0);
if (fd < 0)
return fd;
/* If memfd/pipe didn't work out, then let's use a file in /tmp up to a size of 1M. If it's large than that use /var/tmp instead. */
#define DATA_FD_TMP_LIMIT (1U * U64_MB)
-int acquire_data_fd(const void *data, size_t size, DataFDFlags flags) {
+int acquire_data_fd_full(const void *data, size_t size, DataFDFlags flags) {
_cleanup_close_ int fd = -EBADF;
ssize_t n;
int r;
* It sucks a bit that depending on the situation we return very different objects here, but that's Linux I
* figure. */
+ if (size == SIZE_MAX)
+ size = strlen(data);
+
if (size == 0 && !FLAGS_SET(flags, ACQUIRE_NO_DEV_NULL))
/* As a special case, return /dev/null if we have been called for an empty data block */
return RET_NERRNO(open("/dev/null", O_RDONLY|O_CLOEXEC|O_NOCTTY));
#pragma once
#include <stddef.h>
+#include <stdint.h>
typedef enum DataFDFlags {
ACQUIRE_NO_DEV_NULL = 1 << 0,
ACQUIRE_NO_REGULAR = 1 << 4,
} DataFDFlags;
-int acquire_data_fd(const void *data, size_t size, DataFDFlags flags);
+int acquire_data_fd_full(const void *data, size_t size, DataFDFlags flags);
+static inline int acquire_data_fd(const void *data) {
+ return acquire_data_fd_full(data, SIZE_MAX, 0);
+}
+
int copy_data_fd(int fd);
int memfd_clone_fd(int fd, const char *name, int mode);
char rbuffer[sizeof(wbuffer)];
int fd;
- fd = acquire_data_fd("foo", 3, flags);
+ fd = acquire_data_fd_full("foo", 3, flags);
assert_se(fd >= 0);
zero(rbuffer);
fd = safe_close(fd);
- fd = acquire_data_fd("", 0, flags);
+ fd = acquire_data_fd_full("", SIZE_MAX, flags);
assert_se(fd >= 0);
zero(rbuffer);
random_bytes(wbuffer, sizeof(wbuffer));
- fd = acquire_data_fd(wbuffer, sizeof(wbuffer), flags);
+ fd = acquire_data_fd_full(wbuffer, sizeof(wbuffer), flags);
assert_se(fd >= 0);
zero(rbuffer);
fd1 = safe_close(fd1);
fd2 = safe_close(fd2);
- fd1 = acquire_data_fd("hallo", 6, 0);
+ fd1 = acquire_data_fd("hallo");
assert_se(fd1 >= 0);
fd2 = copy_data_fd(fd1);
assert_se(fd2 >= 0);
safe_close(fd1);
- fd1 = acquire_data_fd("hallo", 6, 0);
+ fd1 = acquire_data_fd("hallo");
assert_se(fd1 >= 0);
assert_equal_fd(fd1, fd2);
assert_se(fd_move_above_stdio(0) == 3);
}
assert_se(open("/dev/full", O_WRONLY|O_CLOEXEC) == 0);
- assert_se(acquire_data_fd("foobar", 6, 0) == 2);
+ assert_se(acquire_data_fd("foobar") == 2);
assert_se(rearrange_stdio(2, 0, 1) >= 0);
test_fd(yy, "bar", 3);
test_fd(zz, "quux", 4);
- _cleanup_close_ int vv = acquire_data_fd("miau", 4, 0);
- _cleanup_close_ int ww = acquire_data_fd("wuff", 4, 0);
+ _cleanup_close_ int vv = acquire_data_fd("miau");
+ _cleanup_close_ int ww = acquire_data_fd("wuff");
assert_se(vv >= 0);
assert_se(ww >= 0);
assert_se(json_variant_integer(json_variant_by_key(o, "sum")) == 88 + 99);
assert_se(!e);
- int fd1 = acquire_data_fd("foo", 3, 0);
- int fd2 = acquire_data_fd("bar", 3, 0);
- int fd3 = acquire_data_fd("quux", 4, 0);
+ int fd1 = acquire_data_fd("foo");
+ int fd2 = acquire_data_fd("bar");
+ int fd3 = acquire_data_fd("quux");
assert_se(fd1 >= 0);
assert_se(fd2 >= 0);