Quoting S.Çağlar Onur (cag...@10ur.org):
> lxc-user-nic now returns the names of the interfaces and
> unpriv_assign_nic function parses that information to fill
> missing netdev->veth_attr.pair and netdev->name.
> 
> With this patch get_running_config_item started to provide
> correct information;
> 
> >>> import lxc; c = lxc.Container("rubik"); 
> >>> c.get_running_config_item("lxc.network.0.name"); 
> >>> c.get_running_config_item("lxc.network.0.veth.pair");
> 'eth0'
> 'veth9MT2L4'
> >>>
> 
> and lxc-info started to show network stats;
> 
> lxc-info -n rubik
> Name:           rubik
> State:          RUNNING
> PID:            23061
> IP:             10.0.3.233
> CPU use:        3.86 seconds
> BlkIO use:      88.00 KiB
> Memory use:     6.53 MiB
> KMem use:       0 bytes
> Link:           veth9MT2L4
>  TX bytes:      3.45 KiB
>  RX bytes:      8.83 KiB
>  Total bytes:   12.29 KiB
> 
> Signed-off-by: S.Çağlar Onur <cag...@10ur.org>

Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com>

> ---
>  src/lxc/conf.c         | 67 
> ++++++++++++++++++++++++++++++++++++++++++--------
>  src/lxc/lxc_user_nic.c |  2 ++
>  2 files changed, 59 insertions(+), 10 deletions(-)
> 
> diff --git a/src/lxc/conf.c b/src/lxc/conf.c
> index e5df68b..10f46ae 100644
> --- a/src/lxc/conf.c
> +++ b/src/lxc/conf.c
> @@ -3014,6 +3014,10 @@ void lxc_delete_network(struct lxc_handler *handler)
>  static int unpriv_assign_nic(struct lxc_netdev *netdev, pid_t pid)
>  {
>       pid_t child;
> +     int bytes, pipefd[2];
> +     char *token, *saveptr = NULL;
> +     /* lxc-user-nic returns "interface_name:interface_name" format */
> +     char buffer[IFNAMSIZ*2 + 1];

I'd prefer it be +2 and you stick a 0 at the end.

the +1 shoudl be for the ':' you put between the names.  Then you need
another +1 for the \0.

>  
>       if (netdev->type != LXC_NET_VETH) {
>               ERROR("nic type %d not support for unprivileged use",
> @@ -3021,23 +3025,66 @@ static int unpriv_assign_nic(struct lxc_netdev 
> *netdev, pid_t pid)
>               return -1;
>       }
>  
> +     if(pipe(pipefd) < 0) {
> +             SYSERROR("pipe failed");
> +             return -1;
> +     }
> +
>       if ((child = fork()) < 0) {
>               SYSERROR("fork");
> +             close(pipefd[0]);
> +             close(pipefd[1]);
> +             return -1;
> +     }
> +
> +     if (child == 0) { // child
> +             /* close the read-end of the pipe */
> +             close(pipefd[0]);
> +             /* redirect the stdout to write-end of the pipe */
> +             dup2(pipefd[1], STDOUT_FILENO);
> +             /* close the write-end of the pipe */
> +             close(pipefd[0]);

You meant pipefd[1] here?

> +
> +             // Call lxc-user-nic pid type bridge
> +             char pidstr[20];
> +             char *args[] = {LXC_USERNIC_PATH, pidstr, "veth", netdev->link, 
> netdev->name, NULL };
> +             snprintf(pidstr, 19, "%lu", (unsigned long) pid);
> +             pidstr[19] = '\0';
> +             execvp(args[0], args);
> +             SYSERROR("execvp lxc-user-nic");
> +             exit(1);
> +     }
> +
> +     /* close the write-end of the pipe */
> +     close(pipefd[1]);
> +
> +     bytes = read(pipefd[0], &buffer, IFNAMSIZ*2 + 1);
> +     if (bytes < 0) {
> +             SYSERROR("read failed");
> +     }
> +     buffer[bytes - 1] = '\0';
> +
> +     if (wait_for_pid(child) != 0) {
> +             close(pipefd[0]);
>               return -1;
>       }
>  
> -     if (child > 0)
> -             return wait_for_pid(child);
> +     /* close the read-end of the pipe */
> +     close(pipefd[0]);
> +
> +     /* fill netdev->name field */
> +     token = strtok_r(buffer, ":", &saveptr);
> +     if (!token)
> +             return -1;
> +     netdev->name = strdup(token);
>  
> -     // Call lxc-user-nic pid type bridge
> +     /* fill netdev->veth_attr.pair field */
> +     token = strtok_r(NULL, ":", &saveptr);
> +     if (!token)
> +             return -1;
> +     netdev->priv.veth_attr.pair = strdup(token);
>  
> -     char pidstr[20];
> -     char *args[] = {LXC_USERNIC_PATH, pidstr, "veth", netdev->link, 
> netdev->name, NULL };
> -     snprintf(pidstr, 19, "%lu", (unsigned long) pid);
> -     pidstr[19] = '\0';
> -     execvp(args[0], args);
> -     SYSERROR("execvp lxc-user-nic");
> -     exit(1);
> +     return 0;
>  }
>  
>  int lxc_assign_network(struct lxc_list *network, pid_t pid)
> diff --git a/src/lxc/lxc_user_nic.c b/src/lxc/lxc_user_nic.c
> index a2f0c96..ce79177 100644
> --- a/src/lxc/lxc_user_nic.c
> +++ b/src/lxc/lxc_user_nic.c
> @@ -599,5 +599,7 @@ int main(int argc, char *argv[])
>               exit(1);
>       }
>  
> +     // write the name of the interface pair to the stdout - like 
> eth0:veth9MT2L4
> +     fprintf(stdout, "%s:%s\n", vethname, nicname);
>       exit(0);
>  }
> -- 
> 1.8.3.2
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel@lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to