#include <sched.h>
#include <sys/signal.h>
-#include <common/error.h>
+#include <common/common.h>
#include <common/utils.h>
#include <common/compat/mman.h>
#include <common/compat/clone.h>
static
int _mkdir(void *_data)
{
+ int ret;
struct run_as_mkdir_data *data = _data;
- return mkdir(data->path, data->mode);
+
+ ret = mkdir(data->path, data->mode);
+ if (ret < 0) {
+ ret = -errno;
+ }
+
+ return ret;
}
static
ret = setegid(data->gid);
if (ret < 0) {
PERROR("setegid");
- return EXIT_FAILURE;
+ sendret.i = -1;
+ goto write_return;
}
}
if (data->uid != geteuid()) {
ret = seteuid(data->uid);
if (ret < 0) {
PERROR("seteuid");
- return EXIT_FAILURE;
+ sendret.i = -1;
+ goto write_return;
}
}
/*
*/
umask(0);
sendret.i = (*data->cmd)(data->data);
+
+write_return:
/* send back return value */
writeleft = sizeof(sendret);
index = 0;
}
}
-__attribute__((visibility("hidden")))
+LTTNG_HIDDEN
int run_as_mkdir_recursive(const char *path, mode_t mode, uid_t uid, gid_t gid)
{
struct run_as_mkdir_data data;
return run_as(_mkdir_recursive, &data, uid, gid);
}
-__attribute__((visibility("hidden")))
+LTTNG_HIDDEN
int run_as_mkdir(const char *path, mode_t mode, uid_t uid, gid_t gid)
{
struct run_as_mkdir_data data;
* Note: open_run_as is currently not working. We'd need to pass the fd
* opened in the child to the parent.
*/
-__attribute__((visibility("hidden")))
+LTTNG_HIDDEN
int run_as_open(const char *path, int flags, mode_t mode, uid_t uid, gid_t gid)
{
struct run_as_open_data data;