Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
d5b1933e
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,发现更多精彩内容 >>
提交
d5b1933e
编写于
12月 16, 2010
作者:
M
Matthias Bolte
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
vbox: Handle different array representations of XPCOM and MSCOM
Add a vboxArray to hide the details from the general driver code.
上级
448347f8
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
447 addition
and
249 deletion
+447
-249
src/vbox/vbox_MSCOMGlue.c
src/vbox/vbox_MSCOMGlue.c
+107
-0
src/vbox/vbox_MSCOMGlue.h
src/vbox/vbox_MSCOMGlue.h
+15
-0
src/vbox/vbox_XPCOMCGlue.c
src/vbox/vbox_XPCOMCGlue.c
+115
-0
src/vbox/vbox_XPCOMCGlue.h
src/vbox/vbox_XPCOMCGlue.h
+14
-0
src/vbox/vbox_tmpl.c
src/vbox/vbox_tmpl.c
+196
-249
未找到文件。
src/vbox/vbox_MSCOMGlue.c
浏览文件 @
d5b1933e
...
...
@@ -646,3 +646,110 @@ void
VBoxCGlueTerm
(
void
)
{
}
/*
* In MSCOM an array is represented by a SAFEARRAY pointer. To access the items
* in the array the SafeArrayAccessData function is used to lock the array and
* get its contents. When the items aren't needed anymore the
* SafeArrayUnaccessData function is used to unlock the array. The pointer
* retuned by SafeArrayAccessData function becomes invalid. Finally the
* SafeArrayDestroy function is called to destroy the array, it also releases
* or frees all items in the array according to their type.
*/
typedef
HRESULT
__stdcall
(
*
SafeArrayGetter
)(
void
*
self
,
SAFEARRAY
**
array
);
typedef
HRESULT
__stdcall
(
*
SafeArrayGetterWithArg
)(
void
*
self
,
void
*
arg
,
SAFEARRAY
**
array
);
/*
* Call the getter with self as first argument and fill the array with the
* returned items.
*/
nsresult
vboxArrayGet
(
vboxArray
*
array
,
void
*
self
,
void
*
getter
)
{
HRESULT
hrc
;
SAFEARRAY
*
safeArray
=
NULL
;
void
**
items
=
NULL
;
array
->
items
=
NULL
;
array
->
count
=
0
;
array
->
handle
=
NULL
;
hrc
=
((
SafeArrayGetter
)
getter
)(
self
,
&
safeArray
);
if
(
FAILED
(
hrc
))
{
return
hrc
;
}
hrc
=
SafeArrayAccessData
(
safeArray
,
(
void
**
)
&
items
);
if
(
FAILED
(
hrc
))
{
SafeArrayDestroy
(
safeArray
);
return
hrc
;
}
array
->
items
=
items
;
array
->
count
=
safeArray
->
rgsabound
[
0
].
cElements
;
array
->
handle
=
safeArray
;
return
hrc
;
}
/*
* Call the getter with self as first argument and arg as second argument
* and fill the array with the returned items.
*/
nsresult
vboxArrayGetWithArg
(
vboxArray
*
array
,
void
*
self
,
void
*
getter
,
void
*
arg
)
{
HRESULT
hrc
;
SAFEARRAY
*
safeArray
=
NULL
;
void
**
items
=
NULL
;
array
->
items
=
NULL
;
array
->
count
=
0
;
array
->
handle
=
NULL
;
hrc
=
((
SafeArrayGetterWithArg
)
getter
)(
self
,
arg
,
&
safeArray
);
if
(
FAILED
(
hrc
))
{
return
hrc
;
}
hrc
=
SafeArrayAccessData
(
safeArray
,
(
void
**
)
&
items
);
if
(
FAILED
(
hrc
))
{
SafeArrayDestroy
(
safeArray
);
return
hrc
;
}
array
->
items
=
items
;
array
->
count
=
safeArray
->
rgsabound
[
0
].
cElements
;
array
->
handle
=
safeArray
;
return
hrc
;
}
/*
* Release all items in the array and reset it.
*
* SafeArrayDestroy is aware of the item's type and calls release or free
* for each item according to its type. Therefore, vboxArrayUnalloc and
* vboxArrayRelease are the same for MSCOM.
*/
void
vboxArrayRelease
(
vboxArray
*
array
)
{
if
(
array
->
handle
==
NULL
)
{
return
;
}
SafeArrayUnaccessData
(
array
->
handle
);
SafeArrayDestroy
(
array
->
handle
);
array
->
items
=
NULL
;
array
->
count
=
0
;
array
->
handle
=
NULL
;
}
src/vbox/vbox_MSCOMGlue.h
浏览文件 @
d5b1933e
...
...
@@ -30,4 +30,19 @@ extern PFNVBOXGETXPCOMCFUNCTIONS g_pfnGetFunctions;
int
VBoxCGlueInit
(
unsigned
int
*
version
);
void
VBoxCGlueTerm
(
void
);
typedef
struct
_vboxArray
vboxArray
;
struct
_vboxArray
{
void
**
items
;
size_t
count
;
void
*
handle
;
};
# define VBOX_ARRAY_INITIALIZER { NULL, 0, NULL }
nsresult
vboxArrayGet
(
vboxArray
*
array
,
void
*
self
,
void
*
getter
);
nsresult
vboxArrayGetWithArg
(
vboxArray
*
array
,
void
*
self
,
void
*
getter
,
void
*
arg
);
void
vboxArrayRelease
(
vboxArray
*
array
);
# define vboxArrayUnalloc vboxArrayRelease
#endif
/* __VBOX_MSCOMGLUE_H__ */
src/vbox/vbox_XPCOMCGlue.c
浏览文件 @
d5b1933e
...
...
@@ -253,3 +253,118 @@ VBoxCGlueTerm(void)
pVBoxFuncs_v2_2
=
NULL
;
g_pfnGetFunctions
=
NULL
;
}
/*
* In XPCOM an array is represented by 1) a pointer to an array of pointers
* that point to the items and 2) an unsigned int representing the number of
* items in the array. When the items aren't needed anymore they are released
* or freed according to their type.
*/
typedef
nsresult
(
*
ArrayGetter
)(
void
*
self
,
PRUint32
*
count
,
void
***
items
);
typedef
nsresult
(
*
ArrayGetterWithArg
)(
void
*
self
,
void
*
arg
,
PRUint32
*
count
,
void
***
items
);
/*
* Call the getter with self as first argument and fill the array with the
* returned items.
*/
nsresult
vboxArrayGet
(
vboxArray
*
array
,
void
*
self
,
void
*
getter
)
{
nsresult
nsrc
;
void
**
items
=
NULL
;
PRUint32
count
=
0
;
array
->
items
=
NULL
;
array
->
count
=
0
;
nsrc
=
((
ArrayGetter
)
getter
)(
self
,
&
count
,
&
items
);
if
(
NS_FAILED
(
nsrc
))
{
return
nsrc
;
}
array
->
items
=
items
;
array
->
count
=
count
;
return
nsrc
;
}
/*
* Call the getter with self as first argument and arg as second argument
* and fill the array with the returned items.
*/
nsresult
vboxArrayGetWithArg
(
vboxArray
*
array
,
void
*
self
,
void
*
getter
,
void
*
arg
)
{
nsresult
nsrc
;
void
**
items
=
NULL
;
PRUint32
count
=
0
;
array
->
items
=
NULL
;
array
->
count
=
0
;
nsrc
=
((
ArrayGetterWithArg
)
getter
)(
self
,
arg
,
&
count
,
&
items
);
if
(
NS_FAILED
(
nsrc
))
{
return
nsrc
;
}
array
->
items
=
items
;
array
->
count
=
count
;
return
nsrc
;
}
/*
* Release all items in the array and reset it.
*/
void
vboxArrayRelease
(
vboxArray
*
array
)
{
int
i
;
nsISupports
*
supports
;
if
(
array
->
items
==
NULL
)
{
return
;
}
for
(
i
=
0
;
i
<
array
->
count
;
++
i
)
{
supports
=
array
->
items
[
i
];
if
(
supports
!=
NULL
)
{
supports
->
vtbl
->
Release
(
supports
);
}
}
array
->
items
=
NULL
;
array
->
count
=
0
;
}
/*
* Unalloc all items in the array and reset it.
*/
void
vboxArrayUnalloc
(
vboxArray
*
array
)
{
int
i
;
void
*
item
;
if
(
array
->
items
==
NULL
)
{
return
;
}
for
(
i
=
0
;
i
<
array
->
count
;
++
i
)
{
item
=
array
->
items
[
i
];
if
(
item
!=
NULL
)
{
pVBoxFuncs_v2_2
->
pfnComUnallocMem
(
item
);
}
}
array
->
items
=
NULL
;
array
->
count
=
0
;
}
src/vbox/vbox_XPCOMCGlue.h
浏览文件 @
d5b1933e
...
...
@@ -38,4 +38,18 @@ extern PFNVBOXGETXPCOMCFUNCTIONS g_pfnGetFunctions;
int
VBoxCGlueInit
(
unsigned
int
*
version
);
void
VBoxCGlueTerm
(
void
);
typedef
struct
_vboxArray
vboxArray
;
struct
_vboxArray
{
void
**
items
;
size_t
count
;
};
# define VBOX_ARRAY_INITIALIZER { NULL, 0 }
nsresult
vboxArrayGet
(
vboxArray
*
array
,
void
*
self
,
void
*
getter
);
nsresult
vboxArrayGetWithArg
(
vboxArray
*
array
,
void
*
self
,
void
*
getter
,
void
*
arg
);
void
vboxArrayRelease
(
vboxArray
*
array
);
void
vboxArrayUnalloc
(
vboxArray
*
array
);
#endif
src/vbox/vbox_tmpl.c
浏览文件 @
d5b1933e
...
...
@@ -77,6 +77,8 @@
#define VBOX_UTF16_TO_UTF8(arg1, arg2) data->pFuncs->pfnUtf16ToUtf8(arg1, arg2)
#define VBOX_UTF8_TO_UTF16(arg1, arg2) data->pFuncs->pfnUtf8ToUtf16(arg1, arg2)
#define VBOX_ADDREF(arg) (arg)->vtbl->nsisupports.AddRef((nsISupports *)(arg))
#define VBOX_RELEASE(arg) \
if(arg)\
(arg)->vtbl->nsisupports.Release((nsISupports *)(arg))
...
...
@@ -942,26 +944,21 @@ static char *vboxGetCapabilities(virConnectPtr conn) {
static
int
vboxListDomains
(
virConnectPtr
conn
,
int
*
ids
,
int
nids
)
{
VBOX_OBJECT_CHECK
(
conn
,
int
,
-
1
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
PRUint32
state
;
nsresult
rc
;
int
i
,
j
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get list of Domains, rc=%08x"
),(
unsigned
)
rc
);
goto
cleanup
;
}
if
(
machineCnt
==
0
)
{
ret
=
0
;
goto
cleanup
;
}
for
(
i
=
0
,
j
=
0
;
(
i
<
machineCnt
)
&&
(
j
<
nids
);
++
i
)
{
IMachine
*
machine
=
machines
[
i
];
ret
=
0
;
for
(
i
=
0
,
j
=
0
;
(
i
<
machines
.
count
)
&&
(
j
<
nids
);
++
i
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
if
(
machine
)
{
PRBool
isAccessible
=
PR_FALSE
;
...
...
@@ -976,37 +973,29 @@ static int vboxListDomains(virConnectPtr conn, int *ids, int nids) {
}
}
}
ret
++
;
cleanup:
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
return
ret
;
}
static
int
vboxNumOfDomains
(
virConnectPtr
conn
)
{
VBOX_OBJECT_CHECK
(
conn
,
int
,
-
1
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
PRUint32
state
;
nsresult
rc
;
int
i
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get number of Domains, rc=%08x"
),
(
unsigned
)
rc
);
goto
cleanup
;
}
if
(
machineCnt
==
0
)
{
ret
=
0
;
goto
cleanup
;
}
/* Do the cleanup as required by GetMachines() */
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
{
IMachine
*
machine
=
machines
[
i
];
ret
=
0
;
for
(
i
=
0
;
i
<
machines
.
count
;
++
i
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
if
(
machine
)
{
PRBool
isAccessible
=
PR_FALSE
;
...
...
@@ -1019,11 +1008,9 @@ static int vboxNumOfDomains(virConnectPtr conn) {
}
}
}
ret
++
;
cleanup:
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
return
ret
;
}
...
...
@@ -1056,13 +1043,11 @@ static virDomainPtr vboxDomainCreateXML(virConnectPtr conn, const char *xml,
static
virDomainPtr
vboxDomainLookupByID
(
virConnectPtr
conn
,
int
id
)
{
VBOX_OBJECT_CHECK
(
conn
,
virDomainPtr
,
NULL
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
vboxIID
*
iid
=
NULL
;
unsigned
char
iidl
[
VIR_UUID_BUFLEN
];
PRUint32
state
;
nsresult
rc
;
int
i
;
/* Internal vbox IDs start from 0, the public libvirt ID
* starts from 1, so refuse id==0, and adjust the rest*/
...
...
@@ -1073,28 +1058,30 @@ static virDomainPtr vboxDomainLookupByID(virConnectPtr conn, int id) {
}
id
=
id
-
1
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get list of machines, rc=%08x"
),
(
unsigned
)
rc
);
return
NULL
;
}
if
(
id
<
machineCnt
)
{
if
(
machines
[
id
])
{
if
(
id
<
machines
.
count
)
{
IMachine
*
machine
=
machines
.
items
[
id
];
if
(
machine
)
{
PRBool
isAccessible
=
PR_FALSE
;
machine
s
[
id
]
->
vtbl
->
GetAccessible
(
machines
[
id
]
,
&
isAccessible
);
machine
->
vtbl
->
GetAccessible
(
machine
,
&
isAccessible
);
if
(
isAccessible
)
{
machine
s
[
id
]
->
vtbl
->
GetState
(
machines
[
id
]
,
&
state
);
machine
->
vtbl
->
GetState
(
machine
,
&
state
);
if
(
(
state
>=
MachineState_FirstOnline
)
&&
(
state
<=
MachineState_LastOnline
)
)
{
PRUnichar
*
machineNameUtf16
=
NULL
;
char
*
machineNameUtf8
=
NULL
;
machine
s
[
id
]
->
vtbl
->
GetName
(
machines
[
id
]
,
&
machineNameUtf16
);
machine
->
vtbl
->
GetName
(
machine
,
&
machineNameUtf16
);
VBOX_UTF16_TO_UTF8
(
machineNameUtf16
,
&
machineNameUtf8
);
machine
s
[
id
]
->
vtbl
->
GetId
(
machines
[
id
]
,
&
iid
);
machine
->
vtbl
->
GetId
(
machine
,
&
iid
);
vboxIIDToUUID
(
iidl
,
iid
);
vboxIIDUnalloc
(
iid
);
...
...
@@ -1116,17 +1103,14 @@ static virDomainPtr vboxDomainLookupByID(virConnectPtr conn, int id) {
}
}
/* Do the cleanup as required by GetMachines() */
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
return
ret
;
}
static
virDomainPtr
vboxDomainLookupByUUID
(
virConnectPtr
conn
,
const
unsigned
char
*
uuid
)
{
VBOX_OBJECT_CHECK
(
conn
,
virDomainPtr
,
NULL
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
vboxIID
*
iid
=
NULL
;
char
*
machineNameUtf8
=
NULL
;
PRUnichar
*
machineNameUtf16
=
NULL
;
...
...
@@ -1134,15 +1118,15 @@ static virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, const unsigned ch
int
i
,
matched
=
0
;
nsresult
rc
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get list of machines, rc=%08x"
),
(
unsigned
)
rc
);
return
NULL
;
}
for
(
i
=
0
;
i
<
machine
C
nt
;
++
i
)
{
IMachine
*
machine
=
machines
[
i
];
for
(
i
=
0
;
i
<
machine
s
.
cou
nt
;
++
i
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
PRBool
isAccessible
=
PR_FALSE
;
if
(
!
machine
)
...
...
@@ -1189,16 +1173,14 @@ static virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, const unsigned ch
/* Do the cleanup and take care you dont leak any memory */
VBOX_UTF8_FREE
(
machineNameUtf8
);
VBOX_COM_UNALLOC_MEM
(
machineNameUtf16
);
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
return
ret
;
}
static
virDomainPtr
vboxDomainLookupByName
(
virConnectPtr
conn
,
const
char
*
name
)
{
VBOX_OBJECT_CHECK
(
conn
,
virDomainPtr
,
NULL
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
vboxIID
*
iid
=
NULL
;
char
*
machineNameUtf8
=
NULL
;
PRUnichar
*
machineNameUtf16
=
NULL
;
...
...
@@ -1206,15 +1188,15 @@ static virDomainPtr vboxDomainLookupByName(virConnectPtr conn, const char *name)
int
i
,
matched
=
0
;
nsresult
rc
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get list of machines, rc=%08x"
),
(
unsigned
)
rc
);
return
NULL
;
}
for
(
i
=
0
;
i
<
machine
C
nt
;
++
i
)
{
IMachine
*
machine
=
machines
[
i
];
for
(
i
=
0
;
i
<
machine
s
.
cou
nt
;
++
i
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
PRBool
isAccessible
=
PR_FALSE
;
if
(
!
machine
)
...
...
@@ -1264,9 +1246,7 @@ static virDomainPtr vboxDomainLookupByName(virConnectPtr conn, const char *name)
}
}
/* Do the cleanup and take care you dont leak any memory */
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
return
ret
;
}
...
...
@@ -1274,8 +1254,7 @@ static virDomainPtr vboxDomainLookupByName(virConnectPtr conn, const char *name)
static
int
vboxDomainIsActive
(
virDomainPtr
dom
)
{
VBOX_OBJECT_CHECK
(
dom
->
conn
,
int
,
-
1
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
vboxIID
*
iid
=
NULL
;
char
*
machineNameUtf8
=
NULL
;
PRUnichar
*
machineNameUtf16
=
NULL
;
...
...
@@ -1283,15 +1262,15 @@ static int vboxDomainIsActive(virDomainPtr dom) {
int
i
,
matched
=
0
;
nsresult
rc
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get list of machines, rc=%08x"
),
(
unsigned
)
rc
);
return
ret
;
}
for
(
i
=
0
;
i
<
machine
C
nt
;
++
i
)
{
IMachine
*
machine
=
machines
[
i
];
for
(
i
=
0
;
i
<
machine
s
.
cou
nt
;
++
i
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
PRBool
isAccessible
=
PR_FALSE
;
if
(
!
machine
)
...
...
@@ -1332,8 +1311,7 @@ static int vboxDomainIsActive(virDomainPtr dom) {
/* Do the cleanup and take care you dont leak any memory */
VBOX_UTF8_FREE
(
machineNameUtf8
);
VBOX_COM_UNALLOC_MEM
(
machineNameUtf16
);
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
return
ret
;
}
...
...
@@ -1718,14 +1696,13 @@ cleanup:
static
int
vboxDomainGetInfo
(
virDomainPtr
dom
,
virDomainInfoPtr
info
)
{
VBOX_OBJECT_CHECK
(
dom
->
conn
,
int
,
-
1
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
char
*
machineName
=
NULL
;
PRUnichar
*
machineNameUtf16
=
NULL
;
nsresult
rc
;
int
i
=
0
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get list of machines, rc=%08x"
),
(
unsigned
)
rc
);
...
...
@@ -1733,8 +1710,8 @@ static int vboxDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) {
}
info
->
nrVirtCpu
=
0
;
for
(
i
=
0
;
i
<
machine
C
nt
;
++
i
)
{
IMachine
*
machine
=
machines
[
i
];
for
(
i
=
0
;
i
<
machine
s
.
cou
nt
;
++
i
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
PRBool
isAccessible
=
PR_FALSE
;
if
(
!
machine
)
...
...
@@ -1815,9 +1792,7 @@ static int vboxDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) {
}
/* Do the cleanup and take care you dont leak any memory */
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
cleanup:
return
ret
;
...
...
@@ -2034,8 +2009,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
PRUnichar
*
hddBusUtf16
=
NULL
;
IFloppyDrive
*
floppyDrive
=
NULL
;
#else
/* VBOX_API_VERSION >= 3001 */
PRUint32
mediumAttachSize
=
0
;
IMediumAttachment
**
mediumAttachments
=
NULL
;
vboxArray
mediumAttachments
=
VBOX_ARRAY_INITIALIZER
;
#endif
/* VBOX_API_VERSION >= 3001 */
IVRDPServer
*
VRDPServer
=
NULL
;
IAudioAdapter
*
audioAdapter
=
NULL
;
...
...
@@ -2436,11 +2410,11 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
PRUint32
maxPortPerInst
[
StorageBus_Floppy
+
1
]
=
{};
PRUint32
maxSlotPerPort
[
StorageBus_Floppy
+
1
]
=
{};
def
->
ndisks
=
0
;
machine
->
vtbl
->
GetMediumAttachments
(
machine
,
&
mediumAttachSize
,
&
m
ediumAttachments
);
vboxArrayGet
(
&
mediumAttachments
,
machine
,
machine
->
vtbl
->
GetM
ediumAttachments
);
/* get the number of attachments */
for
(
i
=
0
;
i
<
mediumAttach
Size
;
i
++
)
{
IMediumAttachment
*
imediumattach
=
mediumAttachments
[
i
];
for
(
i
=
0
;
i
<
mediumAttach
ments
.
count
;
i
++
)
{
IMediumAttachment
*
imediumattach
=
mediumAttachments
.
items
[
i
];
if
(
imediumattach
)
{
IMedium
*
medium
=
NULL
;
...
...
@@ -2470,8 +2444,8 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
error
=
!
vboxGetMaxPortSlotValues
(
data
->
vboxObj
,
maxPortPerInst
,
maxSlotPerPort
);
/* get the attachment details here */
for
(
i
=
0
;
i
<
mediumAttach
Size
&&
diskCount
<
def
->
ndisks
&&
!
error
;
i
++
)
{
IMediumAttachment
*
imediumattach
=
mediumAttachments
[
i
];
for
(
i
=
0
;
i
<
mediumAttach
ments
.
count
&&
diskCount
<
def
->
ndisks
&&
!
error
;
i
++
)
{
IMediumAttachment
*
imediumattach
=
mediumAttachments
.
items
[
i
];
IStorageController
*
storageController
=
NULL
;
PRUnichar
*
storageControllerName
=
NULL
;
PRUint32
deviceType
=
DeviceType_Null
;
...
...
@@ -2569,9 +2543,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
diskCount
++
;
}
/* free the memory */
for
(
i
=
0
;
i
<
mediumAttachSize
;
i
++
)
VBOX_RELEASE
(
mediumAttachments
[
i
]);
vboxArrayRelease
(
&
mediumAttachments
);
/* cleanup on error */
if
(
error
)
{
...
...
@@ -3013,23 +2985,22 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
USBController
->
vtbl
->
GetEnabled
(
USBController
,
&
enabled
);
if
(
enabled
)
{
PRUint32
deviceFiltersNum
=
0
;
IUSBDeviceFilter
**
deviceFilters
=
NULL
;
vboxArray
deviceFilters
=
VBOX_ARRAY_INITIALIZER
;
USBController
->
vtbl
->
GetDeviceFilters
(
USBController
,
&
deviceFiltersNum
,
&
deviceFilters
);
vboxArrayGet
(
&
deviceFilters
,
USBController
,
USBController
->
vtbl
->
GetDeviceFilters
);
if
(
deviceFilters
Num
>
0
)
{
if
(
deviceFilters
.
count
>
0
)
{
/* check if the filters are active and then only
* alloc mem and set def->nhostdevs
*/
for
(
i
=
0
;
i
<
deviceFilters
Num
;
i
++
)
{
for
(
i
=
0
;
i
<
deviceFilters
.
count
;
i
++
)
{
PRBool
active
=
PR_FALSE
;
IUSBDeviceFilter
*
deviceFilter
=
deviceFilters
.
items
[
i
];
deviceFilter
s
[
i
]
->
vtbl
->
GetActive
(
deviceFilters
[
i
]
,
&
active
);
deviceFilter
->
vtbl
->
GetActive
(
deviceFilter
,
&
active
);
if
(
active
)
{
def
->
nhostdevs
++
;
}
...
...
@@ -3039,10 +3010,11 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
/* Alloc mem needed for the filters now */
if
(
VIR_ALLOC_N
(
def
->
hostdevs
,
def
->
nhostdevs
)
>=
0
)
{
for
(
i
=
0
;
(
USBFilterCount
<
def
->
nhostdevs
)
||
(
i
<
deviceFilters
Num
);
i
++
)
{
for
(
i
=
0
;
(
USBFilterCount
<
def
->
nhostdevs
)
||
(
i
<
deviceFilters
.
count
);
i
++
)
{
PRBool
active
=
PR_FALSE
;
IUSBDeviceFilter
*
deviceFilter
=
deviceFilters
.
items
[
i
];
deviceFilter
s
[
i
]
->
vtbl
->
GetActive
(
deviceFilters
[
i
]
,
&
active
);
deviceFilter
->
vtbl
->
GetActive
(
deviceFilter
,
&
active
);
if
(
active
)
{
if
(
VIR_ALLOC
(
def
->
hostdevs
[
USBFilterCount
])
>=
0
)
{
PRUnichar
*
vendorIdUtf16
=
NULL
;
...
...
@@ -3058,8 +3030,8 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
def
->
hostdevs
[
USBFilterCount
]
->
source
.
subsys
.
type
=
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB
;
deviceFilter
s
[
i
]
->
vtbl
->
GetVendorId
(
deviceFilters
[
i
]
,
&
vendorIdUtf16
);
deviceFilter
s
[
i
]
->
vtbl
->
GetProductId
(
deviceFilters
[
i
]
,
&
productIdUtf16
);
deviceFilter
->
vtbl
->
GetVendorId
(
deviceFilter
,
&
vendorIdUtf16
);
deviceFilter
->
vtbl
->
GetProductId
(
deviceFilter
,
&
productIdUtf16
);
VBOX_UTF16_TO_UTF8
(
vendorIdUtf16
,
&
vendorIdUtf8
);
VBOX_UTF16_TO_UTF8
(
productIdUtf16
,
&
productIdUtf8
);
...
...
@@ -3087,8 +3059,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
}
/* Cleanup */
for
(
i
=
0
;
i
<
deviceFiltersNum
;
i
++
)
VBOX_RELEASE
(
deviceFilters
[
i
]);
vboxArrayRelease
(
&
deviceFilters
);
}
VBOX_RELEASE
(
USBController
);
}
...
...
@@ -3113,15 +3084,14 @@ cleanup:
static
int
vboxListDefinedDomains
(
virConnectPtr
conn
,
char
**
const
names
,
int
maxnames
)
{
VBOX_OBJECT_CHECK
(
conn
,
int
,
-
1
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
char
*
machineName
=
NULL
;
PRUnichar
*
machineNameUtf16
=
NULL
;
PRUint32
state
;
nsresult
rc
;
int
i
,
j
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get list of Defined Domains, rc=%08x"
),
...
...
@@ -3129,13 +3099,9 @@ static int vboxListDefinedDomains(virConnectPtr conn, char ** const names, int m
goto
cleanup
;
}
if
(
machineCnt
==
0
)
{
ret
=
0
;
goto
cleanup
;
}
for
(
i
=
0
,
j
=
0
;
(
i
<
machineCnt
)
&&
(
j
<
maxnames
);
i
++
)
{
IMachine
*
machine
=
machines
[
i
];
ret
=
0
;
for
(
i
=
0
,
j
=
0
;
(
i
<
machines
.
count
)
&&
(
j
<
maxnames
);
i
++
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
if
(
machine
)
{
PRBool
isAccessible
=
PR_FALSE
;
...
...
@@ -3158,25 +3124,22 @@ static int vboxListDefinedDomains(virConnectPtr conn, char ** const names, int m
}
}
}
ret
++
;
cleanup:
VBOX_UTF8_FREE
(
machineName
);
VBOX_UTF16_FREE
(
machineNameUtf16
);
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
return
ret
;
}
static
int
vboxNumOfDefinedDomains
(
virConnectPtr
conn
)
{
VBOX_OBJECT_CHECK
(
conn
,
int
,
-
1
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
PRUint32
state
=
MachineState_Null
;
nsresult
rc
;
int
i
;
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get number of Defined Domains, rc=%08x"
),
...
...
@@ -3184,14 +3147,9 @@ static int vboxNumOfDefinedDomains(virConnectPtr conn) {
goto
cleanup
;
}
if
(
machineCnt
==
0
)
{
ret
=
0
;
goto
cleanup
;
}
/* Do the cleanup as required by GetMachines() */
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
{
IMachine
*
machine
=
machines
[
i
];
ret
=
0
;
for
(
i
=
0
;
i
<
machines
.
count
;
++
i
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
if
(
machine
)
{
PRBool
isAccessible
=
PR_FALSE
;
...
...
@@ -3205,11 +3163,9 @@ static int vboxNumOfDefinedDomains(virConnectPtr conn) {
}
}
}
ret
++
;
cleanup:
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
return
ret
;
}
...
...
@@ -3387,8 +3343,7 @@ vboxStartMachine(virDomainPtr dom, int i, IMachine *machine, vboxIID *iid)
static
int
vboxDomainCreateWithFlags
(
virDomainPtr
dom
,
unsigned
int
flags
)
{
VBOX_OBJECT_CHECK
(
dom
->
conn
,
int
,
-
1
);
IMachine
**
machines
=
NULL
;
PRUint32
machineCnt
=
0
;
vboxArray
machines
=
VBOX_ARRAY_INITIALIZER
;
unsigned
char
iidl
[
VIR_UUID_BUFLEN
]
=
{
0
};
nsresult
rc
;
int
i
=
0
;
...
...
@@ -3401,15 +3356,15 @@ static int vboxDomainCreateWithFlags(virDomainPtr dom, unsigned int flags) {
goto
cleanup
;
}
rc
=
data
->
vboxObj
->
vtbl
->
GetMachines
(
data
->
vboxObj
,
&
machineCnt
,
&
m
achines
);
rc
=
vboxArrayGet
(
&
machines
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetM
achines
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"Could not get list of machines, rc=%08x"
),
(
unsigned
)
rc
);
goto
cleanup
;
}
for
(
i
=
0
;
i
<
machine
C
nt
;
++
i
)
{
IMachine
*
machine
=
machines
[
i
];
for
(
i
=
0
;
i
<
machine
s
.
cou
nt
;
++
i
)
{
IMachine
*
machine
=
machines
.
items
[
i
];
PRBool
isAccessible
=
PR_FALSE
;
if
(
!
machine
)
...
...
@@ -3446,8 +3401,7 @@ static int vboxDomainCreateWithFlags(virDomainPtr dom, unsigned int flags) {
}
/* Do the cleanup and take care you dont leak any memory */
for
(
i
=
0
;
i
<
machineCnt
;
++
i
)
VBOX_RELEASE
(
machines
[
i
]);
vboxArrayRelease
(
&
machines
);
cleanup:
return
ret
;
...
...
@@ -4795,31 +4749,27 @@ static int vboxDomainUndefine(virDomainPtr dom) {
/* get all the controller first, then the attachments and
* remove them all so that the machine can be undefined
*/
PRUint32
strCtlSize
=
0
;
IStorageController
**
aStrCtls
=
NULL
;
vboxArray
storageControllers
=
VBOX_ARRAY_INITIALIZER
;
int
i
=
0
,
j
=
0
;
machine
->
vtbl
->
GetStorageControllers
(
machine
,
&
strCtlSize
,
&
aStrCtls
);
vboxArrayGet
(
&
storageControllers
,
machine
,
machine
->
vtbl
->
GetStorageControllers
);
for
(
i
=
0
;
i
<
st
rCtlSize
;
i
++
)
{
IStorageController
*
strCtl
=
aStrCtl
s
[
i
];
for
(
i
=
0
;
i
<
st
orageControllers
.
count
;
i
++
)
{
IStorageController
*
strCtl
=
storageControllers
.
item
s
[
i
];
PRUnichar
*
strCtlName
=
NULL
;
PRUint32
medAttSize
=
0
;
IMediumAttachment
**
aMedAtts
=
NULL
;
vboxArray
mediumAttachments
=
VBOX_ARRAY_INITIALIZER
;
if
(
!
strCtl
)
continue
;
strCtl
->
vtbl
->
GetName
(
strCtl
,
&
strCtlName
);
machine
->
vtbl
->
GetMediumAttachmentsOfController
(
machine
,
strCtlName
,
&
medAttSize
,
&
aMedAtts
);
vboxArrayGetWithArg
(
&
mediumAttachments
,
machine
,
machine
->
vtbl
->
GetMediumAttachmentsOfController
,
strCtlName
);
for
(
j
=
0
;
j
<
med
AttSize
;
j
++
)
{
IMediumAttachment
*
medAtt
=
aMedAtt
s
[
j
];
for
(
j
=
0
;
j
<
med
iumAttachments
.
count
;
j
++
)
{
IMediumAttachment
*
medAtt
=
mediumAttachments
.
item
s
[
j
];
PRInt32
port
=
~
0U
;
PRInt32
device
=
~
0U
;
...
...
@@ -4835,14 +4785,15 @@ static int vboxDomainUndefine(virDomainPtr dom) {
port
,
device
);
}
VBOX_RELEASE
(
medAtt
);
}
VBOX_RELEASE
(
strCtl
);
vboxArrayRelease
(
&
storageControllers
);
machine
->
vtbl
->
RemoveStorageController
(
machine
,
strCtlName
);
VBOX_UTF16_FREE
(
strCtlName
);
}
vboxArrayRelease
(
&
storageControllers
);
#endif
/* VBOX_API_VERSION >= 3001 */
machine
->
vtbl
->
SaveSettings
(
machine
);
...
...
@@ -5288,8 +5239,7 @@ vboxDomainSnapshotGetAll(virDomainPtr dom,
/* BFS walk through snapshot tree */
top
=
1
;
for
(
next
=
0
;
next
<
count
;
next
++
)
{
PRUint32
childrenCount
=
0
;
ISnapshot
**
children
=
NULL
;
vboxArray
children
=
VBOX_ARRAY_INITIALIZER
;
unsigned
int
i
;
if
(
!
list
[
next
])
{
...
...
@@ -5298,23 +5248,27 @@ vboxDomainSnapshotGetAll(virDomainPtr dom,
goto
error
;
}
rc
=
list
[
next
]
->
vtbl
->
GetChildren
(
list
[
next
],
&
childrenCount
,
&
c
hildren
);
rc
=
vboxArrayGet
(
&
children
,
list
[
next
]
,
list
[
next
]
->
vtbl
->
GetC
hildren
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
_
(
"could not get children snapshots"
));
goto
error
;
}
for
(
i
=
0
;
i
<
childrenCount
;
i
++
)
{
if
(
!
children
[
i
])
for
(
i
=
0
;
i
<
children
.
count
;
i
++
)
{
ISnapshot
*
child
=
children
.
items
[
i
];
if
(
!
child
)
continue
;
if
(
top
==
count
)
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"unexpected number of snapshots > %u"
),
count
);
vboxArrayRelease
(
&
children
);
goto
error
;
}
list
[
top
++
]
=
children
[
i
];
VBOX_ADDREF
(
child
);
list
[
top
++
]
=
child
;
}
vboxArrayRelease
(
&
children
);
}
out:
...
...
@@ -6137,31 +6091,27 @@ vboxDomainSnapshotDeleteTree(vboxGlobalData *data,
IConsole
*
console
,
ISnapshot
*
snapshot
)
{
PRUint32
childrenCount
=
0
;
ISnapshot
**
children
=
NULL
;
vboxArray
children
=
VBOX_ARRAY_INITIALIZER
;
int
ret
=
-
1
;
nsresult
rc
;
unsigned
int
i
;
rc
=
snapshot
->
vtbl
->
GetChildren
(
snapshot
,
&
childrenCount
,
&
c
hildren
);
rc
=
vboxArrayGet
(
&
children
,
snapshot
,
snapshot
->
vtbl
->
GetC
hildren
);
if
(
NS_FAILED
(
rc
))
{
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
_
(
"could not get children snapshots"
));
goto
cleanup
;
}
if
(
childrenCount
>
0
)
{
for
(
i
=
0
;
i
<
childrenCount
;
i
++
)
{
if
(
vboxDomainSnapshotDeleteTree
(
data
,
console
,
children
[
i
]))
goto
cleanup
;
}
for
(
i
=
0
;
i
<
children
.
count
;
i
++
)
{
if
(
vboxDomainSnapshotDeleteTree
(
data
,
console
,
children
.
items
[
i
]))
goto
cleanup
;
}
ret
=
vboxDomainSnapshotDeleteSingle
(
data
,
console
,
snapshot
);
cleanup:
for
(
i
=
0
;
i
<
childrenCount
;
i
++
)
VBOX_RELEASE
(
children
[
i
]);
vboxArrayRelease
(
&
children
);
return
ret
;
}
...
...
@@ -6829,30 +6779,31 @@ static int vboxNetworkClose(virConnectPtr conn) {
static
int
vboxNumOfNetworks
(
virConnectPtr
conn
)
{
VBOX_OBJECT_HOST_CHECK
(
conn
,
int
,
0
);
PRUint32
networkInterfacesSize
=
0
;
IHostNetworkInterface
**
networkInterfaces
=
NULL
;
vboxArray
networkInterfaces
=
VBOX_ARRAY_INITIALIZER
;
int
i
=
0
;
host
->
vtbl
->
GetNetworkInterfaces
(
host
,
&
networkInterfacesSize
,
&
n
etworkInterfaces
);
vboxArrayGet
(
&
networkInterfaces
,
host
,
host
->
vtbl
->
GetN
etworkInterfaces
);
for
(
i
=
0
;
i
<
networkInterfacesSize
;
i
++
)
{
if
(
networkInterfaces
[
i
])
{
for
(
i
=
0
;
i
<
networkInterfaces
.
count
;
i
++
)
{
IHostNetworkInterface
*
networkInterface
=
networkInterfaces
.
items
[
i
];
if
(
networkInterface
)
{
PRUint32
interfaceType
=
0
;
networkInterface
s
[
i
]
->
vtbl
->
GetInterfaceType
(
networkInterfaces
[
i
]
,
&
interfaceType
);
networkInterface
->
vtbl
->
GetInterfaceType
(
networkInterface
,
&
interfaceType
);
if
(
interfaceType
==
HostNetworkInterfaceType_HostOnly
)
{
PRUint32
status
=
HostNetworkInterfaceStatus_Unknown
;
networkInterface
s
[
i
]
->
vtbl
->
GetStatus
(
networkInterfaces
[
i
]
,
&
status
);
networkInterface
->
vtbl
->
GetStatus
(
networkInterface
,
&
status
);
if
(
status
==
HostNetworkInterfaceStatus_Up
)
ret
++
;
}
VBOX_RELEASE
(
networkInterfaces
[
i
]);
}
}
vboxArrayRelease
(
&
networkInterfaces
);
VBOX_RELEASE
(
host
);
DEBUG
(
"numActive: %d"
,
ret
);
...
...
@@ -6861,28 +6812,29 @@ static int vboxNumOfNetworks(virConnectPtr conn) {
static
int
vboxListNetworks
(
virConnectPtr
conn
,
char
**
const
names
,
int
nnames
)
{
VBOX_OBJECT_HOST_CHECK
(
conn
,
int
,
0
);
PRUint32
networkInterfacesSize
=
0
;
IHostNetworkInterface
**
networkInterfaces
=
NULL
;
vboxArray
networkInterfaces
=
VBOX_ARRAY_INITIALIZER
;
int
i
=
0
;
host
->
vtbl
->
GetNetworkInterfaces
(
host
,
&
networkInterfacesSize
,
&
networkInterfaces
);
vboxArrayGet
(
&
networkInterfaces
,
host
,
host
->
vtbl
->
GetNetworkInterfaces
);
for
(
i
=
0
;
(
ret
<
nnames
)
&&
(
i
<
networkInterfaces
.
count
);
i
++
)
{
IHostNetworkInterface
*
networkInterface
=
networkInterfaces
.
items
[
i
];
for
(
i
=
0
;
(
ret
<
nnames
)
&&
(
i
<
networkInterfacesSize
);
i
++
)
{
if
(
networkInterfaces
[
i
])
{
if
(
networkInterface
)
{
PRUint32
interfaceType
=
0
;
networkInterface
s
[
i
]
->
vtbl
->
GetInterfaceType
(
networkInterfaces
[
i
]
,
&
interfaceType
);
networkInterface
->
vtbl
->
GetInterfaceType
(
networkInterface
,
&
interfaceType
);
if
(
interfaceType
==
HostNetworkInterfaceType_HostOnly
)
{
PRUint32
status
=
HostNetworkInterfaceStatus_Unknown
;
networkInterface
s
[
i
]
->
vtbl
->
GetStatus
(
networkInterfaces
[
i
]
,
&
status
);
networkInterface
->
vtbl
->
GetStatus
(
networkInterface
,
&
status
);
if
(
status
==
HostNetworkInterfaceStatus_Up
)
{
char
*
nameUtf8
=
NULL
;
PRUnichar
*
nameUtf16
=
NULL
;
networkInterface
s
[
i
]
->
vtbl
->
GetName
(
networkInterfaces
[
i
]
,
&
nameUtf16
);
networkInterface
->
vtbl
->
GetName
(
networkInterface
,
&
nameUtf16
);
VBOX_UTF16_TO_UTF8
(
nameUtf16
,
&
nameUtf8
);
DEBUG
(
"nnames[%d]: %s"
,
ret
,
nameUtf8
);
...
...
@@ -6900,8 +6852,7 @@ static int vboxListNetworks(virConnectPtr conn, char **const names, int nnames)
}
}
for
(
i
=
0
;
i
<
networkInterfacesSize
;
i
++
)
VBOX_RELEASE
(
networkInterfaces
[
i
]);
vboxArrayRelease
(
&
networkInterfaces
);
VBOX_RELEASE
(
host
);
...
...
@@ -6910,30 +6861,31 @@ static int vboxListNetworks(virConnectPtr conn, char **const names, int nnames)
static
int
vboxNumOfDefinedNetworks
(
virConnectPtr
conn
)
{
VBOX_OBJECT_HOST_CHECK
(
conn
,
int
,
0
);
PRUint32
networkInterfacesSize
=
0
;
IHostNetworkInterface
**
networkInterfaces
=
NULL
;
vboxArray
networkInterfaces
=
VBOX_ARRAY_INITIALIZER
;
int
i
=
0
;
host
->
vtbl
->
GetNetworkInterfaces
(
host
,
&
networkInterfacesSize
,
&
n
etworkInterfaces
);
vboxArrayGet
(
&
networkInterfaces
,
host
,
host
->
vtbl
->
GetN
etworkInterfaces
);
for
(
i
=
0
;
i
<
networkInterfacesSize
;
i
++
)
{
if
(
networkInterfaces
[
i
])
{
for
(
i
=
0
;
i
<
networkInterfaces
.
count
;
i
++
)
{
IHostNetworkInterface
*
networkInterface
=
networkInterfaces
.
items
[
i
];
if
(
networkInterface
)
{
PRUint32
interfaceType
=
0
;
networkInterface
s
[
i
]
->
vtbl
->
GetInterfaceType
(
networkInterfaces
[
i
]
,
&
interfaceType
);
networkInterface
->
vtbl
->
GetInterfaceType
(
networkInterface
,
&
interfaceType
);
if
(
interfaceType
==
HostNetworkInterfaceType_HostOnly
)
{
PRUint32
status
=
HostNetworkInterfaceStatus_Unknown
;
networkInterface
s
[
i
]
->
vtbl
->
GetStatus
(
networkInterfaces
[
i
]
,
&
status
);
networkInterface
->
vtbl
->
GetStatus
(
networkInterface
,
&
status
);
if
(
status
==
HostNetworkInterfaceStatus_Down
)
ret
++
;
}
VBOX_RELEASE
(
networkInterfaces
[
i
]);
}
}
vboxArrayRelease
(
&
networkInterfaces
);
VBOX_RELEASE
(
host
);
DEBUG
(
"numActive: %d"
,
ret
);
...
...
@@ -6942,28 +6894,29 @@ static int vboxNumOfDefinedNetworks(virConnectPtr conn) {
static
int
vboxListDefinedNetworks
(
virConnectPtr
conn
,
char
**
const
names
,
int
nnames
)
{
VBOX_OBJECT_HOST_CHECK
(
conn
,
int
,
0
);
PRUint32
networkInterfacesSize
=
0
;
IHostNetworkInterface
**
networkInterfaces
=
NULL
;
vboxArray
networkInterfaces
=
VBOX_ARRAY_INITIALIZER
;
int
i
=
0
;
host
->
vtbl
->
GetNetworkInterfaces
(
host
,
&
networkInterfacesSize
,
&
networkInterfaces
);
vboxArrayGet
(
&
networkInterfaces
,
host
,
host
->
vtbl
->
GetNetworkInterfaces
);
for
(
i
=
0
;
(
ret
<
nnames
)
&&
(
i
<
networkInterfaces
.
count
);
i
++
)
{
IHostNetworkInterface
*
networkInterface
=
networkInterfaces
.
items
[
i
];
for
(
i
=
0
;
(
ret
<
nnames
)
&&
(
i
<
networkInterfacesSize
);
i
++
)
{
if
(
networkInterfaces
[
i
])
{
if
(
networkInterface
)
{
PRUint32
interfaceType
=
0
;
networkInterface
s
[
i
]
->
vtbl
->
GetInterfaceType
(
networkInterfaces
[
i
]
,
&
interfaceType
);
networkInterface
->
vtbl
->
GetInterfaceType
(
networkInterface
,
&
interfaceType
);
if
(
interfaceType
==
HostNetworkInterfaceType_HostOnly
)
{
PRUint32
status
=
HostNetworkInterfaceStatus_Unknown
;
networkInterface
s
[
i
]
->
vtbl
->
GetStatus
(
networkInterfaces
[
i
]
,
&
status
);
networkInterface
->
vtbl
->
GetStatus
(
networkInterface
,
&
status
);
if
(
status
==
HostNetworkInterfaceStatus_Down
)
{
char
*
nameUtf8
=
NULL
;
PRUnichar
*
nameUtf16
=
NULL
;
networkInterface
s
[
i
]
->
vtbl
->
GetName
(
networkInterfaces
[
i
]
,
&
nameUtf16
);
networkInterface
->
vtbl
->
GetName
(
networkInterface
,
&
nameUtf16
);
VBOX_UTF16_TO_UTF8
(
nameUtf16
,
&
nameUtf8
);
DEBUG
(
"nnames[%d]: %s"
,
ret
,
nameUtf8
);
...
...
@@ -6981,8 +6934,7 @@ static int vboxListDefinedNetworks(virConnectPtr conn, char **const names, int n
}
}
for
(
i
=
0
;
i
<
networkInterfacesSize
;
i
++
)
VBOX_RELEASE
(
networkInterfaces
[
i
]);
vboxArrayRelease
(
&
networkInterfaces
);
VBOX_RELEASE
(
host
);
...
...
@@ -7667,54 +7619,48 @@ static virStoragePoolPtr vboxStoragePoolLookupByName(virConnectPtr conn, const c
static
int
vboxStoragePoolNumOfVolumes
(
virStoragePoolPtr
pool
)
{
VBOX_OBJECT_CHECK
(
pool
->
conn
,
int
,
-
1
);
IHardDisk
**
hardDisks
=
NULL
;
PRUint32
hardDiskCount
=
0
;
vboxArray
hardDisks
=
VBOX_ARRAY_INITIALIZER
;
PRUint32
hardDiskAccessible
=
0
;
nsresult
rc
;
int
i
;
rc
=
data
->
vboxObj
->
vtbl
->
GetHardDisks
(
data
->
vboxObj
,
&
hardDiskCount
,
&
h
ardDisks
);
rc
=
vboxArrayGet
(
&
hardDisks
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetH
ardDisks
);
if
(
NS_SUCCEEDED
(
rc
))
{
for
(
i
=
0
;
i
<
hardDisk
C
ount
;
++
i
)
{
IHardDisk
*
hardDisk
=
hardDisks
[
i
];
for
(
i
=
0
;
i
<
hardDisk
s
.
c
ount
;
++
i
)
{
IHardDisk
*
hardDisk
=
hardDisks
.
items
[
i
];
if
(
hardDisk
)
{
PRUint32
hddstate
;
VBOX_MEDIUM_FUNC_ARG1
(
hardDisk
,
GetState
,
&
hddstate
);
if
(
hddstate
!=
MediaState_Inaccessible
)
hardDiskAccessible
++
;
VBOX_MEDIUM_RELEASE
(
hardDisk
);
}
}
hardDiskCount
=
0
;
vboxArrayRelease
(
&
hardDisks
);
ret
=
hardDiskAccessible
;
}
else
{
hardDiskCoun
t
=
-
1
;
re
t
=
-
1
;
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"could not get number of volumes in the pool: %s, rc=%08x"
),
pool
->
name
,
(
unsigned
)
rc
);
}
if
(
hardDiskAccessible
)
ret
=
hardDiskAccessible
;
else
ret
=
hardDiskCount
;
return
ret
;
}
static
int
vboxStoragePoolListVolumes
(
virStoragePoolPtr
pool
,
char
**
const
names
,
int
nnames
)
{
VBOX_OBJECT_CHECK
(
pool
->
conn
,
int
,
-
1
);
IHardDisk
**
hardDisks
=
NULL
;
PRUint32
hardDiskCount
=
0
;
vboxArray
hardDisks
=
VBOX_ARRAY_INITIALIZER
;
PRUint32
numActive
=
0
;
nsresult
rc
;
int
i
;
rc
=
data
->
vboxObj
->
vtbl
->
GetHardDisks
(
data
->
vboxObj
,
&
hardDiskCount
,
&
h
ardDisks
);
rc
=
vboxArrayGet
(
&
hardDisks
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetH
ardDisks
);
if
(
NS_SUCCEEDED
(
rc
))
{
for
(
i
=
0
;
i
<
hardDisk
C
ount
&&
numActive
<
nnames
;
++
i
)
{
IHardDisk
*
hardDisk
=
hardDisks
[
i
];
for
(
i
=
0
;
i
<
hardDisk
s
.
c
ount
&&
numActive
<
nnames
;
++
i
)
{
IHardDisk
*
hardDisk
=
hardDisks
.
items
[
i
];
if
(
hardDisk
)
{
PRUint32
hddstate
;
...
...
@@ -7740,39 +7686,35 @@ static int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names
VBOX_UTF8_FREE
(
nameUtf8
);
}
}
VBOX_MEDIUM_RELEASE
(
hardDisk
);
}
}
hardDiskCount
=
0
;
vboxArrayRelease
(
&
hardDisks
);
ret
=
numActive
;
}
else
{
hardDiskCoun
t
=
-
1
;
re
t
=
-
1
;
vboxError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"could not get the volume list in the pool: %s, rc=%08x"
),
pool
->
name
,
(
unsigned
)
rc
);
}
if
(
numActive
)
ret
=
numActive
;
else
ret
=
hardDiskCount
;
return
ret
;
}
static
virStorageVolPtr
vboxStorageVolLookupByName
(
virStoragePoolPtr
pool
,
const
char
*
name
)
{
VBOX_OBJECT_CHECK
(
pool
->
conn
,
virStorageVolPtr
,
NULL
);
IHardDisk
**
hardDisks
=
NULL
;
PRUint32
hardDiskCount
=
0
;
vboxArray
hardDisks
=
VBOX_ARRAY_INITIALIZER
;
nsresult
rc
;
int
i
;
if
(
!
name
)
return
ret
;
rc
=
data
->
vboxObj
->
vtbl
->
GetHardDisks
(
data
->
vboxObj
,
&
hardDiskCount
,
&
h
ardDisks
);
rc
=
vboxArrayGet
(
&
hardDisks
,
data
->
vboxObj
,
data
->
vboxObj
->
vtbl
->
GetH
ardDisks
);
if
(
NS_SUCCEEDED
(
rc
))
{
for
(
i
=
0
;
i
<
hardDisk
C
ount
;
++
i
)
{
IHardDisk
*
hardDisk
=
hardDisks
[
i
];
for
(
i
=
0
;
i
<
hardDisk
s
.
c
ount
;
++
i
)
{
IHardDisk
*
hardDisk
=
hardDisks
.
items
[
i
];
if
(
hardDisk
)
{
PRUint32
hddstate
;
...
...
@@ -7821,8 +7763,7 @@ static virStorageVolPtr vboxStorageVolLookupByName(virStoragePoolPtr pool, const
}
}
for
(
i
=
0
;
i
<
hardDiskCount
;
++
i
)
VBOX_MEDIUM_RELEASE
(
hardDisks
[
i
]);
vboxArrayRelease
(
&
hardDisks
);
}
return
ret
;
...
...
@@ -8081,28 +8022,36 @@ static int vboxStorageVolDelete(virStorageVolPtr vol,
VBOX_MEDIUM_FUNC_ARG1
(
hardDisk
,
GetState
,
&
hddstate
);
if
(
hddstate
!=
MediaState_Inaccessible
)
{
PRUint32
machineIdsSize
=
0
;
vboxIID
**
machineIds
=
NULL
;
vboxArray
machineIds
=
VBOX_ARRAY_INITIALIZER
;
#if VBOX_API_VERSION < 3001
vboxArrayGet
(
&
machineIds
,
hardDisk
,
hardDisk
->
vtbl
->
imedium
.
GetMachineIds
);
#else
/* VBOX_API_VERSION >= 3001 */
vboxArrayGet
(
&
machineIds
,
hardDisk
,
hardDisk
->
vtbl
->
GetMachineIds
);
#endif
/* VBOX_API_VERSION >= 3001 */
VBOX_MEDIUM_FUNC_ARG2
(
hardDisk
,
GetMachineIds
,
&
machineIdsSize
,
&
machineIds
)
;
machineIdsSize
=
machineIds
.
count
;
for
(
i
=
0
;
i
<
machineIds
Size
;
i
++
)
{
for
(
i
=
0
;
i
<
machineIds
.
count
;
i
++
)
{
IMachine
*
machine
=
NULL
;
vboxIID
*
machineId
=
machineIds
.
items
[
i
];
rc
=
data
->
vboxObj
->
vtbl
->
OpenSession
(
data
->
vboxObj
,
data
->
vboxSession
,
machineId
s
[
i
]
);
rc
=
data
->
vboxObj
->
vtbl
->
OpenSession
(
data
->
vboxObj
,
data
->
vboxSession
,
machineId
);
if
(
NS_SUCCEEDED
(
rc
))
{
rc
=
data
->
vboxSession
->
vtbl
->
GetMachine
(
data
->
vboxSession
,
&
machine
);
if
(
NS_SUCCEEDED
(
rc
))
{
PRUint32
hddAttachSize
=
0
;
IHardDiskAttachment
**
hddAttachments
=
NULL
;
vboxArray
hddAttachments
=
VBOX_ARRAY_INITIALIZER
;
#if VBOX_API_VERSION < 3001
machine
->
vtbl
->
GetHardDiskAttachments
(
machine
,
&
hddAttachSize
,
&
hddAttachments
);
vboxArrayGet
(
&
hddAttachments
,
machine
,
machine
->
vtbl
->
GetHardDiskAttachments
);
#else
/* VBOX_API_VERSION >= 3001 */
machine
->
vtbl
->
GetMediumAttachments
(
machine
,
&
hddAttachSize
,
&
hddAttachments
);
vboxArrayGet
(
&
hddAttachments
,
machine
,
machine
->
vtbl
->
GetMediumAttachments
);
#endif
/* VBOX_API_VERSION >= 3001 */
for
(
j
=
0
;
j
<
hddAttach
Size
;
j
++
)
{
IHardDiskAttachment
*
hddAttachment
=
hddAttachments
[
j
];
for
(
j
=
0
;
j
<
hddAttach
ments
.
count
;
j
++
)
{
IHardDiskAttachment
*
hddAttachment
=
hddAttachments
.
items
[
j
];
if
(
hddAttachment
)
{
IHardDisk
*
hdd
=
NULL
;
...
...
@@ -8154,18 +8103,16 @@ static int vboxStorageVolDelete(virStorageVolPtr vol,
}
VBOX_MEDIUM_RELEASE
(
hdd
);
}
VBOX_RELEASE
(
hddAttachment
);
}
}
vboxArrayRelease
(
&
hddAttachments
);
VBOX_RELEASE
(
machine
);
}
data
->
vboxSession
->
vtbl
->
Close
(
data
->
vboxSession
);
}
}
for
(
i
=
0
;
i
<
machineIdsSize
;
i
++
)
if
(
machineIds
[
i
])
vboxIIDUnalloc
(
machineIds
[
i
]);
vboxArrayUnalloc
(
&
machineIds
);
if
(
machineIdsSize
==
0
||
machineIdsSize
==
deregister
)
{
IProgress
*
progress
=
NULL
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录