Commit d33d2290 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

files: rework a function for closing all descriptors (v2)

It reads /proc/PID/fd and close all descriptors except service fds.

v2: s/is_one_of_service_fds/is_any_service_fd
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent edf8ec3f
...@@ -498,18 +498,33 @@ static int open_fdinfos(int pid, struct list_head *list, int state) ...@@ -498,18 +498,33 @@ static int open_fdinfos(int pid, struct list_head *list, int state)
static int close_old_fds(struct pstree_item *me) static int close_old_fds(struct pstree_item *me)
{ {
/* DIR *dir;
* FIXME -- The existing test_init implementation uses system() struct dirent *de;
* which in turn doesn't work when all fds are closed int fd, ret;
*/
if (me->pid.virt == 1) dir = opendir_proc(getpid(), "fd");
return 0; if (dir == NULL)
return -1;
while ((de = readdir(dir))) {
if (!strcmp(de->d_name, "."))
continue;
if (!strcmp(de->d_name, ".."))
continue;
ret = sscanf(de->d_name, "%d", &fd);
if (ret != 1) {
pr_err("Can't parse %s\n", de->d_name);
return -1;
}
if ((!is_any_service_fd(fd)) && (dirfd(dir) != fd))
close_safe(&fd);
}
closedir(dir);
close_pid_proc();
/* FIXME -- wait for nextfd syscall (or read proc) */
close(0);
close(1);
close(2);
close(255); /* bash */
return 0; return 0;
} }
......
...@@ -123,6 +123,7 @@ enum sfd_type { ...@@ -123,6 +123,7 @@ enum sfd_type {
extern int init_service_fd(void); extern int init_service_fd(void);
extern int get_service_fd(enum sfd_type type); extern int get_service_fd(enum sfd_type type);
extern bool is_service_fd(int fd, enum sfd_type type); extern bool is_service_fd(int fd, enum sfd_type type);
extern bool is_any_service_fd(int fd);
/* file descriptors template */ /* file descriptors template */
struct cr_fd_desc_tmpl { struct cr_fd_desc_tmpl {
......
...@@ -281,10 +281,21 @@ int init_service_fd(void) ...@@ -281,10 +281,21 @@ int init_service_fd(void)
return 0; return 0;
} }
static int __get_service_fd(enum sfd_type type)
{
return service_fd_rlim_cur - type;
}
int get_service_fd(enum sfd_type type) int get_service_fd(enum sfd_type type)
{ {
BUG_ON((int)type <= SERVICE_FD_MIN || (int)type >= SERVICE_FD_MAX); BUG_ON((int)type <= SERVICE_FD_MIN || (int)type >= SERVICE_FD_MAX);
return service_fd_rlim_cur - type; return __get_service_fd(type);
}
bool is_any_service_fd(int fd)
{
return fd > __get_service_fd(SERVICE_FD_MAX) &&
fd < __get_service_fd(SERVICE_FD_MIN);
} }
bool is_service_fd(int fd, enum sfd_type type) bool is_service_fd(int fd, enum sfd_type type)
......
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