Quoting Sudhir Kumar (sku...@linux.vnet.ibm.com):
> This patch adds the other namespace creation support with the network 
> namespace.
> We now create the PID & UTS namespaces and unshares filesystem attributes.
> The patch is required to reuse the existing network testcases directly without
> any porting, for network namespace.
> 
> Signed-off-by: Sudhir Kumar <sku...@linux.vnet.ibm.com>

Acked-by: Serge Hallyn <se...@us.ibm.com>

thanks,
-serge

> Index: ltp-full-20081130/testcases/kernel/containers/libclone/libnetns.c
> ===================================================================
> --- ltp-full-20081130.orig/testcases/kernel/containers/libclone/libnetns.c
> +++ ltp-full-20081130/testcases/kernel/containers/libclone/libnetns.c
> @@ -40,10 +40,12 @@
>  #include "libclone.h"
>  #include "test.h"
> 
> +
>  int TST_TOTAL = 1;
> 
>  extern pid_t getpgid(pid_t pid);
>  extern pid_t getsid(pid_t pid);
> +static int child_fn(void *c1);
> 
>  int crtchild(char *s1 , char *s2)
>  {
> @@ -56,16 +58,42 @@ int crtchild(char *s1 , char *s2)
> 
>  int create_net_namespace(char *p1, char *c1)
>  {
> -    int pid, status = 0, ret;
> -    long int flags = 0;
> -    char *ltproot, *par, *child;
> -
> -    flags |= CLONE_NEWNS;
> -    flags |= CLONE_NEWNET;
> -
> -    if (tst_kvercmp(2,6,19) < 0)
> -        return 1;
> +     int pid, status = 0, ret;
> +     char *ltproot, *par;
> +     long int clone_flags = 0;
> +     int stack_size = getpagesize() * 4;

This getpagesize*4 is kind of magic, result of trial and error.  So
it should probably be calculated all in one place in all of libclone,
as I expect it'll have to change again.

That's something I should look into doing after the new year.

> +     void *childstack, *stack;
> +
> +     if (tst_kvercmp(2, 6, 19) < 0)
> +             return 1;
> +
> +     stack = malloc(stack_size);
> +     if (!stack) {
> +             perror("failled to malloc memory for stack...");
> +             return -1;
> +     }
> +     childstack = stack + stack_size;
> +
> +     clone_flags |= CLONE_NEWNS;
> +/* Enable other namespaces too optionally */
> +#ifdef CLONE_NEWPID
> +     clone_flags |= CLONE_NEWPID;
> +#endif
> +
> +#ifdef __ia64__
> +     pid = clone2(child_fn, childstack, getpagesize(), clone_flags | SIGCHLD,
> +                                             (void *)c1, NULL, NULL, NULL);
> +#else
> +     pid = clone(child_fn, childstack, clone_flags | SIGCHLD, (void *)c1);
> +#endif
> +
> +     if (pid == -1) {
> +             perror("Failled to do clone...");
> +             free(stack);
> +             return -1;
> +     }
> 
> +/* This code will be executed in parent */
>      ltproot = getenv("LTPROOT");
> 
>      if ( !ltproot) {
> @@ -75,30 +103,14 @@ int create_net_namespace(char *p1, char 
>      }
> 
>      par = malloc(FILENAME_MAX);
> -    child = malloc(FILENAME_MAX);
> 
> -    if (par == NULL || child == NULL ) {
> +    if (par == NULL) {
>                  printf("FAIL: error while allocating memory");
>                  exit(1);
>          }
> 
>      sprintf(par, "%s/testcases/kernel/containers/netns/parentns.sh %s" , 
> ltproot, p1);
> -    sprintf(child, "%s/testcases/kernel/containers/netns/childns.sh" , 
> ltproot);
> 
> -    if ((pid = fork()) == 0) {
> -
> -        // Child.
> -        ret = unshare(flags);
> -        if (ret < 0) {
> -            perror("unshare");
> -         printf ("Error:Unshare syscall failed for network namespace\n");
> -            return 1;
> -        }
> -    return crtchild(child, c1);
> -    }
> -    else{
> -
> -        //parent
>          ret = system(par);
>          status = WEXITSTATUS(ret);
>          if ( ret == -1 || status != 0) {
> @@ -113,6 +125,44 @@ int create_net_namespace(char *p1, char 
>          if ( ret  == -1 || status != 0)
>              printf("Error: waitpid() returns %d, status %d\n", ret, status);
> 
> -    }
>      return status;
>  }
> +
> +/* The function to be executed in the child namespace */
> +int child_fn(void *c1)
> +{
> +     char *ltproot, *child;
> +     unsigned long flags = 0;
> +     int ret;
> +
> +/* Flags to unshare different Namespaces */
> +     flags |= CLONE_NEWNS;

(You already did CLONE_NEWNS above, but since we'll be consolidating
the clone+unshare it doesn't really matter)

> +     flags |= CLONE_NEWNET;
> +     flags |= CLONE_NEWUTS;
> +     flags |= CLONE_FS;
> +
> +     ltproot = getenv("LTPROOT");
> +
> +     if (!ltproot) {
> +             printf("LTPROOT env variable is not set\n");
> +             printf("Please set LTPROOT and re-run the test.. Thankyou\n");
> +             return -1;
> +     }
> +
> +     child = malloc(FILENAME_MAX);
> +     if (child == NULL) {
> +             printf("FAIL: error while allocating memory");
> +             exit(1);
> +     }
> +
> +     sprintf(child, "%s/testcases/kernel/containers/netns/childns.sh",
> +                                                              ltproot);

I'd feel warm+cozy with an snprintf

> +
> +     /* Unshare the network namespace in the child */
> +     ret = unshare(flags);
> +     if (ret < 0) {
> +             perror("Failled to unshare for netns...");
> +             return 1;
> +     }
> +     return crtchild(child, c1);
> +}
> 

------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to