|
|
1.1 ! root 1: /* ! 2: * Copyright (C) 2007 Michael Brown <[email protected]>. ! 3: * ! 4: * This program is free software; you can redistribute it and/or ! 5: * modify it under the terms of the GNU General Public License as ! 6: * published by the Free Software Foundation; either version 2 of the ! 7: * License, or any later version. ! 8: * ! 9: * This program is distributed in the hope that it will be useful, but ! 10: * WITHOUT ANY WARRANTY; without even the implied warranty of ! 11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 12: * General Public License for more details. ! 13: * ! 14: * You should have received a copy of the GNU General Public License ! 15: * along with this program; if not, write to the Free Software ! 16: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 17: */ ! 18: ! 19: FILE_LICENCE ( GPL2_OR_LATER ); ! 20: ! 21: #include <stdint.h> ! 22: #include <stdlib.h> ! 23: #include <stdio.h> ! 24: #include <errno.h> ! 25: #include <getopt.h> ! 26: #include <ipxe/image.h> ! 27: #include <ipxe/command.h> ! 28: #include <ipxe/parseopt.h> ! 29: #include <usr/imgmgmt.h> ! 30: ! 31: /** @file ! 32: * ! 33: * Image management commands ! 34: * ! 35: */ ! 36: ! 37: /** "imgfetch" options */ ! 38: struct imgfetch_options { ! 39: /** Image name */ ! 40: const char *name; ! 41: }; ! 42: ! 43: /** "imgfetch" option list */ ! 44: static struct option_descriptor imgfetch_opts[] = { ! 45: OPTION_DESC ( "name", 'n', required_argument, ! 46: struct imgfetch_options, name, parse_string ), ! 47: }; ! 48: ! 49: /** "imgfetch" command descriptor */ ! 50: static struct command_descriptor imgfetch_cmd = ! 51: COMMAND_DESC ( struct imgfetch_options, imgfetch_opts, 1, MAX_ARGUMENTS, ! 52: "[--name <name>] <uri> [<arguments>...]" ); ! 53: ! 54: /** ! 55: * The "imgfetch" and friends command body ! 56: * ! 57: * @v argc Argument count ! 58: * @v argv Argument list ! 59: * @v cmd Command descriptor ! 60: * @v action_name Action name (for error messages) ! 61: * @v action Action to take upon a successful download ! 62: * @ret rc Return status code ! 63: */ ! 64: static int imgfetch_core_exec ( int argc, char **argv, ! 65: const char *action_name, ! 66: int ( * action ) ( struct image *image ) ) { ! 67: struct imgfetch_options opts; ! 68: char *uri_string; ! 69: char *cmdline = NULL; ! 70: int rc; ! 71: ! 72: /* Parse options */ ! 73: if ( ( rc = parse_options ( argc, argv, &imgfetch_cmd, &opts ) ) != 0 ) ! 74: goto err_parse_options; ! 75: ! 76: /* Parse URI string */ ! 77: uri_string = argv[optind]; ! 78: ! 79: /* Parse command line */ ! 80: if ( argv[ optind + 1 ] != NULL ) { ! 81: cmdline = concat_args ( &argv[ optind + 1 ] ); ! 82: if ( ! cmdline ) { ! 83: rc = -ENOMEM; ! 84: goto err_cmdline; ! 85: } ! 86: } ! 87: ! 88: /* Fetch the image */ ! 89: if ( ( rc = imgdownload_string ( uri_string, opts.name, cmdline, ! 90: action ) ) != 0 ) { ! 91: printf ( "Could not %s %s: %s\n", ! 92: action_name, uri_string, strerror ( rc ) ); ! 93: goto err_imgdownload; ! 94: } ! 95: ! 96: /* Free command line */ ! 97: free ( cmdline ); ! 98: ! 99: return 0; ! 100: ! 101: err_imgdownload: ! 102: free ( cmdline ); ! 103: err_cmdline: ! 104: err_parse_options: ! 105: return rc; ! 106: } ! 107: ! 108: /** ! 109: * The "imgfetch"/"module" command ! 110: * ! 111: * @v argc Argument count ! 112: * @v argv Argument list ! 113: * @ret rc Return status code ! 114: */ ! 115: static int imgfetch_exec ( int argc, char **argv ) { ! 116: ! 117: return imgfetch_core_exec ( argc, argv, "fetch", ! 118: register_and_put_image ); ! 119: } ! 120: ! 121: /** ! 122: * The "kernel" command ! 123: * ! 124: * @v argc Argument count ! 125: * @v argv Argument list ! 126: * @ret rc Return status code ! 127: */ ! 128: static int kernel_exec ( int argc, char **argv ) { ! 129: ! 130: return imgfetch_core_exec ( argc, argv, "select", ! 131: register_and_select_image ); ! 132: } ! 133: ! 134: /** ! 135: * The "chain" command ! 136: * ! 137: * @v argc Argument count ! 138: * @v argv Argument list ! 139: * @ret rc Return status code ! 140: */ ! 141: static int chain_exec ( int argc, char **argv) { ! 142: ! 143: return imgfetch_core_exec ( argc, argv, "boot", ! 144: register_and_boot_image ); ! 145: } ! 146: ! 147: /** "imgselect" options */ ! 148: struct imgselect_options {}; ! 149: ! 150: /** "imgselect" option list */ ! 151: static struct option_descriptor imgselect_opts[] = {}; ! 152: ! 153: /** "imgselect" command descriptor */ ! 154: static struct command_descriptor imgselect_cmd = ! 155: COMMAND_DESC ( struct imgselect_options, imgselect_opts, 1, 1, ! 156: "<image>" ); ! 157: ! 158: /** ! 159: * The "imgselect" command ! 160: * ! 161: * @v argc Argument count ! 162: * @v argv Argument list ! 163: * @ret rc Return status code ! 164: */ ! 165: static int imgselect_exec ( int argc, char **argv ) { ! 166: struct imgselect_options opts; ! 167: struct image *image; ! 168: int rc; ! 169: ! 170: /* Parse options */ ! 171: if ( ( rc = parse_options ( argc, argv, &imgselect_cmd, &opts ) ) != 0 ) ! 172: return rc; ! 173: ! 174: /* Parse image name */ ! 175: if ( ( rc = parse_image ( argv[optind], &image ) ) != 0 ) ! 176: return rc; ! 177: ! 178: /* Load image */ ! 179: if ( ( rc = imgselect ( image ) ) != 0 ) { ! 180: printf ( "Could not select %s: %s\n", ! 181: image->name, strerror ( rc ) ); ! 182: return rc; ! 183: } ! 184: ! 185: return 0; ! 186: } ! 187: ! 188: /** "imgargs" options */ ! 189: struct imgargs_options {}; ! 190: ! 191: /** "imgargs" option list */ ! 192: static struct option_descriptor imgargs_opts[] = {}; ! 193: ! 194: /** "imgargs" command descriptor */ ! 195: static struct command_descriptor imgargs_cmd = ! 196: COMMAND_DESC ( struct imgargs_options, imgargs_opts, 1, MAX_ARGUMENTS, ! 197: "<image> [<arguments>...]" ); ! 198: ! 199: /** ! 200: * The "imgargs" command body ! 201: * ! 202: * @v argc Argument count ! 203: * @v argv Argument list ! 204: * @ret rc Return status code ! 205: */ ! 206: static int imgargs_exec ( int argc, char **argv ) { ! 207: struct imgargs_options opts; ! 208: struct image *image; ! 209: char *cmdline = NULL; ! 210: int rc; ! 211: ! 212: /* Parse options */ ! 213: if ( ( rc = parse_options ( argc, argv, &imgargs_cmd, &opts ) ) != 0 ) ! 214: goto err_parse_options; ! 215: ! 216: /* Parse image name */ ! 217: if ( ( rc = parse_image ( argv[optind], &image ) ) != 0 ) ! 218: goto err_parse_image; ! 219: ! 220: /* Parse command line */ ! 221: if ( argv[ optind + 1 ] != NULL ) { ! 222: cmdline = concat_args ( &argv[ optind + 1 ] ); ! 223: if ( ! cmdline ) { ! 224: rc = -ENOMEM; ! 225: goto err_cmdline; ! 226: } ! 227: } ! 228: ! 229: /* Set command line */ ! 230: if ( ( rc = image_set_cmdline ( image, cmdline ) ) != 0 ) ! 231: goto err_set_cmdline; ! 232: ! 233: /* Free command line */ ! 234: free ( cmdline ); ! 235: ! 236: return 0; ! 237: ! 238: err_set_cmdline: ! 239: free ( cmdline ); ! 240: err_cmdline: ! 241: err_parse_image: ! 242: err_parse_options: ! 243: return rc; ! 244: } ! 245: ! 246: /** "imgexec" options */ ! 247: struct imgexec_options {}; ! 248: ! 249: /** "imgexec" option list */ ! 250: static struct option_descriptor imgexec_opts[] = {}; ! 251: ! 252: /** "imgexec" command descriptor */ ! 253: static struct command_descriptor imgexec_cmd = ! 254: COMMAND_DESC ( struct imgexec_options, imgexec_opts, 0, 1, ! 255: "[<image>]" ); ! 256: ! 257: /** ! 258: * The "imgexec" command ! 259: * ! 260: * @v argc Argument count ! 261: * @v argv Argument list ! 262: * @ret rc Return status code ! 263: */ ! 264: static int imgexec_exec ( int argc, char **argv ) { ! 265: struct imgexec_options opts; ! 266: struct image *image; ! 267: int rc; ! 268: ! 269: /* Parse options */ ! 270: if ( ( rc = parse_options ( argc, argv, &imgexec_cmd, &opts ) ) != 0 ) ! 271: return rc; ! 272: ! 273: /* Parse image name */ ! 274: if ( optind < argc ) { ! 275: if ( ( rc = parse_image ( argv[optind], &image ) ) != 0 ) ! 276: return rc; ! 277: } else { ! 278: image = imgautoselect(); ! 279: if ( ! image ) { ! 280: rc = -ENOTTY; ! 281: printf ( "No image selected: %s\n", strerror ( rc ) ); ! 282: return rc; ! 283: } ! 284: } ! 285: ! 286: /* Execute image */ ! 287: if ( ( rc = imgexec ( image ) ) != 0 ) { ! 288: printf ( "Could not execute %s: %s\n", ! 289: image->name, strerror ( rc ) ); ! 290: return rc; ! 291: } ! 292: ! 293: return 0; ! 294: } ! 295: ! 296: /** "imgstat" options */ ! 297: struct imgstat_options {}; ! 298: ! 299: /** "imgstat" option list */ ! 300: static struct option_descriptor imgstat_opts[] = {}; ! 301: ! 302: /** "imgstat" command descriptor */ ! 303: static struct command_descriptor imgstat_cmd = ! 304: COMMAND_DESC ( struct imgstat_options, imgstat_opts, 0, 0, "" ); ! 305: ! 306: /** ! 307: * The "imgstat" command ! 308: * ! 309: * @v argc Argument count ! 310: * @v argv Argument list ! 311: * @ret rc Return status code ! 312: */ ! 313: static int imgstat_exec ( int argc, char **argv ) { ! 314: struct imgstat_options opts; ! 315: struct image *image; ! 316: int rc; ! 317: ! 318: /* Parse options */ ! 319: if ( ( rc = parse_options ( argc, argv, &imgstat_cmd, &opts ) ) != 0 ) ! 320: return rc; ! 321: ! 322: /* Show status of all images */ ! 323: for_each_image ( image ) { ! 324: imgstat ( image ); ! 325: } ! 326: ! 327: return 0; ! 328: } ! 329: ! 330: /** "imgfree" options */ ! 331: struct imgfree_options {}; ! 332: ! 333: /** "imgfree" option list */ ! 334: static struct option_descriptor imgfree_opts[] = {}; ! 335: ! 336: /** "imgfree" command descriptor */ ! 337: static struct command_descriptor imgfree_cmd = ! 338: COMMAND_DESC ( struct imgfree_options, imgfree_opts, 0, 1, ! 339: "[<image>]" ); ! 340: ! 341: /** ! 342: * The "imgfree" command ! 343: * ! 344: * @v argc Argument count ! 345: * @v argv Argument list ! 346: * @ret rc Return status code ! 347: */ ! 348: static int imgfree_exec ( int argc, char **argv ) { ! 349: struct imgfree_options opts; ! 350: struct image *image; ! 351: struct image *tmp; ! 352: int rc; ! 353: ! 354: /* Parse options */ ! 355: if ( ( rc = parse_options ( argc, argv, &imgfree_cmd, &opts ) ) != 0 ) ! 356: return rc; ! 357: ! 358: if ( optind < argc ) { ! 359: /* Free specified image */ ! 360: if ( ( rc = parse_image ( argv[optind], &image ) ) != 0 ) ! 361: return rc; ! 362: imgfree ( image ); ! 363: } else { ! 364: /* Free all images */ ! 365: list_for_each_entry_safe ( image, tmp, &images, list ) { ! 366: imgfree ( image ); ! 367: } ! 368: } ! 369: ! 370: return 0; ! 371: } ! 372: ! 373: /** Image management commands */ ! 374: struct command image_commands[] __command = { ! 375: { ! 376: .name = "imgfetch", ! 377: .exec = imgfetch_exec, ! 378: }, ! 379: { ! 380: .name = "module", ! 381: .exec = imgfetch_exec, /* synonym for "imgfetch" */ ! 382: }, ! 383: { ! 384: .name = "initrd", ! 385: .exec = imgfetch_exec, /* synonym for "imgfetch" */ ! 386: }, ! 387: { ! 388: .name = "kernel", ! 389: .exec = kernel_exec, ! 390: }, ! 391: { ! 392: .name = "chain", ! 393: .exec = chain_exec, ! 394: }, ! 395: { ! 396: .name = "imgselect", ! 397: .exec = imgselect_exec, ! 398: }, ! 399: { ! 400: .name = "imgload", /* synonym for "imgselect" */ ! 401: .exec = imgselect_exec, ! 402: }, ! 403: { ! 404: .name = "imgargs", ! 405: .exec = imgargs_exec, ! 406: }, ! 407: { ! 408: .name = "imgexec", ! 409: .exec = imgexec_exec, ! 410: }, ! 411: { ! 412: .name = "boot", /* synonym for "imgexec" */ ! 413: .exec = imgexec_exec, ! 414: }, ! 415: { ! 416: .name = "imgstat", ! 417: .exec = imgstat_exec, ! 418: }, ! 419: { ! 420: .name = "imgfree", ! 421: .exec = imgfree_exec, ! 422: }, ! 423: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.