Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
89b9b6d3
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,发现更多精彩内容 >>
提交
89b9b6d3
编写于
9月 08, 2015
作者:
J
John Ferlan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
virfile: Use virProcessWait in virFileOpenForked
Rather than inlining the code, use the common API
上级
1b046a68
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
13 addition
and
34 deletion
+13
-34
src/util/virfile.c
src/util/virfile.c
+13
-34
未找到文件。
src/util/virfile.c
浏览文件 @
89b9b6d3
...
@@ -2063,7 +2063,7 @@ virFileOpenForked(const char *path, int openflags, mode_t mode,
...
@@ -2063,7 +2063,7 @@ virFileOpenForked(const char *path, int openflags, mode_t mode,
uid_t
uid
,
gid_t
gid
,
unsigned
int
flags
)
uid_t
uid
,
gid_t
gid
,
unsigned
int
flags
)
{
{
pid_t
pid
;
pid_t
pid
;
int
waitret
,
status
,
ret
=
0
;
int
status
=
0
,
ret
=
0
;
int
recvfd_errno
=
0
;
int
recvfd_errno
=
0
;
int
fd
=
-
1
;
int
fd
=
-
1
;
int
pair
[
2
]
=
{
-
1
,
-
1
};
int
pair
[
2
]
=
{
-
1
,
-
1
};
...
@@ -2163,42 +2163,21 @@ virFileOpenForked(const char *path, int openflags, mode_t mode,
...
@@ -2163,42 +2163,21 @@ virFileOpenForked(const char *path, int openflags, mode_t mode,
if
(
fd
<
0
)
if
(
fd
<
0
)
recvfd_errno
=
errno
;
recvfd_errno
=
errno
;
/* wait for child to complete, and retrieve its exit code
if
(
virProcessWait
(
pid
,
&
status
,
0
)
<
0
)
{
* if waitpid fails, use that status
/* virProcessWait() reports errno on waitpid failure, so we'll just
*/
* set our return status to EINTR; otherwise, set status to EACCES
while
((
waitret
=
waitpid
(
pid
,
&
status
,
0
))
==
-
1
&&
errno
==
EINTR
);
* since the original failure for the fork+setuid path would have
if
(
waitret
==
-
1
)
{
* been EACCES or EPERM by definition.
ret
=
-
errno
;
*/
virReportSystemError
(
errno
,
if
(
virLastErrorIsSystemErrno
(
0
))
_
(
"failed to wait for child creating '%s'"
),
status
=
EINTR
;
path
);
else
if
(
!
status
)
VIR_FORCE_CLOSE
(
fd
);
status
=
EACCES
;
return
ret
;
}
}
/*
if
(
status
)
{
* If waitpid succeeded, but if the child exited abnormally or
* reported non-zero status, report failure.
*/
if
(
!
WIFEXITED
(
status
)
||
WEXITSTATUS
(
status
)
!=
0
)
{
char
*
msg
=
virProcessTranslateStatus
(
status
);
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"child failed to create '%s': %s"
),
path
,
msg
);
VIR_FORCE_CLOSE
(
fd
);
VIR_FORCE_CLOSE
(
fd
);
VIR_FREE
(
msg
);
return
-
status
;
/* Use child exit status if possible; otherwise,
* just use -EACCES, since by our original failure in
* the non fork+setuid path would have been EACCES or
* EPERM by definition (see qemuOpenFileAs after the
* first virFileOpenAs failure), but EACCES is close enough.
* Besides -EPERM is like returning fd == -1.
*/
if
(
WIFEXITED
(
status
))
ret
=
-
WEXITSTATUS
(
status
);
else
ret
=
-
EACCES
;
return
ret
;
}
}
/* if waitpid succeeded, but recvfd failed, report recvfd_errno */
/* if waitpid succeeded, but recvfd failed, report recvfd_errno */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录