Branch data Line data Source code
1 : : #ifndef __CR_CRTOOLS_H__
2 : : #define __CR_CRTOOLS_H__
3 : :
4 : : #include <sys/types.h>
5 : :
6 : : #include "list.h"
7 : : #include "types.h"
8 : : #include "list.h"
9 : : #include "util.h"
10 : : #include "image.h"
11 : :
12 : : #include "../protobuf/vma.pb-c.h"
13 : :
14 : : #define CR_FD_PERM (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)
15 : :
16 : : #define CRIU_VERSION_MAJOR 0
17 : : #define CRIU_VERSION_MINOR 3
18 : :
19 : : enum {
20 : : CR_FD_INVENTORY,
21 : : /*
22 : : * Task entries
23 : : */
24 : :
25 : : _CR_FD_TASK_FROM,
26 : : CR_FD_FDINFO,
27 : : CR_FD_PAGES,
28 : : CR_FD_CORE,
29 : : CR_FD_MM,
30 : : CR_FD_VMAS,
31 : : CR_FD_SIGACT,
32 : : CR_FD_ITIMERS,
33 : : CR_FD_CREDS,
34 : : CR_FD_FS,
35 : : _CR_FD_TASK_TO,
36 : :
37 : : /*
38 : : * NS entries
39 : : */
40 : :
41 : : _CR_FD_NS_FROM,
42 : : CR_FD_UTSNS,
43 : : CR_FD_IPCNS_VAR,
44 : : CR_FD_IPCNS_SHM,
45 : : CR_FD_IPCNS_MSG,
46 : : CR_FD_IPCNS_SEM,
47 : : CR_FD_MOUNTPOINTS,
48 : : CR_FD_NETDEV,
49 : : CR_FD_IFADDR,
50 : : CR_FD_ROUTE,
51 : : _CR_FD_NS_TO,
52 : :
53 : : CR_FD_PSTREE,
54 : : CR_FD_SHMEM_PAGES,
55 : : CR_FD_GHOST_FILE,
56 : : CR_FD_TCP_STREAM,
57 : :
58 : : _CR_FD_GLOB_FROM,
59 : : CR_FD_SK_QUEUES,
60 : : CR_FD_REG_FILES,
61 : : CR_FD_INETSK,
62 : : CR_FD_UNIXSK,
63 : : CR_FD_PACKETSK,
64 : : CR_FD_PIPES,
65 : : CR_FD_PIPES_DATA,
66 : : CR_FD_FIFO,
67 : : CR_FD_FIFO_DATA,
68 : : CR_FD_TTY,
69 : : CR_FD_TTY_INFO,
70 : : CR_FD_REMAP_FPATH,
71 : : CR_FD_EVENTFD,
72 : : CR_FD_EVENTPOLL,
73 : : CR_FD_EVENTPOLL_TFD,
74 : : CR_FD_SIGNALFD,
75 : : CR_FD_INOTIFY,
76 : : CR_FD_INOTIFY_WD,
77 : : _CR_FD_GLOB_TO,
78 : :
79 : : CR_FD_TMPFS,
80 : :
81 : : CR_FD_MAX
82 : : };
83 : :
84 : : struct script {
85 : : struct list_head node;
86 : : char *path;
87 : : };
88 : :
89 : : struct cr_options {
90 : : int final_state;
91 : : char *show_dump_file;
92 : : bool show_pages_content;
93 : : bool restore_detach;
94 : : bool ext_unix_sk;
95 : : bool shell_job;
96 : : bool tcp_established_ok;
97 : : bool evasive_devices;
98 : : bool link_remap_ok;
99 : : unsigned int namespaces_flags;
100 : : bool log_file_per_pid;
101 : : char *output;
102 : : char *root;
103 : : char *pidfile;
104 : : struct list_head veth_pairs;
105 : : struct list_head scripts;
106 : : };
107 : :
108 : : extern struct cr_options opts;
109 : :
110 : : enum sfd_type {
111 : : SERVICE_FD_MIN,
112 : :
113 : : LOG_FD_OFF,
114 : : LOG_DIR_FD_OFF,
115 : : IMG_FD_OFF,
116 : : SELF_EXE_FD_OFF,
117 : : PROC_FD_OFF,
118 : : CTL_TTY_OFF,
119 : : SELF_STDIN_OFF,
120 : :
121 : : SERVICE_FD_MAX
122 : : };
123 : :
124 : : extern int init_service_fd(void);
125 : : extern int get_service_fd(enum sfd_type type);
126 : : extern bool is_service_fd(int fd, enum sfd_type type);
127 : : extern bool is_any_service_fd(int fd);
128 : :
129 : : /* file descriptors template */
130 : : struct cr_fd_desc_tmpl {
131 : : const char *fmt; /* format for the name */
132 : : u32 magic; /* magic in the header */
133 : : void (*show)(int fd, struct cr_options *o);
134 : : };
135 : :
136 : : void show_files(int fd_files, struct cr_options *o);
137 : : void show_pages(int fd_pages, struct cr_options *o);
138 : : void show_reg_files(int fd_reg_files, struct cr_options *o);
139 : : void show_core(int fd_core, struct cr_options *o);
140 : : void show_mm(int fd_mm, struct cr_options *o);
141 : : void show_vmas(int fd_vma, struct cr_options *o);
142 : : void show_pipes(int fd_pipes, struct cr_options *o);
143 : : void show_pipes_data(int fd_pipes, struct cr_options *o);
144 : : void show_fifo(int fd, struct cr_options *o);
145 : : void show_fifo_data(int fd_pipes, struct cr_options *o);
146 : : void show_pstree(int fd_pstree, struct cr_options *o);
147 : : void show_sigacts(int fd_sigacts, struct cr_options *o);
148 : : void show_itimers(int fd, struct cr_options *o);
149 : : void show_creds(int fd, struct cr_options *o);
150 : : void show_fs(int fd, struct cr_options *o);
151 : : void show_remap_files(int fd, struct cr_options *o);
152 : : void show_ghost_file(int fd, struct cr_options *o);
153 : : void show_fown_cont(void *p);
154 : : void show_eventfds(int fd, struct cr_options *o);
155 : : void show_tty(int fd, struct cr_options *o);
156 : : void show_tty_info(int fd, struct cr_options *o);
157 : :
158 : : int check_img_inventory(void);
159 : : int write_img_inventory(void);
160 : :
161 : : extern void print_data(unsigned long addr, unsigned char *data, size_t size);
162 : : extern void print_image_data(int fd, unsigned int length, int show);
163 : : extern struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX];
164 : :
165 : : extern int open_image_dir(void);
166 : : extern void close_image_dir(void);
167 : :
168 : : int open_image(int type, unsigned long flags, ...);
169 : : #define open_image_ro(type, ...) open_image(type, O_RDONLY, ##__VA_ARGS__)
170 : :
171 : : #define LAST_PID_PATH "/proc/sys/kernel/ns_last_pid"
172 : : #define LAST_PID_PERM 0666
173 : :
174 : : struct cr_fdset {
175 : : int fd_off;
176 : : int fd_nr;
177 : : int *_fds;
178 : : };
179 : :
180 : 10312 : static inline int fdset_fd(const struct cr_fdset *fdset, int type)
181 : : {
182 : : int idx;
183 : :
184 : 10312 : idx = type - fdset->fd_off;
185 [ - + ]: 10312 : BUG_ON(idx > fdset->fd_nr);
186 : :
187 : 10312 : return fdset->_fds[idx];
188 : : }
189 : :
190 : : extern struct cr_fdset *glob_fdset;
191 : : extern struct cr_options opts;
192 : :
193 : : int cr_dump_tasks(pid_t pid, const struct cr_options *opts);
194 : : int cr_restore_tasks(pid_t pid, struct cr_options *opts);
195 : : int cr_show(struct cr_options *opts);
196 : : int convert_to_elf(char *elf_path, int fd_core);
197 : : int cr_check(void);
198 : : int cr_exec(int pid, char **opts);
199 : :
200 : : #define O_DUMP (O_RDWR | O_CREAT | O_EXCL)
201 : : #define O_SHOW (O_RDONLY)
202 : :
203 : : struct cr_fdset *cr_task_fdset_open(int pid, int mode);
204 : : struct cr_fdset *cr_ns_fdset_open(int pid, int mode);
205 : : struct cr_fdset *cr_glob_fdset_open(int mode);
206 : :
207 : : void close_cr_fdset(struct cr_fdset **cr_fdset);
208 : :
209 : : int collect_mappings(pid_t pid, struct list_head *vma_area_list);
210 : : void free_mappings(struct list_head *vma_area_list);
211 : :
212 : : struct vma_area {
213 : : struct list_head list;
214 : : VmaEntry vma;
215 : :
216 : : union {
217 : : int vm_file_fd;
218 : : int vm_socket_id;
219 : : };
220 : : unsigned long *page_bitmap; /* existent pages */
221 : : unsigned long *ppage_bitmap; /* parent's existent pages */
222 : : };
223 : :
224 : : #define vma_area_is(vma_area, s) vma_entry_is(&((vma_area)->vma), s)
225 : : #define vma_area_len(vma_area) vma_entry_len(&((vma_area)->vma))
226 : :
227 : : struct rst_info {
228 : : struct list_head fds;
229 : : struct list_head eventpoll;
230 : : struct list_head tty_slaves;
231 : :
232 : : void *premmapped_addr;
233 : : unsigned long premmapped_len;
234 : : };
235 : :
236 : : static inline int in_vma_area(struct vma_area *vma, unsigned long addr)
237 : : {
238 [ + - ][ + + ]: 25978 : return addr >= (unsigned long)vma->vma.start &&
239 : 25978 : addr < (unsigned long)vma->vma.end;
240 : : }
241 : :
242 : : #endif /* __CR_CRTOOLS_H__ */
|