Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
8ebda57b
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,发现更多精彩内容 >>
提交
8ebda57b
编写于
6月 26, 2007
作者:
D
Daniel P. Berrange
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move capabilities XML generation into driver.c
上级
0cb54b45
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
208 addition
and
184 deletion
+208
-184
ChangeLog
ChangeLog
+6
-0
qemud/dispatch.c
qemud/dispatch.c
+15
-176
qemud/driver.c
qemud/driver.c
+180
-4
qemud/driver.h
qemud/driver.h
+7
-4
未找到文件。
ChangeLog
浏览文件 @
8ebda57b
Tue Jun 26 15:11:00 EST 2007 Daniel P. Berrange <berrange@rdhat.com>
* qemud/dispatch.c, qemud/driver.c, qemud/driver.h: Move
code for generating capabilities XML into driver.c file
alongside other driver APIs
Tue Jun 26 14:52:00 EST 2007 Daniel P. Berrange <berrange@rdhat.com>
* qemud/event.c, qemud/event.h, qemud/Makefile.am: Generic
...
...
qemud/dispatch.c
浏览文件 @
8ebda57b
...
...
@@ -28,14 +28,12 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/utsname.h>
#include <libvirt/virterror.h>
#include "internal.h"
#include "driver.h"
#include "dispatch.h"
#include "conf.h"
#include "buf.h"
static
int
qemudDispatchFailure
(
struct
qemud_server
*
server
ATTRIBUTE_UNUSED
,
...
...
@@ -63,15 +61,10 @@ static int qemudDispatchGetVersion(struct qemud_server *server, struct qemud_cli
static
int
qemudDispatchGetNodeInfo
(
struct
qemud_server
*
server
,
struct
qemud_client
*
client
,
struct
qemud_packet_client_data
*
in
ATTRIBUTE_UNUSED
,
struct
qemud_packet_server_data
*
out
)
{
struct
utsname
info
;
if
(
uname
(
&
info
)
<
0
)
{
if
(
qemudDispatchFailure
(
server
,
client
,
out
)
<
0
)
return
-
1
;
return
0
;
}
if
(
qemudGetCPUInfo
(
&
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
cpus
,
if
(
qemudGetNodeInfo
(
&
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
memory
,
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
model
,
sizeof
(
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
model
),
&
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
cpus
,
&
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
mhz
,
&
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
nodes
,
&
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
sockets
,
...
...
@@ -81,14 +74,8 @@ static int qemudDispatchGetNodeInfo(struct qemud_server *server, struct qemud_cl
return
-
1
;
return
0
;
}
if
(
qemudGetMemInfo
(
&
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
memory
)
<
0
)
{
if
(
qemudDispatchFailure
(
server
,
client
,
out
)
<
0
)
return
-
1
;
return
0
;
}
out
->
type
=
QEMUD_SERVER_PKT_GET_NODEINFO
;
strncpy
(
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
model
,
info
.
machine
,
sizeof
(
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
model
));
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
model
[
sizeof
(
out
->
qemud_packet_server_data_u
.
getNodeInfoReply
.
model
)
-
1
]
=
'\0'
;
return
0
;
...
...
@@ -100,166 +87,18 @@ qemudDispatchGetCapabilities (struct qemud_server *server,
struct
qemud_packet_client_data
*
in
ATTRIBUTE_UNUSED
,
struct
qemud_packet_server_data
*
out
)
{
struct
utsname
utsname
;
int
i
,
j
,
r
;
int
have_kqemu
=
0
;
int
have_kvm
=
0
;
bufferPtr
xml
;
int
len
;
/* Really, this never fails - look at the man-page. */
uname
(
&
utsname
);
have_kqemu
=
access
(
"/dev/kqemu"
,
F_OK
)
==
0
;
have_kvm
=
access
(
"/dev/kvm"
,
F_OK
)
==
0
;
/* Construct the XML. */
xml
=
bufferNew
(
1024
);
if
(
!
xml
)
{
qemudReportError
(
server
,
VIR_ERR_NO_MEMORY
,
NULL
);
qemudDispatchFailure
(
server
,
client
,
out
);
return
0
;
}
char
*
xml
=
qemudGetCapabilities
(
server
);
r
=
bufferVSprintf
(
xml
,
"\
<capabilities>
\n
\
<host>
\n
\
<cpu>
\n
\
<arch>%s</arch>
\n
\
</cpu>
\n
\
</host>
\n
"
,
utsname
.
machine
);
if
(
r
==
-
1
)
{
vir_buffer_failed:
bufferFree
(
xml
);
qemudReportError
(
server
,
VIR_ERR_NO_MEMORY
,
NULL
);
qemudDispatchFailure
(
server
,
client
,
out
);
return
0
;
}
i
=
-
1
;
if
(
strcmp
(
utsname
.
machine
,
"i686"
)
==
0
)
i
=
0
;
else
if
(
strcmp
(
utsname
.
machine
,
"x86_64"
)
==
0
)
i
=
1
;
if
(
i
>=
0
)
{
/* For the default (PC-like) guest, qemudArchs[0] or [1]. */
r
=
bufferVSprintf
(
xml
,
"\
\n
\
<guest>
\n
\
<os_type>hvm</os_type>
\n
\
<arch name=
\"
%s
\"
>
\n
\
<wordsize>%d</wordsize>
\n
\
<emulator>/usr/bin/%s</emulator>
\n
\
<domain type=
\"
qemu
\"
/>
\n
"
,
qemudArchs
[
i
].
arch
,
qemudArchs
[
i
].
wordsize
,
qemudArchs
[
i
].
binary
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
for
(
j
=
0
;
qemudArchs
[
i
].
machines
[
j
];
++
j
)
{
r
=
bufferVSprintf
(
xml
,
"\
<machine>%s</machine>
\n
"
,
qemudArchs
[
i
].
machines
[
j
]);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
if
(
have_kqemu
)
{
r
=
bufferAdd
(
xml
,
"\
<domain type=
\"
kqemu
\"
/>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
if
(
have_kvm
)
{
r
=
bufferAdd
(
xml
,
"\
<domain type=
\"
kvm
\"
>
\n
\
<emulator>/usr/bin/qemu-kvm</emulator>
\n
\
</domain>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
r
=
bufferAdd
(
xml
,
"\
</arch>
\n
\
</guest>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
/* The "other" PC architecture needs emulation. */
i
=
i
^
1
;
r
=
bufferVSprintf
(
xml
,
"\
\n
\
<guest>
\n
\
<os_type>hvm</os_type>
\n
\
<arch name=
\"
%s
\"
>
\n
\
<wordsize>%d</wordsize>
\n
\
<emulator>/usr/bin/%s</emulator>
\n
\
<domain type=
\"
qemu
\"
/>
\n
"
,
qemudArchs
[
i
].
arch
,
qemudArchs
[
i
].
wordsize
,
qemudArchs
[
i
].
binary
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
for
(
j
=
0
;
qemudArchs
[
i
].
machines
[
j
];
++
j
)
{
r
=
bufferVSprintf
(
xml
,
"\
<machine>%s</machine>
\n
"
,
qemudArchs
[
i
].
machines
[
j
]);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
r
=
bufferAdd
(
xml
,
"\
</arch>
\n
\
</guest>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
/* The non-PC architectures, qemudArchs[>=2]. */
for
(
i
=
2
;
qemudArchs
[
i
].
arch
;
++
i
)
{
r
=
bufferVSprintf
(
xml
,
"\
\n
\
<guest>
\n
\
<os_type>hvm</os_type>
\n
\
<arch name=
\"
%s
\"
>
\n
\
<wordsize>%d</wordsize>
\n
\
<emulator>/usr/bin/%s</emulator>
\n
\
<domain type=
\"
qemu
\"
/>
\n
"
,
qemudArchs
[
i
].
arch
,
qemudArchs
[
i
].
wordsize
,
qemudArchs
[
i
].
binary
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
for
(
j
=
0
;
qemudArchs
[
i
].
machines
[
j
];
++
j
)
{
r
=
bufferVSprintf
(
xml
,
"\
<machine>%s</machine>
\n
"
,
qemudArchs
[
i
].
machines
[
j
]);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
r
=
bufferAdd
(
xml
,
"\
</arch>
\n
\
</guest>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
/* Finish off. */
r
=
bufferAdd
(
xml
,
"\
</capabilities>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
/* Copy the XML into the outgoing packet, assuming it's not too large. */
len
=
strlen
(
xml
->
content
);
if
(
len
>
QEMUD_MAX_XML_LEN
)
{
bufferFree
(
xml
);
if
(
strlen
(
xml
)
>
QEMUD_MAX_XML_LEN
)
{
qemudReportError
(
server
,
VIR_ERR_XML_ERROR
,
NULL
);
qemudDispatchFailure
(
server
,
client
,
out
);
free
(
xml
);
return
0
;
}
out
->
type
=
QEMUD_SERVER_PKT_GET_CAPABILITIES
;
strcpy
(
out
->
qemud_packet_server_data_u
.
getCapabilitiesReply
.
xml
,
xml
->
content
);
bufferFree
(
xml
);
strcpy
(
out
->
qemud_packet_server_data_u
.
getCapabilitiesReply
.
xml
,
xml
);
free
(
xml
);
return
0
;
}
...
...
qemud/driver.c
浏览文件 @
8ebda57b
...
...
@@ -34,9 +34,11 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/utsname.h>
#include <libvirt/virterror.h>
#include "buf.h"
#include "internal.h"
#include "driver.h"
#include "conf.h"
...
...
@@ -123,7 +125,8 @@ int qemudMonitorCommand(struct qemud_server *server ATTRIBUTE_UNUSED,
return
0
;
}
int
qemudGetMemInfo
(
unsigned
int
*
memory
)
{
static
int
qemudGetMemInfo
(
unsigned
int
*
memory
)
{
FILE
*
meminfo
=
fopen
(
"/proc/meminfo"
,
"r"
);
char
line
[
1024
];
...
...
@@ -143,7 +146,7 @@ int qemudGetMemInfo(unsigned int *memory) {
return
0
;
}
int
qemudGetCPUInfo
(
unsigned
int
*
cpus
,
unsigned
int
*
mhz
,
static
int
qemudGetCPUInfo
(
unsigned
int
*
cpus
,
unsigned
int
*
mhz
,
unsigned
int
*
nodes
,
unsigned
int
*
sockets
,
unsigned
int
*
cores
,
unsigned
int
*
threads
)
{
FILE
*
cpuinfo
=
fopen
(
"/proc/cpuinfo"
,
"r"
);
...
...
@@ -198,6 +201,179 @@ int qemudGetCPUInfo(unsigned int *cpus, unsigned int *mhz,
return
0
;
}
int
qemudGetNodeInfo
(
unsigned
int
*
memory
,
char
*
cpuModel
,
int
cpuModelLength
,
unsigned
int
*
cpus
,
unsigned
int
*
mhz
,
unsigned
int
*
nodes
,
unsigned
int
*
sockets
,
unsigned
int
*
cores
,
unsigned
int
*
threads
)
{
struct
utsname
info
;
if
(
uname
(
&
info
)
<
0
)
return
-
1
;
strncpy
(
cpuModel
,
info
.
machine
,
cpuModelLength
-
1
);
cpuModel
[
cpuModelLength
-
1
]
=
'\0'
;
if
(
qemudGetMemInfo
(
memory
)
<
0
)
return
-
1
;
if
(
qemudGetCPUInfo
(
cpus
,
mhz
,
nodes
,
sockets
,
cores
,
threads
)
<
0
)
return
-
1
;
return
0
;
}
char
*
qemudGetCapabilities
(
struct
qemud_server
*
server
)
{
struct
utsname
utsname
;
int
i
,
j
,
r
;
int
have_kqemu
=
0
;
int
have_kvm
=
0
;
bufferPtr
xml
;
/* Really, this never fails - look at the man-page. */
uname
(
&
utsname
);
have_kqemu
=
access
(
"/dev/kqemu"
,
F_OK
)
==
0
;
have_kvm
=
access
(
"/dev/kvm"
,
F_OK
)
==
0
;
/* Construct the XML. */
xml
=
bufferNew
(
1024
);
if
(
!
xml
)
{
qemudReportError
(
server
,
VIR_ERR_NO_MEMORY
,
NULL
);
return
NULL
;
}
r
=
bufferVSprintf
(
xml
,
"\
<capabilities>
\n
\
<host>
\n
\
<cpu>
\n
\
<arch>%s</arch>
\n
\
</cpu>
\n
\
</host>
\n
"
,
utsname
.
machine
);
if
(
r
==
-
1
)
{
vir_buffer_failed:
bufferFree
(
xml
);
qemudReportError
(
server
,
VIR_ERR_NO_MEMORY
,
NULL
);
return
NULL
;
}
i
=
-
1
;
if
(
strcmp
(
utsname
.
machine
,
"i686"
)
==
0
)
i
=
0
;
else
if
(
strcmp
(
utsname
.
machine
,
"x86_64"
)
==
0
)
i
=
1
;
if
(
i
>=
0
)
{
/* For the default (PC-like) guest, qemudArchs[0] or [1]. */
r
=
bufferVSprintf
(
xml
,
"\
\n
\
<guest>
\n
\
<os_type>hvm</os_type>
\n
\
<arch name=
\"
%s
\"
>
\n
\
<wordsize>%d</wordsize>
\n
\
<emulator>/usr/bin/%s</emulator>
\n
\
<domain type=
\"
qemu
\"
/>
\n
"
,
qemudArchs
[
i
].
arch
,
qemudArchs
[
i
].
wordsize
,
qemudArchs
[
i
].
binary
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
for
(
j
=
0
;
qemudArchs
[
i
].
machines
[
j
];
++
j
)
{
r
=
bufferVSprintf
(
xml
,
"\
<machine>%s</machine>
\n
"
,
qemudArchs
[
i
].
machines
[
j
]);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
if
(
have_kqemu
)
{
r
=
bufferAdd
(
xml
,
"\
<domain type=
\"
kqemu
\"
/>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
if
(
have_kvm
)
{
r
=
bufferAdd
(
xml
,
"\
<domain type=
\"
kvm
\"
>
\n
\
<emulator>/usr/bin/qemu-kvm</emulator>
\n
\
</domain>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
r
=
bufferAdd
(
xml
,
"\
</arch>
\n
\
</guest>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
/* The "other" PC architecture needs emulation. */
i
=
i
^
1
;
r
=
bufferVSprintf
(
xml
,
"\
\n
\
<guest>
\n
\
<os_type>hvm</os_type>
\n
\
<arch name=
\"
%s
\"
>
\n
\
<wordsize>%d</wordsize>
\n
\
<emulator>/usr/bin/%s</emulator>
\n
\
<domain type=
\"
qemu
\"
/>
\n
"
,
qemudArchs
[
i
].
arch
,
qemudArchs
[
i
].
wordsize
,
qemudArchs
[
i
].
binary
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
for
(
j
=
0
;
qemudArchs
[
i
].
machines
[
j
];
++
j
)
{
r
=
bufferVSprintf
(
xml
,
"\
<machine>%s</machine>
\n
"
,
qemudArchs
[
i
].
machines
[
j
]);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
r
=
bufferAdd
(
xml
,
"\
</arch>
\n
\
</guest>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
/* The non-PC architectures, qemudArchs[>=2]. */
for
(
i
=
2
;
qemudArchs
[
i
].
arch
;
++
i
)
{
r
=
bufferVSprintf
(
xml
,
"\
\n
\
<guest>
\n
\
<os_type>hvm</os_type>
\n
\
<arch name=
\"
%s
\"
>
\n
\
<wordsize>%d</wordsize>
\n
\
<emulator>/usr/bin/%s</emulator>
\n
\
<domain type=
\"
qemu
\"
/>
\n
"
,
qemudArchs
[
i
].
arch
,
qemudArchs
[
i
].
wordsize
,
qemudArchs
[
i
].
binary
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
for
(
j
=
0
;
qemudArchs
[
i
].
machines
[
j
];
++
j
)
{
r
=
bufferVSprintf
(
xml
,
"\
<machine>%s</machine>
\n
"
,
qemudArchs
[
i
].
machines
[
j
]);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
r
=
bufferAdd
(
xml
,
"\
</arch>
\n
\
</guest>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
}
/* Finish off. */
r
=
bufferAdd
(
xml
,
"\
</capabilities>
\n
"
,
-
1
);
if
(
r
==
-
1
)
goto
vir_buffer_failed
;
return
bufferContentAndFree
(
xml
);
}
static
int
qemudGetProcessInfo
(
unsigned
long
long
*
cpuTime
,
int
pid
)
{
char
proc
[
PATH_MAX
];
FILE
*
pidinfo
;
...
...
qemud/driver.h
浏览文件 @
8ebda57b
...
...
@@ -31,10 +31,13 @@ void qemudReportError(struct qemud_server *server,
int
code
,
const
char
*
fmt
,
...)
ATTRIBUTE_FORMAT
(
printf
,
3
,
4
);
int
qemudGetCPUInfo
(
unsigned
int
*
cpus
,
unsigned
int
*
mhz
,
int
qemudGetNodeInfo
(
unsigned
int
*
memory
,
char
*
cpuModel
,
int
cpuModelLength
,
unsigned
int
*
cpus
,
unsigned
int
*
mhz
,
unsigned
int
*
nodes
,
unsigned
int
*
sockets
,
unsigned
int
*
cores
,
unsigned
int
*
threads
);
int
qemudGetMemInfo
(
unsigned
int
*
memory
);
char
*
qemudGetCapabilities
(
struct
qemud_server
*
server
);
int
qemudMonitorCommand
(
struct
qemud_server
*
server
,
struct
qemud_vm
*
vm
,
const
char
*
cmd
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录