uint32_t loop_flags;
int open_flags;
- open_flags = FLAGS_SET(arg_flags, DISSECT_IMAGE_DEVICE_READ_ONLY) ? O_RDONLY : O_RDWR;
+ open_flags = FLAGS_SET(arg_flags, DISSECT_IMAGE_DEVICE_READ_ONLY) ? O_RDONLY : -1;
loop_flags = FLAGS_SET(arg_flags, DISSECT_IMAGE_NO_PARTITION_TABLE) ? 0 : LO_FLAGS_PARTSCAN;
if (arg_in_memory)
r = loop_device_make(
image_fd,
- p.read_only > 0 ? O_RDONLY : O_RDWR,
+ p.read_only > 0 ? O_RDONLY : -1,
0,
UINT64_MAX,
UINT32_MAX,
if (arg_userns_mode != USER_NAMESPACE_MANAGED) {
r = loop_device_make_by_path(
arg_image,
- arg_read_only ? O_RDONLY : O_RDWR,
+ arg_read_only ? O_RDONLY : -1,
/* sector_size= */ UINT32_MAX,
FLAGS_SET(dissect_image_flags, DISSECT_IMAGE_NO_PARTITION_TABLE) ? 0 : LO_FLAGS_PARTSCAN,
LOCK_SH,
r = loop_device_make_by_path(
image,
- FLAGS_SET(flags, DISSECT_IMAGE_DEVICE_READ_ONLY) ? O_RDONLY : O_RDWR,
+ FLAGS_SET(flags, DISSECT_IMAGE_DEVICE_READ_ONLY) ? O_RDONLY : -1,
/* sector_size= */ UINT32_MAX,
FLAGS_SET(flags, DISSECT_IMAGE_NO_PARTITION_TABLE) ? 0 : LO_FLAGS_PARTSCAN,
LOCK_SH,
int r;
assert(path);
- assert(IN_SET(open_flags, O_RDWR, O_RDONLY));
+ assert(open_flags < 0 || IN_SET(open_flags, O_RDWR, O_RDONLY));
assert(ret);
+ /* memfds are always writable, so default to O_RDWR when auto-detecting. */
+ if (open_flags < 0)
+ open_flags = O_RDWR;
+
loop_flags &= ~LO_FLAGS_DIRECT_IO; /* memfds don't support O_DIRECT, hence LO_FLAGS_DIRECT_IO can't be used either */
fd = open(path, O_CLOEXEC|O_NONBLOCK|O_NOCTTY|O_RDONLY);
_cleanup_(loop_device_unrefp) LoopDevice *loop_device = NULL;
_cleanup_(dissected_image_unrefp) DissectedImage *dissected_image = NULL;
- r = loop_device_make(
+ r = loop_device_make_by_path_at(
m->what_fd,
- FLAGS_SET(flags, MSTACK_RDONLY) ? O_RDONLY : O_RDWR,
- /* offset= */ 0,
- /* size= */ UINT64_MAX,
+ /* path= */ NULL,
+ FLAGS_SET(flags, MSTACK_RDONLY) ? O_RDONLY : -1,
/* sector_size= */ UINT32_MAX,
LO_FLAGS_PARTSCAN,
LOCK_SH,