From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Lezcano Subject: Re: [RFC][PATCH] ns: Syscalls for better namespace sharing control. Date: Tue, 09 Mar 2010 11:26:09 +0100 Message-ID: <4B962241.6060300@free.fr> References: <4B88E431.6040609@parallels.com> <20100303000743.GA13744@us.ibm.com> <4B8E9370.3050300@parallels.com> <4B9158F5.5040205@parallels.com> <4B926B1B.5070207@free.fr> <4B92C886.9020507@free.fr> <4B952BBE.6070507@free.fr> <4B9556A9.60206@free.fr> <4B95611C.5060403@free.fr> <4B956852.7050804@free.fr> <4B961D09.4010802@free.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Pavel Emelyanov , Sukadev Bhattiprolu , Serge Hallyn , Linux Netdev List , containers@lists.linux-foundation.org, Netfilter Development Mailinglist , Ben Greear To: "Eric W. Biederman" Return-path: In-Reply-To: Sender: netdev-owner@vger.kernel.org List-Id: netfilter-devel.vger.kernel.org Eric W. Biederman wrote: > Daniel Lezcano writes: > > >> Eric W. Biederman wrote: >> >> [ ... ] >> >>> I guess my meaning is I was expecting. >>> child = fork(); >>> if (child == 0) { >>> execve(...); >>> } >>> waitpid(child); >>> >>> This puts /bin/sh in the container as well. >>> >>> >> #include >> #include >> #include >> #include >> #include >> #include >> #include >> #include >> >> #define __NR_setns 300 >> >> int setns(int nstype, int fd) >> { >> return syscall (__NR_setns, nstype, fd); >> } >> >> int main(int argc, char *argv[]) >> { >> char path[MAXPATHLEN]; >> char *ns[] = { "pid", "mnt", "net", "pid", "uts" }; >> const int size = sizeof(ns) / sizeof(char *); >> int fd[size]; >> int i; >> pid_t pid; >> if (argc != 3) { >> fprintf(stderr, "mynsenter \n"); >> exit(1); >> } >> >> for (i = 0; i < size; i++) { >> sprintf(path, "/proc/%s/ns/%s", argv[1], ns[i]); >> >> fd[i] = open(path, O_RDONLY| FD_CLOEXEC); >> if (fd[i] < 0) { >> perror("open"); >> return -1; >> } >> >> } >> for (i = 0; i < size; i++) >> if (setns(0, fd[i])) { >> perror("setns"); >> return -1; >> } >> >> pid = fork(); >> if (!pid) { >> >> fprintf(stderr, "mypid is %d\n", syscall(__NR_getpid)); >> >> execve(argv[2], &argv[2], NULL); >> perror("execve"); >> >> } >> >> if (pid < 0) { >> perror("fork"); >> return -1; >> } >> >> if (waitpid(&pid, NULL, 0) < 0) { >> perror("waitpid"); >> } >> >> return 0; >> } >> > > &pid ??? Isn't that a type error? > argh ! right :) Sorry for the noise. Works well now.