[libvirt] [PATCH 3/3] Support for vrdp/sdl/gui while starting the machine

Daniel P. Berrange berrange at redhat.com
Mon May 11 10:24:45 UTC 2009


On Thu, May 07, 2009 at 03:50:13PM +0200, Pritesh Kothari wrote:
> Hi All,
> 
> I have added support for vrdp/sdl/gui modes for VirtualBox driver in libvirt. 
> Tha patch's are as below:
> 
> [PATCH 1/3]: contains support for vrdp/sdl/gui while defining a machine.
> [PATCH 2/3]: contains support for vrdp/sdl/gui while dumping xml
> [PATCH 3/3]: contains support for vrdp/sdl/gui while starting the machine
> 
> Regards,
> Pritesh

> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 223009a..97a686f 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -2322,20 +2322,12 @@ static int vboxDomainCreate(virDomainPtr dom) {
>      IProgress *progress    = NULL;
>      PRUint32 machineCnt    = 0;
>      PRUnichar *env         = NULL;
> -    const char *display    = getenv("DISPLAY");
>      PRUnichar *sessionType = NULL;
>      char displayutf8[32]   = {0};
>      unsigned char iidl[VIR_UUID_BUFLEN] = {0};
>      int i, ret = -1;
>  
>  
> -    if (display) {
> -        sprintf(displayutf8, "DISPLAY=%s", display);
> -        data->pFuncs->pfnUtf8ToUtf16(displayutf8, &env);
> -    }
> -
> -    data->pFuncs->pfnUtf8ToUtf16("gui", &sessionType);
> -
>      if (!dom->name) {
>          vboxError(dom->conn, VIR_ERR_INTERNAL_ERROR,"%s",
>                    "Error while reading the domain name");
> @@ -2373,6 +2365,92 @@ static int vboxDomainCreate(virDomainPtr dom) {
>                      if ( (state == MachineState_PoweredOff) ||
>                           (state == MachineState_Saved) ||
>                           (state == MachineState_Aborted) ) {
> +                        int vrdpPresent              = 0;
> +                        int sdlPresent               = 0;
> +                        int guiPresent               = 0;
> +                        char *guiDisplay             = NULL;
> +                        char *sdlDisplay             = NULL;
> +                        PRUnichar *keyTypeUtf16      = NULL;
> +                        PRUnichar *valueTypeUtf16    = NULL;
> +                        char      *valueTypeUtf8     = NULL;
> +                        PRUnichar *keyDislpayUtf16   = NULL;
> +                        PRUnichar *valueDisplayUtf16 = NULL;
> +                        char      *valueDisplayUtf8  = NULL;
> +                        int valueDisplayFree         = 1;
> +
> +                        data->pFuncs->pfnUtf8ToUtf16("FRONTEND/Type", &keyTypeUtf16);
> +                        machine->vtbl->GetExtraData(machine, keyTypeUtf16, &valueTypeUtf16);
> +                        data->pFuncs->pfnUtf16Free(keyTypeUtf16);
> +
> +                        if (valueTypeUtf16) {
> +                            data->pFuncs->pfnUtf16ToUtf8(valueTypeUtf16, &valueTypeUtf8);
> +                            data->pFuncs->pfnUtf16Free(valueTypeUtf16);
> +
> +                            if ( STREQ(valueTypeUtf8, "sdl") || STREQ(valueTypeUtf8, "gui") ) {
> +
> +                                data->pFuncs->pfnUtf8ToUtf16("FRONTEND/Display", &keyDislpayUtf16);
> +                                machine->vtbl->GetExtraData(machine, keyDislpayUtf16, &valueDisplayUtf16);
> +                                data->pFuncs->pfnUtf16Free(keyDislpayUtf16);
> +
> +                                if (valueDisplayUtf16) {
> +                                    data->pFuncs->pfnUtf16ToUtf8(valueDisplayUtf16, &valueDisplayUtf8);
> +                                    data->pFuncs->pfnUtf16Free(valueDisplayUtf16);
> +
> +                                    if (strlen(valueDisplayUtf8) <= 0) {
> +                                        data->pFuncs->pfnUtf8Free(valueDisplayUtf8);
> +                                        valueDisplayUtf8 = getenv("DISPLAY");
> +                                        valueDisplayFree = 0;
> +                                    }
> +                                } else {
> +                                    valueDisplayUtf8 = getenv("DISPLAY");
> +                                    valueDisplayFree = 0;
> +                                }
> +
> +                                if (STREQ(valueTypeUtf8, "sdl")) {
> +                                    sdlPresent = 1;
> +                                    sdlDisplay = strdup(valueDisplayUtf8);
> +                                }
> +
> +                                if (STREQ(valueTypeUtf8, "gui")) {
> +                                    guiPresent = 1;
> +                                    guiDisplay = strdup(valueDisplayUtf8);
> +                                }
> +                            }
> +
> +                            if (STREQ(valueTypeUtf8, "vrdp")) {
> +                                vrdpPresent = 1;
> +                            }
> +
> +                            data->pFuncs->pfnUtf8Free(valueTypeUtf8);
> +
> +                        } else {
> +                            guiPresent = 1;
> +                            guiDisplay = strdup(getenv("DISPLAY"));
> +                        }
> +                        if (valueDisplayFree)
> +                            data->pFuncs->pfnUtf8Free(valueDisplayUtf8);
> +
> +                        if (guiPresent) {
> +                            sprintf(displayutf8, "DISPLAY=%.24s", guiDisplay);
> +                            data->pFuncs->pfnUtf8ToUtf16(displayutf8, &env);
> +
> +                            data->pFuncs->pfnUtf8ToUtf16("gui", &sessionType);
> +
> +                            VIR_FREE(guiDisplay);
> +                        }
> +
> +                        if (sdlPresent) {
> +                            sprintf(displayutf8, "DISPLAY=%.24s", sdlDisplay);
> +                            data->pFuncs->pfnUtf8ToUtf16(displayutf8, &env);
> +
> +                            data->pFuncs->pfnUtf8ToUtf16("sdl", &sessionType);
> +
> +                            VIR_FREE(sdlDisplay);
> +                        }
> +
> +                        if (vrdpPresent) {
> +                            data->pFuncs->pfnUtf8ToUtf16("vrdp", &sessionType);
> +                        }


Same issue about use of 'getenv' & strdup OOM handling here.

Regards,
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