X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Frunas.c;h=9d9091638a5a9910c8cec2b6810357ca087e4499;hp=471bb22046c3d3bf9f44dbf24c176f089a3e3c2e;hb=4628484ae860b8cf506427e864c7d1933da32777;hpb=a424227e8d392977bc0b465f91c58b03112be0d4 diff --git a/src/common/runas.c b/src/common/runas.c index 471bb2204..9d9091638 100644 --- a/src/common/runas.c +++ b/src/common/runas.c @@ -79,6 +79,14 @@ struct run_as_open_data { mode_t mode; }; +struct run_as_unlink_data { + const char *path; +}; + +struct run_as_recursive_rmdir_data { + const char *path; +}; + #ifdef VALGRIND static int use_clone(void) @@ -130,6 +138,34 @@ int _open(void *_data) return open(data->path, data->flags, data->mode); } +static +int _unlink(void *_data) +{ + int ret; + struct run_as_unlink_data *data = _data; + + ret = unlink(data->path); + if (ret < 0) { + ret = -errno; + } + + return ret; +} + +static +int _recursive_rmdir(void *_data) +{ + int ret; + struct run_as_recursive_rmdir_data *data = _data; + + ret = utils_recursive_rmdir(data->path); + if (ret < 0) { + ret = -errno; + } + + return ret; +} + static int child_run_as(void *_data) { @@ -341,3 +377,25 @@ int run_as_open(const char *path, int flags, mode_t mode, uid_t uid, gid_t gid) data.mode = mode; return run_as(_open, &data, uid, gid); } + +LTTNG_HIDDEN +int run_as_unlink(const char *path, uid_t uid, gid_t gid) +{ + struct run_as_unlink_data data; + + DBG3("unlink() %s with for uid %d and gid %d", + path, uid, gid); + data.path = path; + return run_as(_unlink, &data, uid, gid); +} + +LTTNG_HIDDEN +int run_as_recursive_rmdir(const char *path, uid_t uid, gid_t gid) +{ + struct run_as_recursive_rmdir_data data; + + DBG3("recursive_rmdir() %s with for uid %d and gid %d", + path, uid, gid); + data.path = path; + return run_as(_recursive_rmdir, &data, uid, gid); +}