|
Packit |
d86cd3 |
#define _GNU_SOURCE
|
|
Packit |
d86cd3 |
#include <errno.h>
|
|
Packit |
d86cd3 |
#include <stdlib.h>
|
|
Packit |
d86cd3 |
#include <unistd.h>
|
|
Packit |
d86cd3 |
#include <stdio.h>
|
|
Packit |
d86cd3 |
#include <sched.h>
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
int main(int argc, char **argv)
|
|
Packit |
d86cd3 |
{
|
|
Packit |
d86cd3 |
if (argc < 2) {
|
|
Packit |
d86cd3 |
fprintf(stderr, "Usage: newns PROGRAM [ARGUMENTS ...]\n");
|
|
Packit |
d86cd3 |
exit(1);
|
|
Packit |
d86cd3 |
}
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
/* This is best-effort; if the kernel is too old (Linux << 2.6.16),
|
|
Packit |
d86cd3 |
* or indeed if the kernel isn't Linux so we don't have
|
|
Packit |
d86cd3 |
* unshare(CLONE_NEWNS), don't worry about it.
|
|
Packit |
d86cd3 |
*/
|
|
Packit |
d86cd3 |
#ifdef __linux__
|
|
Packit |
d86cd3 |
if (unshare(CLONE_NEWNS) < 0 && errno != ENOSYS)
|
|
Packit |
d86cd3 |
perror("unshare failed");
|
|
Packit |
d86cd3 |
/* ... but continue anyway */
|
|
Packit |
d86cd3 |
#endif /* __linux__ */
|
|
Packit |
d86cd3 |
setenv("OS_PROBER_NEWNS", "1", 1);
|
|
Packit |
d86cd3 |
execvp(argv[1], argv + 1);
|
|
Packit |
d86cd3 |
|
|
Packit |
d86cd3 |
perror("execvp failed");
|
|
Packit |
d86cd3 |
_exit(127);
|
|
Packit |
d86cd3 |
}
|