[libvirt] Updated James Morris patch to apply to libvirt-0.6.0 version

Daniel P. Berrange berrange at redhat.com
Thu Feb 26 16:28:42 UTC 2009


On Fri, Feb 20, 2009 at 02:38:05PM +0000, Daniel P. Berrange wrote:

> I think we need to move place where we set the exec context to after
> the fork() call, ideally to be the very last call made before the
> actual execve().
> 
> We do not currently have an easy way todo this, but I have the exact
> same problem in my patches to integrate with cgroups - I need to add
> the new PID to the appropriate cgroup immediately before exec'ing.
> So i suggest the following patch whichs a generic callback to the
> virExec() call, so we can implant the neccessary logic after the fork()
> and just before the real execve(), and safely in the child process.
> 
> To use this, we'd make qemudStartVM() pass in a virExecHook callback
> which does the call to  qemudDomainSetSecurityLabel()


I've committed this patch to CVS now.


> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -291,6 +291,7 @@ virEnumToString;
>  virEventAddHandle;
>  virEventRemoveHandle;
>  virExec;
> +virExecWithHook;
>  virSetNonBlock;
>  virFormatMacAddr;
>  virGetHostname;
> diff --git a/src/util.c b/src/util.c
> --- a/src/util.c
> +++ b/src/util.c
> @@ -199,7 +199,10 @@ __virExec(virConnectPtr conn,
>            const fd_set *keepfd,
>            pid_t *retpid,
>            int infd, int *outfd, int *errfd,
> -          int flags) {
> +          int flags,
> +          virExecHook hook,
> +          void *data)
> +{
>      pid_t pid;
>      int null, i, openmax;
>      int pipeout[2] = {-1,-1};
> @@ -411,6 +414,9 @@ __virExec(virConnectPtr conn,
>          childerr != childout)
>          close(childerr);
>  
> +    if (hook)
> +        (hook)(data);
> +
>      if (envp)
>          execve(argv[0], (char **) argv, (char**)envp);
>      else
> @@ -445,13 +451,16 @@ __virExec(virConnectPtr conn,
>  }
>  
>  int
> -virExec(virConnectPtr conn,
> -        const char *const*argv,
> -        const char *const*envp,
> -        const fd_set *keepfd,
> -        pid_t *retpid,
> -        int infd, int *outfd, int *errfd,
> -        int flags) {
> +virExecWithHook(virConnectPtr conn,
> +                const char *const*argv,
> +                const char *const*envp,
> +                const fd_set *keepfd,
> +                pid_t *retpid,
> +                int infd, int *outfd, int *errfd,
> +                int flags,
> +                virExecHook hook,
> +                void *data)
> +{
>      char *argv_str;
>  
>      if ((argv_str = virArgvToString(argv)) == NULL) {
> @@ -462,7 +471,21 @@ virExec(virConnectPtr conn,
>      VIR_FREE(argv_str);
>  
>      return __virExec(conn, argv, envp, keepfd, retpid, infd, outfd, errfd,
> -                     flags);
> +                     flags, hook, data);
> +}
> +
> +int
> +virExec(virConnectPtr conn,
> +        const char *const*argv,
> +        const char *const*envp,
> +        const fd_set *keepfd,
> +        pid_t *retpid,
> +        int infd, int *outfd, int *errfd,
> +        int flags)
> +{
> +    return virExecWithHook(conn, argv, envp, keepfd, retpid,
> +                           infd, outfd, errfd,
> +                           flags, NULL, NULL);
>  }
>  
>  static int
> @@ -580,7 +603,7 @@ virRun(virConnectPtr conn,
>  
>      if ((execret = __virExec(conn, argv, NULL, NULL,
>                               &childpid, -1, &outfd, &errfd,
> -                             VIR_EXEC_NONE)) < 0) {
> +                             VIR_EXEC_NONE, NULL, NULL)) < 0) {
>          ret = execret;
>          goto error;
>      }
> diff --git a/src/util.h b/src/util.h
> --- a/src/util.h
> +++ b/src/util.h
> @@ -40,6 +40,21 @@ enum {
>  
>  int virSetNonBlock(int fd);
>  
> +/* This will execute in the context of the first child
> + * immediately after fork() */
> +typedef int (*virExecHook)(void *data);
> +
> +int virExecWithHook(virConnectPtr conn,
> +                    const char *const*argv,
> +                    const char *const*envp,
> +                    const fd_set *keepfd,
> +                    int *retpid,
> +                    int infd,
> +                    int *outfd,
> +                    int *errfd,
> +                    int flags,
> +                    virExecHook hook,
> +                    void *data);
>  int virExec(virConnectPtr conn,
>              const char *const*argv,
>              const char *const*envp,
> 
> 


Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list