Hi!
> +static int open_ns_fd(const char *pid, const char *ns)
> +{
> + int fd;
> + char file_buf[30];
> +
> + sprintf(file_buf, "%s/%s/ns/%s", PROC_PATH, pid, ns);
> +
> + fd = open(file_buf, O_RDONLY);
> + if (fd > 0) {
> + ns_fd[ns_fd_index] = fd;
> + ++ns_fd_index;
> + return 0;
> + } else if (fd == -1 && errno != ENOENT) {
> + tst_resm(TINFO | TERRNO, "open");
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +static void close_ns_fd(void)
> +{
> + int i;
> +
> + for (i = 0; i < ns_fd_index; i++)
> + close(ns_fd[i]);
> +}
> +
> +static int child_fn(void *arg)
> +{
> + char **args = (char **)arg;
> +
> + execvp(args[2], args+2);
> + tst_resm(TINFO | TERRNO, "execvp");
> + return 1;
> +}
> +
> +/*
> + * ./ns_exec <NS_PID> <PROGRAM> [ARGS]
> + */
> +int main(int argc, char *argv[])
> +{
> + int i, rv, pid;
> +
> + rv = syscall(__NR_setns, -1, 0);
> + if (rv == -1 && errno == ENOSYS) {
> + tst_resm(TINFO, "setns is not supported in the kernel");
> + return 1;
> + }
> +
> + if (argc < 3) {
> + tst_resm(TINFO, "%s <NS_PID> <PROGRAM> [ARGS]\n", argv[0]);
> + return 1;
> + }
> +
> + rv = 0;
> + memset(ns_fd, 0, sizeof(ns_fd));
> + rv |= open_ns_fd(argv[1], "ipc");
> + rv |= open_ns_fd(argv[1], "mnt");
> + rv |= open_ns_fd(argv[1], "net");
> + rv |= open_ns_fd(argv[1], "pid");
> + rv |= open_ns_fd(argv[1], "user");
> + rv |= open_ns_fd(argv[1], "uts");
> + if (rv != 0)
> + return 1;
> +
> + if (ns_fd_index == 0) {
> + tst_resm(TINFO, "no namespace entries in /proc/%s/ns/",
> + argv[1]);
> + close_ns_fd();
> + return 1;
> + }
> +
> + for (i = 0; i < ns_fd_index; i++) {
> + if (syscall(__NR_setns, ns_fd[i], 0) == -1) {
> + tst_resm(TINFO | TERRNO, "setns");
> + close_ns_fd();
On SLES12 (kernel 3.12.28) setns() fails for the fd opened from "user"
namespace. I'm getting EINVAL here. Everything seems to work fine if I
comment the rf |= open_ns_fd(argv[1], "user"); line above.
Unfortunately EINVAL seems to be catch-all error for setns(), any idea
what is wrong here?
--
Cyril Hrubis
[email protected]
------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list