1 /*
2  * Copyright 2009-2017 Citrix Ltd and other contributors
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published
6  * by the Free Software Foundation; version 2.1 only. with the special
7  * exception on linking described in file LICENSE.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  */
14 
15 #ifndef XL_H
16 #define XL_H
17 
18 #include <assert.h>
19 
20 #include "_paths.h"
21 #include <xentoollog.h>
22 
23 struct cmd_spec {
24     char *cmd_name;
25     int (*cmd_impl)(int argc, char **argv);
26     int can_dryrun;
27     int modifies;
28     char *cmd_desc;
29     char *cmd_usage;
30     char *cmd_option;
31 };
32 
33 struct domain_create {
34     int debug;
35     int daemonize;
36     int monitor; /* handle guest reboots etc */
37     int paused;
38     int dryrun;
39     int quiet;
40     int vnc;
41     int vncautopass;
42     int console_autoconnect;
43     int checkpointed_stream;
44     const char *config_file;
45     char *extra_config; /* extra config string */
46     const char *restore_file;
47     char *colo_proxy_script;
48     bool userspace_colo_proxy;
49     int migrate_fd; /* -1 means none */
50     int send_back_fd; /* -1 means none */
51     char **migration_domname_r; /* from malloc */
52 };
53 
54 int create_domain(struct domain_create *dom_info);
55 
56 
57 static const char savefileheader_magic[32]=
58     "Xen saved domain, xl format\n \0 \r";
59 
60 #ifndef LIBXL_HAVE_NO_SUSPEND_RESUME
61 static const char migrate_receiver_banner[]=
62     "xl migration receiver ready, send binary domain data.\n";
63 static const char migrate_receiver_ready[]=
64     "domain received, ready to unpause";
65 static const char migrate_permission_to_go[]=
66     "domain is yours, you are cleared to unpause";
67 static const char migrate_report[]=
68     "my copy unpause results are as follows";
69 #endif
70 
71   /* followed by one byte:
72    *     0: everything went well, domain is running
73    *            next thing is we all exit
74    * non-0: things went badly
75    *            next thing should be a migrate_permission_to_go
76    *            from target to source
77    */
78 
79 #define XL_MANDATORY_FLAG_JSON (1U << 0) /* config data is in JSON format */
80 #define XL_MANDATORY_FLAG_STREAMv2 (1U << 1) /* stream is v2 */
81 #define XL_MANDATORY_FLAG_ALL  (XL_MANDATORY_FLAG_JSON |        \
82                                 XL_MANDATORY_FLAG_STREAMv2)
83 
84 struct save_file_header {
85     char magic[32]; /* savefileheader_magic */
86     /* All uint32_ts are in domain's byte order. */
87     uint32_t byteorder; /* SAVEFILE_BYTEORDER_VALUE */
88     uint32_t mandatory_flags; /* unknown flags => reject restore */
89     uint32_t optional_flags; /* unknown flags => reject restore */
90     uint32_t optional_data_len; /* skip, or skip tail, if not understood */
91 };
92 
93 /* Optional data, in order:
94  *   4 bytes uint32_t  config file size
95  *   n bytes           config file in Unix text file format
96  */
97 
98 #define SAVEFILE_BYTEORDER_VALUE ((uint32_t)0x01020304UL)
99 
100 void save_domain_core_begin(uint32_t domid,
101                             const char *override_config_file,
102                             uint8_t **config_data_r,
103                             int *config_len_r);
104 void save_domain_core_writeconfig(int fd, const char *source,
105                                   const uint8_t *config_data, int config_len);
106 
107 /*
108  * The xl process should always return either EXIT_SUCCESS or
109  * EXIT_FAILURE. main_* functions, implementing the various xl
110  * commands, can be treated as main() as if they are returning
111  * a process exit status and not a function return value.
112  */
113 
114 int main_vcpulist(int argc, char **argv);
115 int main_info(int argc, char **argv);
116 int main_sharing(int argc, char **argv);
117 int main_cd_eject(int argc, char **argv);
118 int main_cd_insert(int argc, char **argv);
119 int main_console(int argc, char **argv);
120 int main_vncviewer(int argc, char **argv);
121 int main_pcilist(int argc, char **argv);
122 int main_pcidetach(int argc, char **argv);
123 int main_pciattach(int argc, char **argv);
124 int main_pciassignable_add(int argc, char **argv);
125 int main_pciassignable_remove(int argc, char **argv);
126 int main_pciassignable_list(int argc, char **argv);
127 #ifndef LIBXL_HAVE_NO_SUSPEND_RESUME
128 int main_restore(int argc, char **argv);
129 int main_migrate_receive(int argc, char **argv);
130 int main_save(int argc, char **argv);
131 int main_migrate(int argc, char **argv);
132 #endif
133 int main_dump_core(int argc, char **argv);
134 int main_pause(int argc, char **argv);
135 int main_unpause(int argc, char **argv);
136 int main_destroy(int argc, char **argv);
137 int main_shutdown(int argc, char **argv);
138 int main_reboot(int argc, char **argv);
139 int main_list(int argc, char **argv);
140 int main_vm_list(int argc, char **argv);
141 int main_create(int argc, char **argv);
142 int main_config_update(int argc, char **argv);
143 int main_button_press(int argc, char **argv);
144 int main_vcpupin(int argc, char **argv);
145 int main_vcpuset(int argc, char **argv);
146 int main_memmax(int argc, char **argv);
147 int main_memset(int argc, char **argv);
148 int main_sched_credit(int argc, char **argv);
149 int main_sched_credit2(int argc, char **argv);
150 int main_sched_rtds(int argc, char **argv);
151 int main_domid(int argc, char **argv);
152 int main_domname(int argc, char **argv);
153 int main_rename(int argc, char **argv);
154 int main_trigger(int argc, char **argv);
155 int main_sysrq(int argc, char **argv);
156 int main_debug_keys(int argc, char **argv);
157 int main_set_parameters(int argc, char **argv);
158 int main_dmesg(int argc, char **argv);
159 int main_top(int argc, char **argv);
160 int main_networkattach(int argc, char **argv);
161 int main_networklist(int argc, char **argv);
162 int main_networkdetach(int argc, char **argv);
163 int main_channellist(int argc, char **argv);
164 int main_blockattach(int argc, char **argv);
165 int main_blocklist(int argc, char **argv);
166 int main_blockdetach(int argc, char **argv);
167 int main_vtpmattach(int argc, char **argv);
168 int main_vtpmlist(int argc, char **argv);
169 int main_vtpmdetach(int argc, char **argv);
170 int main_vdisplattach(int argc, char **argv);
171 int main_vdispllist(int argc, char **argv);
172 int main_vdispldetach(int argc, char **argv);
173 int main_usbctrl_attach(int argc, char **argv);
174 int main_usbctrl_detach(int argc, char **argv);
175 int main_usbdev_attach(int argc, char **argv);
176 int main_usbdev_detach(int argc, char **argv);
177 int main_usblist(int argc, char **argv);
178 int main_uptime(int argc, char **argv);
179 int main_claims(int argc, char **argv);
180 int main_tmem_list(int argc, char **argv);
181 int main_tmem_freeze(int argc, char **argv);
182 int main_tmem_thaw(int argc, char **argv);
183 int main_tmem_set(int argc, char **argv);
184 int main_tmem_shared_auth(int argc, char **argv);
185 int main_tmem_freeable(int argc, char **argv);
186 int main_network2attach(int argc, char **argv);
187 int main_network2list(int argc, char **argv);
188 int main_network2detach(int argc, char **argv);
189 int main_cpupoolcreate(int argc, char **argv);
190 int main_cpupoollist(int argc, char **argv);
191 int main_cpupooldestroy(int argc, char **argv);
192 int main_cpupoolrename(int argc, char **argv);
193 int main_cpupoolcpuadd(int argc, char **argv);
194 int main_cpupoolcpuremove(int argc, char **argv);
195 int main_cpupoolmigrate(int argc, char **argv);
196 int main_cpupoolnumasplit(int argc, char **argv);
197 int main_getenforce(int argc, char **argv);
198 int main_setenforce(int argc, char **argv);
199 int main_loadpolicy(int argc, char **argv);
200 #ifndef LIBXL_HAVE_NO_SUSPEND_RESUME
201 int main_remus(int argc, char **argv);
202 #endif
203 int main_devd(int argc, char **argv);
204 #if defined(__i386__) || defined(__x86_64__)
205 int main_psr_hwinfo(int argc, char **argv);
206 int main_psr_cmt_attach(int argc, char **argv);
207 int main_psr_cmt_detach(int argc, char **argv);
208 int main_psr_cmt_show(int argc, char **argv);
209 int main_psr_cat_cbm_set(int argc, char **argv);
210 int main_psr_cat_show(int argc, char **argv);
211 #endif
212 int main_qemu_monitor_command(int argc, char **argv);
213 
214 void help(const char *command);
215 
216 extern const char *common_domname;
217 extern struct cmd_spec cmd_table[];
218 extern int cmdtable_len;
219 /* Look up a command in the table, allowing unambiguous truncation */
220 struct cmd_spec *cmdtable_lookup(const char *s);
221 
222 extern libxl_ctx *ctx;
223 extern xentoollog_logger_stdiostream *logger;
224 extern int logfile;
225 
226 void xl_ctx_alloc(void);
227 
228 /* child processes */
229 
230 typedef struct {
231     /* every struct like this must be in XLCHILD_LIST */
232     pid_t pid; /* 0: not in use */
233     int reaped; /* valid iff pid!=0 */
234     int status; /* valid iff reaped */
235     const char *description; /* valid iff pid!=0 */
236 } xlchild;
237 
238 typedef enum {
239     child_console, child_waitdaemon, child_migration, child_vncviewer,
240     child_max
241 } xlchildnum;
242 
243 extern xlchild children[child_max];
244 
245 pid_t xl_fork(xlchildnum, const char *description);
246     /* like fork, but prints and dies if it fails */
247 void postfork(void); /* needed only if we aren't going to exec right away */
248 
249 /* Handles EINTR.  Clears out the xlchild so it can be reused. */
250 pid_t xl_waitpid(xlchildnum, int *status, int flags);
251 
252 int xl_child_pid(xlchildnum); /* returns 0 if child struct is not in use */
253 
254 void xl_report_child_exitstatus(xentoollog_level level,
255                                 xlchildnum child, pid_t pid, int status);
256     /* like libxl_report_child_exitstatus, but uses children[].description */
257 
258 int child_report(xlchildnum child);
259     /* waits and expects child to exit status 0.
260      * otherwise, logs and returns ERROR_FAIL */
261 
262 /* global options */
263 extern int autoballoon;
264 extern int run_hotplug_scripts;
265 extern int dryrun_only;
266 extern int claim_mode;
267 extern bool progress_use_cr;
268 extern xentoollog_level minmsglevel;
269 #define minmsglevel_default XTL_PROGRESS
270 extern char *lockfile;
271 extern char *default_vifscript;
272 extern char *default_bridge;
273 extern char *default_gatewaydev;
274 extern char *default_vifbackend;
275 extern char *default_remus_netbufscript;
276 extern char *default_colo_proxy_script;
277 extern char *blkdev_start;
278 extern int max_grant_frames;
279 extern int max_maptrack_frames;
280 
281 enum output_format {
282     OUTPUT_FORMAT_JSON,
283     OUTPUT_FORMAT_SXP,
284 };
285 extern enum output_format default_output_format;
286 
287 typedef enum {
288     DOMAIN_RESTART_NONE = 0,     /* No domain restart */
289     DOMAIN_RESTART_NORMAL,       /* Domain should be restarted */
290     DOMAIN_RESTART_RENAME,       /* Domain should be renamed and restarted */
291     DOMAIN_RESTART_SOFT_RESET,   /* Soft reset should be performed */
292 } domain_restart_type;
293 
294 extern void printf_info_sexp(int domid, libxl_domain_config *d_config, FILE *fh);
295 
296 #define XL_GLOBAL_CONFIG XEN_CONFIG_DIR "/xl.conf"
297 #define XL_LOCK_FILE XEN_LOCK_DIR "/xl"
298 
299 #endif /* XL_H */
300 
301 /*
302  * Local variables:
303  * mode: C
304  * c-basic-offset: 4
305  * indent-tabs-mode: nil
306  * End:
307  */
308