Commit 81d91983 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov

util: Move reopen_fd_as to reopen_fd_as_safe

[avagin@: Drop redundant fcntl call, and err variable]
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Acked-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 9360a73c
...@@ -164,11 +164,14 @@ extern void printk_vma(struct vma_area *vma_area); ...@@ -164,11 +164,14 @@ extern void printk_vma(struct vma_area *vma_area);
#define pr_info_registers(regs) printk_registers(regs) #define pr_info_registers(regs) printk_registers(regs)
#define pr_info_siginfo(siginfo) printk_siginfo(siginfo) #define pr_info_siginfo(siginfo) printk_siginfo(siginfo)
extern int reopen_fd_as(int new_fd, int old_fd);
extern int move_img_fd(int *img_fd, int want_fd); extern int move_img_fd(int *img_fd, int want_fd);
extern int parse_maps(pid_t pid, struct list_head *vma_area_list, bool use_map_files); extern int parse_maps(pid_t pid, struct list_head *vma_area_list, bool use_map_files);
extern int close_safe(int *fd); extern int close_safe(int *fd);
extern int reopen_fd_as_safe(int new_fd, int old_fd, bool allow_reuse_fd);
#define reopen_fd_as(new_fd, old_fd) reopen_fd_as_safe(new_fd, old_fd, false)
#define reopen_fd_as_nocheck(new_fd, old_fd) reopen_fd_as_safe(new_fd, old_fd, true)
extern void hex_dump(void *addr, unsigned long len); extern void hex_dump(void *addr, unsigned long len);
extern DIR *opendir_proc(char *fmt, ...); extern DIR *opendir_proc(char *fmt, ...);
......
...@@ -128,24 +128,29 @@ int close_safe(int *fd) ...@@ -128,24 +128,29 @@ int close_safe(int *fd)
return ret; return ret;
} }
int reopen_fd_as(int new_fd, int old_fd) int reopen_fd_as_safe(int new_fd, int old_fd, bool allow_reuse_fd)
{ {
int tmp;
if (old_fd != new_fd) { if (old_fd != new_fd) {
int tmp;
tmp = fcntl(new_fd, F_GETFD); if (!allow_reuse_fd) {
if (tmp != -1 || errno != EBADF) { if (fcntl(new_fd, F_GETFD) != -1 || errno != EBADF) {
/* Standard descriptors may be reused */ if (new_fd < 3) {
if (new_fd < 3) /*
pr_warning("fd=%d is already used\n", new_fd); * Standart descriptors.
else { */
pr_perror("fd=%d is already used\n", new_fd); pr_warning("fd = %d is already used\n", new_fd);
return -1; } else {
pr_err("fd = %d is already used\n", new_fd);
return -1;
}
} }
} }
tmp = dup2(old_fd, new_fd); tmp = dup2(old_fd, new_fd);
if (tmp < 0) { if (tmp < 0) {
pr_perror("Dup on %d -> %d failed\n", old_fd, new_fd); pr_perror("Dup %d -> %d failed\n", old_fd, new_fd);
return tmp; return tmp;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment