Quoting Veerendra ([EMAIL PROTECTED]):
> Veerendra wrote:
> > Signed-off-by: Veerendra C <[EMAIL PROTECTED]>
> >
> > This patch consists of the files..
> >
> > containers/libclone/libclone.h
> > containers/libclone/libnetns.c
> > containers/libclone/Makefile
> >
> >
> > Regards
> > Veerendra C
> >
> > >
> >
> >
> Attaching the patch..
>
>
> --~--~---------~--~----~------------~-------~--~----~
> You received this message because you are subscribed to the Google Groups
> "lxc-dev" group.
> To post to this group, send email to [EMAIL PROTECTED]
> To unsubscribe from this group, send email to [EMAIL PROTECTED]
> For more options, visit this group at
> http://groups.google.com/group/lxc-dev?hl=en
> -~----------~----~----~----~------~----~------~--~---
>
> Index: containers/libclone/libclone.h
> ===================================================================
> --- containers.orig/libclone/libclone.h
> +++ containers/libclone/libclone.h
> @@ -58,6 +58,46 @@ extern int __clone2(int (*fn) (void *ar
> pid_t *parent_tid, void *tls, pid_t *child_tid);
> #endif
>
> +#ifndef HAVE_UNSHARE
> +
> +#if __i386__
> +# define __NR_unshare 310
> +#elif __x86_64__
> +# define __NR_unshare 272
> +#elif __ia64__
> +# define __NR_unshare 1296
> +#elif __s390x__
> +# define __NR_unshare 303
> +#elif __powerpc__
> +# define __NR_unshare 282
> +#else
> +# error "Architecture not supported"
> +#endif
The existing libclone.h already tries to define these for arches that
need them. I certainly believe that there are distributions which
are still funky, but let's understand why.
Do you have a machine of your own on which you needed this? Can you
remove this bit and let me know what happens?
> +
> +static inline int unshare(unsigned long flags)
> +{
> + return syscall(__NR_unshare, flags);
> +}
> +
> +#endif /* HAVE_UNSHARE */
> +
> +#if __i386__
> +# define __NR_clone64 333
> +# define __NR_unshare64 334
What on earth are you using clone64 and unshare64 for? They don't
actually exist, and you certainly don't need them for network
namespaces.
> +#elif __powerpc__
> +# define __NR_clone64 313
> +# define __NR_unshare64 314
> +#elif __s390x__ || __s390__
> +# define __NR_clone64 322
> +# define __NR_unshare64 323
> +#elif __x86_64__
> +# define __NR_clone64 295
> +# define __NR_unshare64 296
> +#else
> +# error "Architecture not supported"
> +#endif
> +
> +
> #ifndef CLONE_NEWUTS
> #define CLONE_NEWUTS 0x04000000
> #endif
> @@ -74,6 +114,10 @@ extern int __clone2(int (*fn) (void *ar
> #define CLONE_NEWPID 0x20000000
> #endif
>
> +#ifndef CLONE_NEWNET
> +#define CLONE_NEWNET 0x40000000
> +#endif
> +
> /*
> * Run fn1 in a unshared environmnent, and fn2 in the original context
> * Fn2 may be NULL.
> @@ -97,4 +141,10 @@ int do_clone_unshare_tests(int use_clone
> int (*fn1)(void *arg), void *arg1,
> int (*fn2)(void *arg), void *arg2);
>
> +static inline int unshare64(unsigned long long int flags)
> +{
> + return syscall(__NR_unshare64, (unsigned long) (flags >> 32),
> + (unsigned long) (flags & 0xffffffff));
> +}
> +
Again, you shouldn't need the above.
> #endif
> Index: containers/libclone/libnetns.c
> ===================================================================
> --- /dev/null
> +++ containers/libclone/libnetns.c
> @@ -0,0 +1,105 @@
> +/*
> +* Copyright (c) International Business Machines Corp., 2007
> +* This program is free software; you can redistribute it and/or modify
> +* it under the terms of the GNU General Public License as published by
> +* the Free Software Foundation; either version 2 of the License, or
> +* (at your option) any later version.
> +*
> +* This program is distributed in the hope that it will be useful,
> +* but WITHOUT ANY WARRANTY; without even the implied warranty of
> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
> +* the GNU General Public License for more details.
> +* You should have received a copy of the GNU General Public License
> +* along with this program; if not, write to the Free Software
> +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> +*
> +***************************************************************************/
> +/*=========================================================================
> +* This testcase creates the network namespace.
> +* It creates veth pair veth8 & veth9. Also assigns IP addresses to the
> childNS.
> +* Also it starts the sshd daemon @ port 7890
> +*
> +* Scripts Used: parentns.sh childns.sh
> +=========================================================================*/
> +
> +#include <sys/utsname.h>
> +#include <sched.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include "libclone.h"
> +#include <sched.h>
> +#include <sys/syscall.h>
> +#include <unistd.h>
> +#include <signal.h>
> +#include <string.h>
> +#include <errno.h>
> +#include <libgen.h>
> +#include <fcntl.h>
> +#include <sys/types.h>
> +#include <sys/wait.h>
> +
> +extern pid_t getpgid(pid_t pid);
> +extern pid_t getsid(pid_t pid);
> +
> +int crtchild(char *s1 , char *s2)
> +{
> + char *cmd[] = { "/bin/bash", s1, s2, (char *)0 };
> + execve("/bin/bash", cmd, __environ);
> + printf("The code would not reach here on success\n");
> + perror("execve");
> + return 1;
> +}
> +
> +int create_net_namespace(char *p1, char *c1)
> +{
> + int pid, status, ret;
> + long long flags = 0;
> + char par[256], child[256];
> + char path[128];
> +
> + if (tst_kvercmp(2,6,19) < 0)
> + return 1;
> +
> + if (ret = getenv("LTPROOT")) {
> +
> sprintf(path,"%s%s",getenv("LTPROOT"),"/testcases/kernel/containers/netns/");
> + }
> + else{
> + printf("LTPROOT env variable is not set\n");
> + printf("Please set LTPROOT and re-run the test.. Thankyou\n");
> + return -1;
> + }
> +
> + flags |= CLONE_NEWNS;
> + flags |= CLONE_NEWNET;
> +
> + sprintf(par , "%s%s %s", path, "parentns.sh", p1);
> + sprintf(child , "%s%s", path,"childns.sh");
> +
> + if ((pid = fork()) == 0) {
> +
> + // Child.
> + ret = unshare64(flags);
This can't be succeeding on a stock kernel.
Please test with
git://git.kernel.org/pub/scm/linux/kernel/git/daveh/linux-2.6-lxc.git
right now.
I suspect what happened was you cut and pasted code from an experimental
but obsolete ns_exec, but you need to use standard unshare() here.
> + if (ret < 0) {
> + perror("unshare");
> + return 1;
> + }
> + return crtchild(child,c1);
> + }
> + else{
> +
> + //parent
> + ret = system(par);
> + if (ret != 0) {
> + printf("Error not able to assign the pid to the net\n");
> + fflush(stdout);
> + exit(1);
> + }
> + fflush(stdout);
> +
> + if ((ret = waitpid(pid, &status, __WALL)) < 0){
> + printf("waitpid() returns %d, errno %d\n", ret, errno);
> + return errno;
> + }
> + return 0;
> + }
> +}
> Index: containers/libclone/Makefile
> ===================================================================
> --- containers.orig/libclone/Makefile
> +++ containers/libclone/Makefile
> @@ -18,7 +18,7 @@
> ##
> ##
>
> ################################################################################
>
> -TARGET=libclone.a
> +TARGET=libclone.a libnetns.a
> SRCS=$(wildcard *.c)
> OBJS=$(patsubst %.c,%.o,$(SRCS))
>
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list