Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
91b7924e
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,体验更适合开发者的 AI 搜索 >>
提交
91b7924e
编写于
6月 24, 2011
作者:
M
Michal Novotny
提交者:
Laine Stump
6月 24, 2011
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Network: Add additional hosts internal infrastructure
Signed-off-by:
N
Michal Novotny
<
minovotn@redhat.com
>
上级
60b9c693
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
291 addition
and
20 deletion
+291
-20
src/libvirt_private.syms
src/libvirt_private.syms
+1
-0
src/network/bridge_driver.c
src/network/bridge_driver.c
+3
-0
src/util/dnsmasq.c
src/util/dnsmasq.c
+266
-19
src/util/dnsmasq.h
src/util/dnsmasq.h
+21
-1
未找到文件。
src/libvirt_private.syms
浏览文件 @
91b7924e
...
...
@@ -194,6 +194,7 @@ virUnrefStream;
# dnsmasq.h
dnsmasqAddDhcpHost;
dnsmasqAddHost;
dnsmasqContextFree;
dnsmasqContextNew;
dnsmasqDelete;
...
...
src/network/bridge_driver.c
浏览文件 @
91b7924e
...
...
@@ -608,6 +608,9 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
if
(
dctx
->
hostsfile
->
nhosts
)
virCommandAddArgPair
(
cmd
,
"--dhcp-hostsfile"
,
dctx
->
hostsfile
->
path
);
if
(
dctx
->
addnhostsfile
->
nhosts
)
virCommandAddArgPair
(
cmd
,
"--addn-hosts"
,
dctx
->
addnhostsfile
->
path
);
dnsmasqContextFree
(
dctx
);
}
...
...
src/util/dnsmasq.c
浏览文件 @
91b7924e
...
...
@@ -48,6 +48,7 @@
#define VIR_FROM_THIS VIR_FROM_NETWORK
#define DNSMASQ_HOSTSFILE_SUFFIX "hostsfile"
#define DNSMASQ_ADDNHOSTSFILE_SUFFIX "addnhosts"
static
void
dhcphostFree
(
dnsmasqDhcpHost
*
host
)
...
...
@@ -55,6 +56,235 @@ dhcphostFree(dnsmasqDhcpHost *host)
VIR_FREE
(
host
->
host
);
}
static
void
addnhostFree
(
dnsmasqAddnHost
*
host
)
{
int
i
;
for
(
i
=
0
;
i
<
host
->
nhostnames
;
i
++
)
VIR_FREE
(
host
->
hostnames
[
i
]);
VIR_FREE
(
host
->
hostnames
);
VIR_FREE
(
host
->
ip
);
}
static
void
addnhostsFree
(
dnsmasqAddnHostsfile
*
addnhostsfile
)
{
unsigned
int
i
;
if
(
addnhostsfile
->
hosts
)
{
for
(
i
=
0
;
i
<
addnhostsfile
->
nhosts
;
i
++
)
addnhostFree
(
&
addnhostsfile
->
hosts
[
i
]);
VIR_FREE
(
addnhostsfile
->
hosts
);
addnhostsfile
->
nhosts
=
0
;
}
VIR_FREE
(
addnhostsfile
->
path
);
VIR_FREE
(
addnhostsfile
);
}
static
int
addnhostsAdd
(
dnsmasqAddnHostsfile
*
addnhostsfile
,
virSocketAddr
*
ip
,
const
char
*
name
)
{
char
*
ipstr
=
NULL
;
int
idx
=
-
1
;
int
i
;
if
(
!
(
ipstr
=
virSocketFormatAddr
(
ip
)))
return
-
1
;
for
(
i
=
0
;
i
<
addnhostsfile
->
nhosts
;
i
++
)
{
if
(
STREQ
((
const
char
*
)
addnhostsfile
->
hosts
[
i
].
ip
,
(
const
char
*
)
ipstr
))
{
idx
=
i
;
break
;
}
}
if
(
idx
<
0
)
{
if
(
VIR_REALLOC_N
(
addnhostsfile
->
hosts
,
addnhostsfile
->
nhosts
+
1
)
<
0
)
goto
alloc_error
;
idx
=
addnhostsfile
->
nhosts
;
if
(
VIR_ALLOC
(
addnhostsfile
->
hosts
[
idx
].
hostnames
)
<
0
)
goto
alloc_error
;
if
(
virAsprintf
(
&
addnhostsfile
->
hosts
[
idx
].
ip
,
"%s"
,
ipstr
)
<
0
)
goto
alloc_error
;
addnhostsfile
->
hosts
[
idx
].
nhostnames
=
0
;
addnhostsfile
->
nhosts
++
;
}
if
(
VIR_REALLOC_N
(
addnhostsfile
->
hosts
[
idx
].
hostnames
,
addnhostsfile
->
hosts
[
idx
].
nhostnames
+
1
)
<
0
)
goto
alloc_error
;
if
(
virAsprintf
(
&
addnhostsfile
->
hosts
[
idx
].
hostnames
[
addnhostsfile
->
hosts
[
idx
].
nhostnames
],
"%s"
,
name
)
<
0
)
goto
alloc_error
;
VIR_FREE
(
ipstr
);
addnhostsfile
->
hosts
[
idx
].
nhostnames
++
;
return
0
;
alloc_error:
virReportOOMError
();
VIR_FREE
(
ipstr
);
return
-
1
;
}
static
dnsmasqAddnHostsfile
*
addnhostsNew
(
const
char
*
name
,
const
char
*
config_dir
)
{
int
err
;
dnsmasqAddnHostsfile
*
addnhostsfile
;
if
(
VIR_ALLOC
(
addnhostsfile
)
<
0
)
{
virReportOOMError
();
return
NULL
;
}
addnhostsfile
->
hosts
=
NULL
;
addnhostsfile
->
nhosts
=
0
;
if
(
virAsprintf
(
&
addnhostsfile
->
path
,
"%s/%s.%s"
,
config_dir
,
name
,
DNSMASQ_ADDNHOSTSFILE_SUFFIX
)
<
0
)
{
virReportOOMError
();
goto
error
;
}
if
((
err
=
virFileMakePath
(
config_dir
)))
{
virReportSystemError
(
err
,
_
(
"cannot create config directory '%s'"
),
config_dir
);
goto
error
;
}
return
addnhostsfile
;
error:
addnhostsFree
(
addnhostsfile
);
return
NULL
;
}
static
int
addnhostsWrite
(
const
char
*
path
,
dnsmasqAddnHost
*
hosts
,
unsigned
int
nhosts
)
{
char
*
tmp
;
FILE
*
f
;
bool
istmp
=
true
;
unsigned
int
i
,
ii
;
int
rc
=
0
;
if
(
nhosts
==
0
)
return
rc
;
if
(
virAsprintf
(
&
tmp
,
"%s.new"
,
path
)
<
0
)
return
-
ENOMEM
;
if
(
!
(
f
=
fopen
(
tmp
,
"w"
)))
{
istmp
=
false
;
if
(
!
(
f
=
fopen
(
path
,
"w"
)))
{
rc
=
errno
;
goto
cleanup
;
}
}
for
(
i
=
0
;
i
<
nhosts
;
i
++
)
{
if
(
fputs
(
hosts
[
i
].
ip
,
f
)
==
EOF
||
fputc
(
'\t'
,
f
)
==
EOF
)
{
rc
=
errno
;
VIR_FORCE_FCLOSE
(
f
);
if
(
istmp
)
unlink
(
tmp
);
goto
cleanup
;
}
for
(
ii
=
0
;
ii
<
hosts
[
i
].
nhostnames
;
ii
++
)
{
if
(
fputs
(
hosts
[
i
].
hostnames
[
ii
],
f
)
==
EOF
||
fputc
(
'\t'
,
f
)
==
EOF
)
{
rc
=
errno
;
VIR_FORCE_FCLOSE
(
f
);
if
(
istmp
)
unlink
(
tmp
);
goto
cleanup
;
}
}
if
(
fputc
(
'\n'
,
f
)
==
EOF
)
{
rc
=
errno
;
VIR_FORCE_FCLOSE
(
f
);
if
(
istmp
)
unlink
(
tmp
);
goto
cleanup
;
}
}
if
(
VIR_FCLOSE
(
f
)
==
EOF
)
{
rc
=
errno
;
goto
cleanup
;
}
if
(
istmp
)
{
if
(
rename
(
tmp
,
path
)
<
0
)
{
rc
=
errno
;
unlink
(
tmp
);
goto
cleanup
;
}
if
(
unlink
(
tmp
)
<
0
)
{
rc
=
errno
;
goto
cleanup
;
}
}
cleanup:
VIR_FREE
(
tmp
);
return
rc
;
}
static
int
addnhostsSave
(
dnsmasqAddnHostsfile
*
addnhostsfile
)
{
int
err
=
addnhostsWrite
(
addnhostsfile
->
path
,
addnhostsfile
->
hosts
,
addnhostsfile
->
nhosts
);
if
(
err
<
0
)
{
virReportSystemError
(
err
,
_
(
"cannot write config file '%s'"
),
addnhostsfile
->
path
);
return
-
1
;
}
return
0
;
}
static
int
genericFileDelete
(
char
*
path
)
{
if
(
!
virFileExists
(
path
))
return
0
;
if
(
unlink
(
path
)
<
0
)
{
virReportSystemError
(
errno
,
_
(
"cannot remove config file '%s'"
),
path
);
return
-
1
;
}
return
0
;
}
static
void
hostsfileFree
(
dnsmasqHostsfile
*
hostsfile
)
{
...
...
@@ -220,21 +450,6 @@ hostsfileSave(dnsmasqHostsfile *hostsfile)
return
0
;
}
static
int
hostsfileDelete
(
dnsmasqHostsfile
*
hostsfile
)
{
if
(
!
virFileExists
(
hostsfile
->
path
))
return
0
;
if
(
unlink
(
hostsfile
->
path
)
<
0
)
{
virReportSystemError
(
errno
,
_
(
"cannot remove config file '%s'"
),
hostsfile
->
path
);
return
-
1
;
}
return
0
;
}
/**
* dnsmasqContextNew:
*
...
...
@@ -255,6 +470,8 @@ dnsmasqContextNew(const char *network_name,
if
(
!
(
ctx
->
hostsfile
=
hostsfileNew
(
network_name
,
config_dir
)))
goto
error
;
if
(
!
(
ctx
->
addnhostsfile
=
addnhostsNew
(
network_name
,
config_dir
)))
goto
error
;
return
ctx
;
...
...
@@ -277,6 +494,8 @@ dnsmasqContextFree(dnsmasqContext *ctx)
if
(
ctx
->
hostsfile
)
hostsfileFree
(
ctx
->
hostsfile
);
if
(
ctx
->
addnhostsfile
)
addnhostsFree
(
ctx
->
addnhostsfile
);
VIR_FREE
(
ctx
);
}
...
...
@@ -300,6 +519,24 @@ dnsmasqAddDhcpHost(dnsmasqContext *ctx,
hostsfileAdd
(
ctx
->
hostsfile
,
mac
,
ip
,
name
);
}
/*
* dnsmasqAddHost:
* @ctx: pointer to the dnsmasq context for each network
* @ip: pointer to the socket address contains ip of the host
* @name: pointer to the string contains hostname of the host
*
* Add additional host entry.
*/
void
dnsmasqAddHost
(
dnsmasqContext
*
ctx
,
virSocketAddr
*
ip
,
const
char
*
name
)
{
if
(
ctx
->
addnhostsfile
)
addnhostsAdd
(
ctx
->
addnhostsfile
,
ip
,
name
);
}
/**
* dnsmasqSave:
* @ctx: pointer to the dnsmasq context for each network
...
...
@@ -309,10 +546,16 @@ dnsmasqAddDhcpHost(dnsmasqContext *ctx,
int
dnsmasqSave
(
const
dnsmasqContext
*
ctx
)
{
int
ret
=
0
;
if
(
ctx
->
hostsfile
)
return
hostsfileSave
(
ctx
->
hostsfile
);
ret
=
hostsfileSave
(
ctx
->
hostsfile
);
if
(
ret
==
0
)
{
if
(
ctx
->
addnhostsfile
)
ret
=
addnhostsSave
(
ctx
->
addnhostsfile
);
}
return
0
;
return
ret
;
}
...
...
@@ -325,10 +568,14 @@ dnsmasqSave(const dnsmasqContext *ctx)
int
dnsmasqDelete
(
const
dnsmasqContext
*
ctx
)
{
int
ret
=
0
;
if
(
ctx
->
hostsfile
)
return
hostsfileDelete
(
ctx
->
hostsfile
);
ret
=
genericFileDelete
(
ctx
->
hostsfile
->
path
);
if
(
ctx
->
addnhostsfile
)
ret
=
genericFileDelete
(
ctx
->
addnhostsfile
->
path
);
return
0
;
return
ret
;
}
/**
...
...
src/util/dnsmasq.h
浏览文件 @
91b7924e
...
...
@@ -44,7 +44,24 @@ typedef struct
typedef
struct
{
dnsmasqHostsfile
*
hostsfile
;
unsigned
int
nhostnames
;
char
*
ip
;
char
**
hostnames
;
}
dnsmasqAddnHost
;
typedef
struct
{
unsigned
int
nhosts
;
dnsmasqAddnHost
*
hosts
;
char
*
path
;
/* Absolute path of dnsmasq's hostsfile. */
}
dnsmasqAddnHostsfile
;
typedef
struct
{
dnsmasqHostsfile
*
hostsfile
;
dnsmasqAddnHostsfile
*
addnhostsfile
;
}
dnsmasqContext
;
dnsmasqContext
*
dnsmasqContextNew
(
const
char
*
network_name
,
...
...
@@ -54,6 +71,9 @@ void dnsmasqAddDhcpHost(dnsmasqContext *ctx,
const
char
*
mac
,
virSocketAddr
*
ip
,
const
char
*
name
);
void
dnsmasqAddHost
(
dnsmasqContext
*
ctx
,
virSocketAddr
*
ip
,
const
char
*
name
);
int
dnsmasqSave
(
const
dnsmasqContext
*
ctx
);
int
dnsmasqDelete
(
const
dnsmasqContext
*
ctx
);
int
dnsmasqReload
(
pid_t
pid
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录