#include <unistd.h>
#include <fcntl.h>
#include <sched.h>
-#include <sys/mman.h>
+#include <sys/signal.h>
-#include <common/lttngerr.h>
+#include <common/error.h>
+#include <common/compat/mman.h>
+#include <common/compat/clone.h>
#include "runas.h"
#define RUNAS_CHILD_STACK_SIZE 10485760
+#ifndef MAP_STACK
+#define MAP_STACK 0
+#endif
+
struct run_as_data {
int (*cmd)(void *data);
void *data;
ret = pipe(retval_pipe);
if (ret < 0) {
perror("pipe");
+ retval.i = ret;
goto end;
}
run_as_data.data = data;
-1, 0);
if (child_stack == MAP_FAILED) {
perror("mmap");
- ret = -ENOMEM;
+ retval.i = -ENOMEM;
goto close_pipe;
}
/*
* Pointing to the middle of the stack to support architectures
* where the stack grows up (HPPA).
*/
- pid = clone(child_run_as, child_stack + (RUNAS_CHILD_STACK_SIZE / 2),
- CLONE_FILES | SIGCHLD,
- &run_as_data, NULL);
+ pid = lttng_clone_files(child_run_as, child_stack + (RUNAS_CHILD_STACK_SIZE / 2),
+ &run_as_data);
if (pid < 0) {
perror("clone");
- ret = pid;
+ retval.i = pid;
goto unmap_stack;
}
/* receive return value */
pid = waitpid(pid, &status, 0);
if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
perror("wait");
- ret = -1;
+ retval.i = -1;
}
unmap_stack:
ret = munmap(child_stack, RUNAS_CHILD_STACK_SIZE);
if (ret < 0) {
perror("munmap");
+ retval.i = ret;
}
close_pipe:
close(retval_pipe[0]);