|
|
1.1 ! root 1: /* ! 2: * Copyright (C) 2006 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 <string.h> ! 25: #include <getopt.h> ! 26: #include <readline/readline.h> ! 27: #include <ipxe/command.h> ! 28: #include <ipxe/parseopt.h> ! 29: #include <ipxe/shell.h> ! 30: ! 31: /** @file ! 32: * ! 33: * Minimal command shell ! 34: * ! 35: */ ! 36: ! 37: /** The shell prompt string */ ! 38: static const char shell_prompt[] = "iPXE> "; ! 39: ! 40: /** ! 41: * "help" command ! 42: * ! 43: * @v argc Argument count ! 44: * @v argv Argument list ! 45: * @ret rc Return status code ! 46: */ ! 47: static int help_exec ( int argc __unused, char **argv __unused ) { ! 48: struct command *command; ! 49: unsigned int hpos = 0; ! 50: ! 51: printf ( "\nAvailable commands:\n\n" ); ! 52: for_each_table_entry ( command, COMMANDS ) { ! 53: hpos += printf ( " %s", command->name ); ! 54: if ( hpos > ( 16 * 4 ) ) { ! 55: printf ( "\n" ); ! 56: hpos = 0; ! 57: } else { ! 58: while ( hpos % 16 ) { ! 59: printf ( " " ); ! 60: hpos++; ! 61: } ! 62: } ! 63: } ! 64: printf ( "\n\nType \"<command> --help\" for further information\n\n" ); ! 65: return 0; ! 66: } ! 67: ! 68: /** "help" command */ ! 69: struct command help_command __command = { ! 70: .name = "help", ! 71: .exec = help_exec, ! 72: }; ! 73: ! 74: /** ! 75: * Start command shell ! 76: * ! 77: */ ! 78: int shell ( void ) { ! 79: struct readline_history history; ! 80: char *line; ! 81: int rc = 0; ! 82: ! 83: /* Initialise shell history */ ! 84: memset ( &history, 0, sizeof ( history ) ); ! 85: ! 86: /* Read and execute commands */ ! 87: do { ! 88: line = readline_history ( shell_prompt, &history ); ! 89: if ( line ) { ! 90: rc = system ( line ); ! 91: free ( line ); ! 92: } ! 93: } while ( ! shell_stopped ( SHELL_STOP_COMMAND_SEQUENCE ) ); ! 94: ! 95: /* Discard shell history */ ! 96: history_free ( &history ); ! 97: ! 98: return rc; ! 99: } ! 100: ! 101: /** "shell" options */ ! 102: struct shell_options {}; ! 103: ! 104: /** "shell" option list */ ! 105: static struct option_descriptor shell_opts[] = {}; ! 106: ! 107: /** "shell" command descriptor */ ! 108: static struct command_descriptor shell_cmd = ! 109: COMMAND_DESC ( struct shell_options, shell_opts, 0, 0, "" ); ! 110: ! 111: /** ! 112: * "shell" command ! 113: * ! 114: * @v argc Argument count ! 115: * @v argv Argument list ! 116: * @ret rc Return status code ! 117: */ ! 118: static int shell_exec ( int argc, char **argv ) { ! 119: struct shell_options opts; ! 120: int rc; ! 121: ! 122: /* Parse options */ ! 123: if ( ( rc = parse_options ( argc, argv, &shell_cmd, &opts ) ) != 0 ) ! 124: return rc; ! 125: ! 126: /* Start shell */ ! 127: if ( ( rc = shell() ) != 0 ) ! 128: return rc; ! 129: ! 130: return 0; ! 131: } ! 132: ! 133: /** "shell" command */ ! 134: struct command shell_command __command = { ! 135: .name = "shell", ! 136: .exec = shell_exec, ! 137: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.