Branch data Line data Source code
1 : : #ifndef __CR_FILES_H__
2 : : #define __CR_FILES_H__
3 : :
4 : : #include "compiler.h"
5 : : #include "types.h"
6 : : #include "lock.h"
7 : : #include "list.h"
8 : : #include "image.h"
9 : :
10 : : #include "../protobuf/fdinfo.pb-c.h"
11 : : #include "../protobuf/fown.pb-c.h"
12 : : #include "../protobuf/vma.pb-c.h"
13 : :
14 : : struct pstree_item;
15 : : struct file_desc;
16 : : struct cr_fdset;
17 : : struct rst_info;
18 : : struct parasite_ctl;
19 : :
20 : : struct fd_parms {
21 : : int fd;
22 : : unsigned long pos;
23 : : unsigned int flags;
24 : : char fd_flags;
25 : : struct stat stat;
26 : : pid_t pid;
27 : : FownEntry fown;
28 : :
29 : : struct parasite_ctl *ctl;
30 : : };
31 : :
32 : : #define FD_PARMS_INIT \
33 : : { \
34 : : .fd = FD_DESC_INVALID, \
35 : : .fown = FOWN_ENTRY__INIT, \
36 : : }
37 : :
38 : : struct file_desc;
39 : :
40 : : struct fdinfo_list_entry {
41 : : struct list_head desc_list; /* To chain on @fd_info_head */
42 : : struct file_desc *desc; /* Associated file descriptor */
43 : : struct list_head ps_list; /* To chain per-task files */
44 : : int pid;
45 : : futex_t real_pid;
46 : : FdinfoEntry *fe;
47 : : };
48 : :
49 : : /* reports whether fd_a takes prio over fd_b */
50 : : static inline int fdinfo_rst_prio(struct fdinfo_list_entry *fd_a, struct fdinfo_list_entry *fd_b)
51 : : {
52 [ + + ][ + + ]: 230 : return (fd_a->pid < fd_b->pid) || ((fd_a->pid == fd_b->pid) && (fd_a->fe->fd < fd_b->fe->fd));
[ + - ]
53 : : }
54 : :
55 : : struct file_desc_ops {
56 : : unsigned int type;
57 : : int (*open)(struct file_desc *d);
58 : : int (*post_open)(struct file_desc *d, int fd);
59 : : int (*want_transport)(FdinfoEntry *fe, struct file_desc *d);
60 : : struct list_head * (*select_ps_list)(struct file_desc *, struct rst_info *);
61 : : };
62 : :
63 : : struct file_desc {
64 : : u32 id; /* File descriptor id, unique */
65 : : struct list_head hash; /* Descriptor hashing and lookup */
66 : : struct list_head fd_info_head; /* Chain of fdinfo_list_entry-s with same ID and type but different pids */
67 : : struct file_desc_ops *ops; /* Associated operations */
68 : : };
69 : :
70 : : struct fdtype_ops {
71 : : unsigned int type;
72 : : int (*dump)(int lfd, u32 id, const struct fd_parms *p);
73 : : };
74 : :
75 : : extern int do_dump_gen_file(struct fd_parms *p, int lfd,
76 : : const struct fdtype_ops *ops,
77 : : const struct cr_fdset *cr_fdset);
78 : :
79 : : extern void file_desc_add(struct file_desc *d, u32 id, struct file_desc_ops *ops);
80 : : extern struct fdinfo_list_entry *file_master(struct file_desc *d);
81 : : extern struct file_desc *find_file_desc_raw(int type, u32 id);
82 : :
83 : : extern int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle, int sock);
84 : : extern int restore_fown(int fd, FownEntry *fown);
85 : : extern int rst_file_params(int fd, FownEntry *fown, int flags);
86 : :
87 : : extern void show_saved_files(void);
88 : :
89 : : extern int prepare_fds(struct pstree_item *me);
90 : : extern int prepare_fd_pid(int pid, struct rst_info *rst_info);
91 : : extern int prepare_ctl_tty(int pid, struct rst_info *rst_info, u32 ctl_tty_id);
92 : : extern int prepare_shared_fdinfo(void);
93 : : extern int get_filemap_fd(int pid, VmaEntry *vma_entry);
94 : : extern int prepare_fs(int pid);
95 : : extern int set_fd_flags(int fd, int flags);
96 : :
97 : : #ifndef AT_EMPTY_PATH
98 : : #define AT_EMPTY_PATH 0x1000
99 : : #endif
100 : :
101 : : #define LREMAP_PARAM "link-remap"
102 : :
103 : : #endif /* __CR_FILES_H__ */
|