Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
37623bf4
L
libvirt
项目概览
openeuler
/
libvirt
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
libvirt
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
37623bf4
编写于
5月 15, 2009
作者:
D
Daniel Veillard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
* src/vbox/vbox_tmpl.c: implement vbox vrdp/sdl/gui support,
patches by Pritesh Kothari daniel
上级
cd223d93
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
354 addition
and
101 deletion
+354
-101
ChangeLog
ChangeLog
+5
-0
src/vbox/vbox_tmpl.c
src/vbox/vbox_tmpl.c
+349
-101
未找到文件。
ChangeLog
浏览文件 @
37623bf4
Fri May 15 15:44:01 CEST 2009 Daniel Veillard <veillard@redhat.com>
* src/vbox/vbox_tmpl.c: implement vbox vrdp/sdl/gui support,
patches by Pritesh Kothari
Fri May 15 11:41:46 CEST 2009 Daniel Veillard <veillard@redhat.com>
* docs/schemas/domain.rng src/domain_conf.[ch] src/qemu_driver.c:
...
...
src/vbox/vbox_tmpl.c
浏览文件 @
37623bf4
...
...
@@ -1366,9 +1366,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
PRBool
PAEEnabled
=
PR_FALSE
;
PRBool
ACPIEnabled
=
PR_FALSE
;
PRBool
IOAPICEnabled
=
PR_FALSE
;
#if 0
PRBool
VRDPEnabled
=
PR_FALSE
;
#endif
PRInt32
hddNum
=
0
;
PRUint32
CPUCount
=
0
;
PRUint32
memorySize
=
0
;
...
...
@@ -1387,9 +1385,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
IHardDisk
*
hardDiskPS
=
NULL
;
IHardDisk
*
hardDiskSS
=
NULL
;
PRUnichar
*
hddBusUtf16
=
NULL
;
#if 0
IVRDPServer
*
VRDPServer
=
NULL
;
#endif
IFloppyDrive
*
floppyDrive
=
NULL
;
IAudioAdapter
*
audioAdapter
=
NULL
;
IUSBController
*
USBController
=
NULL
;
...
...
@@ -1482,83 +1478,162 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
* so locatime is always true here */
def
->
localtime
=
1
;
#if 0
machine->vtbl->GetVRDPServer(machine, &VRDPServer);
if (VRDPServer) {
VRDPServer->vtbl->GetEnabled(VRDPServer, &VRDPEnabled);
if (VRDPEnabled) {
if (VIR_ALLOC(def->graphics) >= 0) {
PRUint32 VRDPport = 0;
PRUnichar *netAddressUtf16 = NULL;
PRUnichar *sessionTypeUtf16 = NULL;
char *sessionTypeUtf8 = NULL;
char *netAddressUtf8 = NULL;
PRUint32 authType = VRDPAuthType_Null;
PRBool allowMultiConnection = PR_FALSE;
PRBool reuseSingleConnection = PR_FALSE;
def->graphics->type = VIR_DOMAIN_GRAPHICS_TYPE_RDP;
VRDPServer->vtbl->GetPort(VRDPServer, &VRDPport);
if (VRDPport) {
def->graphics->data.rdp.port = VRDPport;
} else {
def->graphics->data.rdp.autoport = 1;
/* dump display options vrdp/gui/sdl */
{
int
vrdpPresent
=
0
;
int
sdlPresent
=
0
;
int
guiPresent
=
0
;
int
totalPresent
=
0
;
char
*
guiDisplay
=
NULL
;
char
*
sdlDisplay
=
NULL
;
PRUnichar
*
keyTypeUtf16
=
NULL
;
PRUnichar
*
valueTypeUtf16
=
NULL
;
char
*
valueTypeUtf8
=
NULL
;
def
->
ngraphics
=
0
;
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"
)
)
{
PRUnichar
*
keyDislpayUtf16
=
NULL
;
PRUnichar
*
valueDisplayUtf16
=
NULL
;
char
*
valueDisplayUtf8
=
NULL
;
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
=
NULL
;
}
}
VRDPServer->vtbl->GetNetAddress(VRDPServer, &netAddressUtf16);
if (netAddressUtf16) {
data->pFuncs->pfnUtf16ToUtf8(netAddressUtf16, &netAddressUtf8);
if (STRNEQ(netAddressUtf8, ""))
def->graphics->data.rdp.listenAddr = strdup(netAddressUtf8);
data->pFuncs->pfnUtf16Free(netAddressUtf16);
data->pFuncs->pfnUtf8Free(netAddressUtf8);
if
(
STREQ
(
valueTypeUtf8
,
"sdl"
))
{
sdlPresent
=
1
;
if
(
valueDisplayUtf8
)
sdlDisplay
=
strdup
(
valueDisplayUtf8
);
if
(
sdlDisplay
==
NULL
)
{
vboxError
(
dom
->
conn
,
VIR_ERR_SYSTEM_ERROR
,
"%s"
,
"strdup failed"
);
/* just don't go to cleanup yet as it is ok to have
* sdlDisplay as NULL and we check it below if it
* exist and then only use it there
*/
}
totalPresent
++
;
}
VRDPServer->vtbl->GetAuthType(VRDPServer, &authType);
if (authType == VRDPAuthType_External) {
PRUint32 authTimeout = 0;
if
(
STREQ
(
valueTypeUtf8
,
"gui"
))
{
guiPresent
=
1
;
if
(
valueDisplayUtf8
)
guiDisplay
=
strdup
(
valueDisplayUtf8
);
if
(
guiDisplay
==
NULL
)
{
vboxError
(
dom
->
conn
,
VIR_ERR_SYSTEM_ERROR
,
"%s"
,
"strdup failed"
);
/* just don't go to cleanup yet as it is ok to have
* guiDisplay as NULL and we check it below if it
* exist and then only use it there
*/
}
totalPresent
++
;
}
if
(
valueDisplayUtf8
)
data
->
pFuncs
->
pfnUtf8Free
(
valueDisplayUtf8
);
}
VRDPServer->vtbl->GetAuthTimeout(VRDPServer, &authTimeout);
if
(
STREQ
(
valueTypeUtf8
,
"vrdp"
))
vrdpPresent
=
1
;
def->graphics->data.rdp.auth = strdup("external");
def->graphics->data.rdp.authtimeout = authTimeout;
} else if (authType == VRDPAuthType_Guest) {
PRUint32 authTimeout = 0;
data
->
pFuncs
->
pfnUtf8Free
(
valueTypeUtf8
);
}
VRDPServer->vtbl->GetAuthTimeout(VRDPServer, &authTimeout);
if
((
totalPresent
>
0
)
&&
(
VIR_ALLOC_N
(
def
->
graphics
,
totalPresent
)
>=
0
))
{
if
((
guiPresent
)
&&
(
VIR_ALLOC
(
def
->
graphics
[
def
->
ngraphics
])
>=
0
))
{
def
->
graphics
[
def
->
ngraphics
]
->
type
=
VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP
;
if
(
guiDisplay
)
def
->
graphics
[
def
->
ngraphics
]
->
data
.
desktop
.
display
=
guiDisplay
;
def
->
ngraphics
++
;
}
def->graphics->data.rdp.auth = strdup("guest");
def->graphics->data.rdp.authtimeout = authTimeout;
if
((
sdlPresent
)
&&
(
VIR_ALLOC
(
def
->
graphics
[
def
->
ngraphics
])
>=
0
))
{
def
->
graphics
[
def
->
ngraphics
]
->
type
=
VIR_DOMAIN_GRAPHICS_TYPE_SDL
;
if
(
sdlDisplay
)
def
->
graphics
[
def
->
ngraphics
]
->
data
.
sdl
.
display
=
sdlDisplay
;
def
->
ngraphics
++
;
}
}
else
if
((
vrdpPresent
!=
1
)
&&
(
totalPresent
==
0
)
&&
(
VIR_ALLOC_N
(
def
->
graphics
,
1
)
>=
0
))
{
if
(
VIR_ALLOC
(
def
->
graphics
[
def
->
ngraphics
])
>=
0
)
{
def
->
graphics
[
def
->
ngraphics
]
->
type
=
VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP
;
def
->
graphics
[
def
->
ngraphics
]
->
data
.
desktop
.
display
=
strdup
(
getenv
(
"DISPLAY"
));
if
(
def
->
graphics
[
def
->
ngraphics
]
->
data
.
desktop
.
display
==
NULL
)
{
vboxError
(
dom
->
conn
,
VIR_ERR_SYSTEM_ERROR
,
"%s"
,
"strdup failed"
);
/* just don't go to cleanup yet as it is ok to have
* display as NULL
*/
}
totalPresent
++
;
def
->
ngraphics
++
;
}
}
machine
->
vtbl
->
GetVRDPServer
(
machine
,
&
VRDPServer
);
if
(
VRDPServer
)
{
VRDPServer
->
vtbl
->
GetEnabled
(
VRDPServer
,
&
VRDPEnabled
);
if
(
VRDPEnabled
)
{
VRDPServer->vtbl->GetAllowMultiConnection(VRDPServer, &allowMultiConnection);
if (allowMultiConnection) {
def->graphics->data.rdp.multiconnections = 1;
}
totalPresent
++
;
VRDPServer->vtbl->GetReuseSingleConnection(VRDPServer, &reuseSingleConnection);
if (reuseSingleConnection) {
def->graphics->data.rdp.reuseconnection = 1;
}
if
((
VIR_REALLOC_N
(
def
->
graphics
,
totalPresent
)
>=
0
)
&&
(
VIR_ALLOC
(
def
->
graphics
[
def
->
ngraphics
])
>=
0
))
{
PRUint32
VRDPport
=
0
;
PRUnichar
*
netAddressUtf16
=
NULL
;
char
*
netAddressUtf8
=
NULL
;
PRBool
allowMultiConnection
=
PR_FALSE
;
PRBool
reuseSingleConnection
=
PR_FALSE
;
def
->
graphics
[
def
->
ngraphics
]
->
type
=
VIR_DOMAIN_GRAPHICS_TYPE_RDP
;
VRDPServer
->
vtbl
->
GetPort
(
VRDPServer
,
&
VRDPport
);
if
(
VRDPport
)
{
def
->
graphics
[
def
->
ngraphics
]
->
data
.
rdp
.
port
=
VRDPport
;
}
else
{
def
->
graphics
[
def
->
ngraphics
]
->
data
.
rdp
.
autoport
=
1
;
}
VRDPServer
->
vtbl
->
GetNetAddress
(
VRDPServer
,
&
netAddressUtf16
);
if
(
netAddressUtf16
)
{
data
->
pFuncs
->
pfnUtf16ToUtf8
(
netAddressUtf16
,
&
netAddressUtf8
);
if
(
STRNEQ
(
netAddressUtf8
,
""
))
def
->
graphics
[
def
->
ngraphics
]
->
data
.
rdp
.
listenAddr
=
strdup
(
netAddressUtf8
);
data
->
pFuncs
->
pfnUtf16Free
(
netAddressUtf16
);
data
->
pFuncs
->
pfnUtf8Free
(
netAddressUtf8
);
}
machine->vtbl->GetSessionType(machine, &sessionTypeUtf16);
DEBUG0("Session Type:");
if (sessionTypeUtf16) {
data->pFuncs->pfnUtf16ToUtf8(sessionTypeUtf16, &sessionTypeUtf8);
DEBUG("Session Type: %s", sessionTypeUtf8);
if (STREQ(sessionTypeUtf8, "vrdp")) {
def->graphics->data.rdp.headless = 1;
VRDPServer
->
vtbl
->
GetAllowMultiConnection
(
VRDPServer
,
&
allowMultiConnection
);
if
(
allowMultiConnection
)
{
def
->
graphics
[
def
->
ngraphics
]
->
data
.
rdp
.
multiUser
=
1
;
}
data->pFuncs->pfnUtf16Free(sessionTypeUtf16);
data->pFuncs->pfnUtf8Free(sessionTypeUtf8);
VRDPServer
->
vtbl
->
GetReuseSingleConnection
(
VRDPServer
,
&
reuseSingleConnection
);
if
(
reuseSingleConnection
)
{
def
->
graphics
[
def
->
ngraphics
]
->
data
.
rdp
.
replaceUser
=
1
;
}
def
->
ngraphics
++
;
}
}
VRDPServer
->
vtbl
->
nsisupports
.
Release
((
nsISupports
*
)
VRDPServer
);
}
VRDPServer->vtbl->nsisupports.Release((nsISupports *)VRDPServer);
}
#endif
/* dump IDE hdds if present */
data
->
pFuncs
->
pfnUtf8ToUtf16
(
hddBus
,
&
hddBusUtf16
);
...
...
@@ -2268,20 +2343,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"
);
...
...
@@ -2319,6 +2386,106 @@ 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
;
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
=
NULL
;
}
}
if
(
STREQ
(
valueTypeUtf8
,
"sdl"
))
{
sdlPresent
=
1
;
if
(
valueDisplayUtf8
)
{
sdlDisplay
=
strdup
(
valueDisplayUtf8
);
if
(
sdlDisplay
==
NULL
)
{
vboxError
(
dom
->
conn
,
VIR_ERR_SYSTEM_ERROR
,
"%s"
,
"strdup failed"
);
/* just don't go to cleanup yet as it is ok to have
* sdlDisplay as NULL and we check it below if it
* exist and then only use it there
*/
}
}
}
if
(
STREQ
(
valueTypeUtf8
,
"gui"
))
{
guiPresent
=
1
;
if
(
valueDisplayUtf8
)
{
guiDisplay
=
strdup
(
valueDisplayUtf8
);
if
(
guiDisplay
==
NULL
)
{
vboxError
(
dom
->
conn
,
VIR_ERR_SYSTEM_ERROR
,
"%s"
,
"strdup failed"
);
/* just don't go to cleanup yet as it is ok to have
* guiDisplay as NULL and we check it below if it
* exist and then only use it there
*/
}
}
}
}
if
(
STREQ
(
valueTypeUtf8
,
"vrdp"
))
{
vrdpPresent
=
1
;
}
data
->
pFuncs
->
pfnUtf8Free
(
valueTypeUtf8
);
}
else
{
guiPresent
=
1
;
}
if
(
valueDisplayUtf8
)
data
->
pFuncs
->
pfnUtf8Free
(
valueDisplayUtf8
);
if
(
guiPresent
)
{
if
(
guiDisplay
)
{
sprintf
(
displayutf8
,
"DISPLAY=%.24s"
,
guiDisplay
);
data
->
pFuncs
->
pfnUtf8ToUtf16
(
displayutf8
,
&
env
);
VIR_FREE
(
guiDisplay
);
}
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"gui"
,
&
sessionType
);
}
if
(
sdlPresent
)
{
if
(
sdlDisplay
)
{
sprintf
(
displayutf8
,
"DISPLAY=%.24s"
,
sdlDisplay
);
data
->
pFuncs
->
pfnUtf8ToUtf16
(
displayutf8
,
&
env
);
VIR_FREE
(
sdlDisplay
);
}
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"sdl"
,
&
sessionType
);
}
if
(
vrdpPresent
)
{
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"vrdp"
,
&
sessionType
);
}
data
->
vboxObj
->
vtbl
->
OpenRemoteSession
(
data
->
vboxObj
,
data
->
vboxSession
,
...
...
@@ -3041,24 +3208,29 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
}
}
/* Finished:Block to attach the Parallel Port to the VM */
#if 0
{
/* Started:Block to attach the Remote Display to VM */
if (def->graphics) {
int
vrdpPresent
=
0
;
int
sdlPresent
=
0
;
int
guiPresent
=
0
;
char
*
guiDisplay
=
NULL
;
char
*
sdlDisplay
=
NULL
;
int
i
=
0
;
for
(
i
=
0
;
i
<
def
->
ngraphics
;
i
++
)
{
IVRDPServer
*
VRDPServer
=
NULL
;
/* TODO: include the support for headless stuff
*/
if
((
def
->
graphics
[
i
]
->
type
==
VIR_DOMAIN_GRAPHICS_TYPE_RDP
)
&&
(
vrdpPresent
==
0
))
{
if (def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_RDP) {
vrdpPresent
=
1
;
machine
->
vtbl
->
GetVRDPServer
(
machine
,
&
VRDPServer
);
if
(
VRDPServer
)
{
VRDPServer
->
vtbl
->
SetEnabled
(
VRDPServer
,
PR_TRUE
);
DEBUG0
(
"VRDP Support turned ON on port: 3389"
);
if (def->graphics->data.rdp.port) {
VRDPServer->vtbl->SetPort(VRDPServer, def->graphics->data.rdp.port);
DEBUG("VRDP Port changed to: %d", def->graphics->data.rdp.port);
} else if (def->graphics->data.rdp.autoport) {
if
(
def
->
graphics
[
i
]
->
data
.
rdp
.
port
)
{
VRDPServer
->
vtbl
->
SetPort
(
VRDPServer
,
def
->
graphics
[
i
]
->
data
.
rdp
.
port
);
DEBUG
(
"VRDP Port changed to: %d"
,
def
->
graphics
[
i
]
->
data
.
rdp
.
port
);
}
else
if
(
def
->
graphics
[
i
]
->
data
.
rdp
.
autoport
)
{
/* Setting the port to 0 will reset its value to
* the default one which is 3389 currently
*/
...
...
@@ -3066,37 +3238,22 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
DEBUG0
(
"VRDP Port changed to default, which is 3389 currently"
);
}
if (def->graphics
->data.rdp.reuseconnection
) {
if
(
def
->
graphics
[
i
]
->
data
.
rdp
.
replaceUser
)
{
VRDPServer
->
vtbl
->
SetReuseSingleConnection
(
VRDPServer
,
PR_TRUE
);
DEBUG0
(
"VRDP set to reuse single connection"
);
}
if (def->graphics
->data.rdp.multiconnections
) {
if
(
def
->
graphics
[
i
]
->
data
.
rdp
.
multiUser
)
{
VRDPServer
->
vtbl
->
SetAllowMultiConnection
(
VRDPServer
,
PR_TRUE
);
DEBUG0
(
"VRDP set to allow multiple connection"
);
}
if (def->graphics->data.rdp.auth) {
if (STREQ(def->graphics->data.rdp.auth, "guest")) {
VRDPServer->vtbl->SetAuthType(VRDPServer, VRDPAuthType_Guest);
DEBUG0("VRDP authentication method set to Guest");
} else if (STREQ(def->graphics->data.rdp.auth, "external")) {
VRDPServer->vtbl->SetAuthType(VRDPServer, VRDPAuthType_External);
DEBUG0("VRDP authentication method set to External");
}
if (def->graphics->data.rdp.authtimeout) {
VRDPServer->vtbl->SetAuthTimeout(VRDPServer, def->graphics->data.rdp.authtimeout);
DEBUG("VRDP authentication timeout is set to %llu", def->graphics->data.rdp.authtimeout);
}
}
if (def->graphics->data.rdp.listenAddr) {
if
(
def
->
graphics
[
i
]
->
data
.
rdp
.
listenAddr
)
{
PRUnichar
*
netAddressUtf16
=
NULL
;
data->pFuncs->pfnUtf8ToUtf16(def->graphics->data.rdp.listenAddr, &netAddressUtf16);
data
->
pFuncs
->
pfnUtf8ToUtf16
(
def
->
graphics
[
i
]
->
data
.
rdp
.
listenAddr
,
&
netAddressUtf16
);
VRDPServer
->
vtbl
->
SetNetAddress
(
VRDPServer
,
netAddressUtf16
);
DEBUG("VRDP listen address is set to: %s", def->graphics->data.rdp.listenAddr);
DEBUG
(
"VRDP listen address is set to: %s"
,
def
->
graphics
[
i
]
->
data
.
rdp
.
listenAddr
);
data
->
pFuncs
->
pfnUtf16Free
(
netAddressUtf16
);
}
...
...
@@ -3104,9 +3261,100 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
VRDPServer
->
vtbl
->
nsisupports
.
Release
((
nsISupports
*
)
VRDPServer
);
}
}
if
((
def
->
graphics
[
i
]
->
type
==
VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP
)
&&
(
guiPresent
==
0
))
{
guiPresent
=
1
;
guiDisplay
=
strdup
(
def
->
graphics
[
i
]
->
data
.
desktop
.
display
);
if
(
guiDisplay
==
NULL
)
{
vboxError
(
conn
,
VIR_ERR_SYSTEM_ERROR
,
"%s"
,
"strdup failed"
);
/* just don't go to cleanup yet as it is ok to have
* guiDisplay as NULL and we check it below if it
* exist and then only use it there
*/
}
}
if
((
def
->
graphics
[
i
]
->
type
==
VIR_DOMAIN_GRAPHICS_TYPE_SDL
)
&&
(
sdlPresent
==
0
))
{
sdlPresent
=
1
;
sdlDisplay
=
strdup
(
def
->
graphics
[
i
]
->
data
.
sdl
.
display
);
if
(
sdlDisplay
==
NULL
)
{
vboxError
(
conn
,
VIR_ERR_SYSTEM_ERROR
,
"%s"
,
"strdup failed"
);
/* just don't go to cleanup yet as it is ok to have
* sdlDisplay as NULL and we check it below if it
* exist and then only use it there
*/
}
}
}
if
((
vrdpPresent
==
1
)
&&
(
guiPresent
==
0
)
&&
(
sdlPresent
==
0
))
{
/* store extradata key that frontend is set to vrdp */
PRUnichar
*
keyTypeUtf16
=
NULL
;
PRUnichar
*
valueTypeUtf16
=
NULL
;
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"FRONTEND/Type"
,
&
keyTypeUtf16
);
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"vrdp"
,
&
valueTypeUtf16
);
machine
->
vtbl
->
SetExtraData
(
machine
,
keyTypeUtf16
,
valueTypeUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
keyTypeUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
valueTypeUtf16
);
}
else
if
((
guiPresent
==
0
)
&&
(
sdlPresent
==
1
))
{
/* store extradata key that frontend is set to sdl */
PRUnichar
*
keyTypeUtf16
=
NULL
;
PRUnichar
*
valueTypeUtf16
=
NULL
;
PRUnichar
*
keyDislpayUtf16
=
NULL
;
PRUnichar
*
valueDisplayUtf16
=
NULL
;
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"FRONTEND/Type"
,
&
keyTypeUtf16
);
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"sdl"
,
&
valueTypeUtf16
);
machine
->
vtbl
->
SetExtraData
(
machine
,
keyTypeUtf16
,
valueTypeUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
keyTypeUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
valueTypeUtf16
);
if
(
sdlDisplay
)
{
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"FRONTEND/Display"
,
&
keyDislpayUtf16
);
data
->
pFuncs
->
pfnUtf8ToUtf16
(
sdlDisplay
,
&
valueDisplayUtf16
);
machine
->
vtbl
->
SetExtraData
(
machine
,
keyDislpayUtf16
,
valueDisplayUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
keyDislpayUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
valueDisplayUtf16
);
}
}
else
{
/* if all are set then default is gui, with vrdp turned on */
PRUnichar
*
keyTypeUtf16
=
NULL
;
PRUnichar
*
valueTypeUtf16
=
NULL
;
PRUnichar
*
keyDislpayUtf16
=
NULL
;
PRUnichar
*
valueDisplayUtf16
=
NULL
;
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"FRONTEND/Type"
,
&
keyTypeUtf16
);
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"gui"
,
&
valueTypeUtf16
);
machine
->
vtbl
->
SetExtraData
(
machine
,
keyTypeUtf16
,
valueTypeUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
keyTypeUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
valueTypeUtf16
);
if
(
guiDisplay
)
{
data
->
pFuncs
->
pfnUtf8ToUtf16
(
"FRONTEND/Display"
,
&
keyDislpayUtf16
);
data
->
pFuncs
->
pfnUtf8ToUtf16
(
guiDisplay
,
&
valueDisplayUtf16
);
machine
->
vtbl
->
SetExtraData
(
machine
,
keyDislpayUtf16
,
valueDisplayUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
keyDislpayUtf16
);
data
->
pFuncs
->
pfnUtf16Free
(
valueDisplayUtf16
);
}
}
VIR_FREE
(
guiDisplay
);
VIR_FREE
(
sdlDisplay
);
}
/* Finished:Block to attach the Remote Display to VM */
#endif
{
/* Started:Block to attach USB Devices to VM */
if
(
def
->
nhostdevs
>
0
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录