struct run_as_rmdir_data {
int dirfd;
char path[LTTNG_PATH_MAX];
+ int flags; /* enum lttng_directory_handle_rmdir_recursive_flags */
} LTTNG_PACKED;
struct run_as_extract_elf_symbol_offset_data {
data->u.rmdir.dirfd = -1;
ret_value->u.ret = lttng_directory_handle_remove_subdirectory_recursive(
- &handle, data->u.rmdir.path);
+ &handle, data->u.rmdir.path, data->u.rmdir.flags);
ret_value->_errno = errno;
ret_value->_error = (ret_value->u.ret) ? true : false;
lttng_directory_handle_fini(&handle);
struct run_as_ret *ret_value)
{
int ret = 0;
+ uint64_t offset;
ret_value->_error = false;
ret = lttng_elf_get_symbol_offset(data->u.extract_elf_symbol_offset.fd,
data->u.extract_elf_symbol_offset.function,
- &ret_value->u.extract_elf_symbol_offset.offset);
+ &offset);
if (ret) {
DBG("Failed to extract ELF function offset");
ret_value->_error = true;
}
+ ret_value->u.extract_elf_symbol_offset.offset = offset;
return ret;
}
}
LTTNG_HIDDEN
-int run_as_rmdir_recursive(const char *path, uid_t uid, gid_t gid)
+int run_as_rmdir_recursive(const char *path, uid_t uid, gid_t gid, int flags)
{
- return run_as_rmdirat_recursive(AT_FDCWD, path, uid, gid);
+ return run_as_rmdirat_recursive(AT_FDCWD, path, uid, gid, flags);
}
LTTNG_HIDDEN
-int run_as_rmdirat_recursive(int dirfd, const char *path, uid_t uid, gid_t gid)
+int run_as_rmdirat_recursive(int dirfd, const char *path, uid_t uid, gid_t gid, int flags)
{
int ret;
struct run_as_data data = {};
goto error;
}
data.u.rmdir.dirfd = dirfd;
+ data.u.rmdir.flags = flags;
run_as(dirfd == AT_FDCWD ? RUN_AS_RMDIR_RECURSIVE : RUN_AS_RMDIRAT_RECURSIVE,
&data, &run_as_ret, uid, gid);
errno = run_as_ret._errno;