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