diff --git a/cr-restore.c b/cr-restore.c index 49c42d774..4adb5815c 100644 --- a/cr-restore.c +++ b/cr-restore.c @@ -296,7 +296,7 @@ static int prepare_shared(void) if (ret < 0) break; - ret = prepare_fd_pid(pi->pid); + ret = prepare_fd_pid(pi->pid, pi->rst); if (ret < 0) break; } diff --git a/files.c b/files.c index c7445e4f2..e2acb01d8 100644 --- a/files.c +++ b/files.c @@ -327,7 +327,7 @@ int collect_reg_files(void) return collect_remaps(); } -static int collect_fd(int pid, struct fdinfo_entry *e) +static int collect_fd(int pid, struct fdinfo_entry *e, struct list_head *fds) { int i; struct fdinfo_list_entry *l, *le = &fdinfo_list[nr_fdinfo_list]; @@ -357,14 +357,17 @@ static int collect_fd(int pid, struct fdinfo_entry *e) break; list_add_tail(&le->desc_list, &l->desc_list); + list_add_tail(&le->ps_list, fds); return 0; } -int prepare_fd_pid(int pid) +int prepare_fd_pid(int pid, struct rst_info *rst_info) { int fdinfo_fd, ret = 0; u32 type = 0; + INIT_LIST_HEAD(&rst_info->fds); + fdinfo_fd = open_image_ro(CR_FD_FDINFO, pid); if (fdinfo_fd < 0) { if (errno == ENOENT) @@ -380,7 +383,7 @@ int prepare_fd_pid(int pid) if (ret <= 0) break; - ret = collect_fd(pid, &e); + ret = collect_fd(pid, &e, &rst_info->fds); if (ret < 0) break; } diff --git a/include/crtools.h b/include/crtools.h index 7bf44509b..c46ffb21d 100644 --- a/include/crtools.h +++ b/include/crtools.h @@ -182,6 +182,7 @@ struct vma_area { #define vma_area_len(vma_area) vma_entry_len(&((vma_area)->vma)) struct rst_info { + struct list_head fds; }; struct pstree_item { diff --git a/include/files.h b/include/files.h index 78eb61b79..414a5c108 100644 --- a/include/files.h +++ b/include/files.h @@ -29,6 +29,7 @@ enum fdinfo_states { struct fdinfo_list_entry { struct list_head desc_list; + struct list_head ps_list; int pid; futex_t real_pid; struct fdinfo_entry fe; @@ -59,7 +60,8 @@ extern int restore_fown(int fd, fown_t *fown); void show_saved_files(void); extern int collect_reg_files(void); extern int prepare_fds(int pid); -extern int prepare_fd_pid(int pid); +struct rst_info; +extern int prepare_fd_pid(int pid, struct rst_info *); extern int prepare_shared_fdinfo(void); extern int get_filemap_fd(int pid, struct vma_entry *vma_entry); extern int prepare_fs(int pid);