1757Sdg/* $NetBSD: cmd.c,v 1.3 2016/05/30 02:30:20 dholland Exp $ */ 299703Sjulian 3757Sdg/*- 4757Sdg * Copyright (c) 2004 The NetBSD Foundation, Inc. 5757Sdg * All rights reserved. 6757Sdg * 7757Sdg * This code is derived from software contributed to The NetBSD Foundation 8757Sdg * by UCHIYAMA Yasushi. 9757Sdg * 10757Sdg * Redistribution and use in source and binary forms, with or without 11757Sdg * modification, are permitted provided that the following conditions 12757Sdg * are met: 13757Sdg * 1. Redistributions of source code must retain the above copyright 14757Sdg * notice, this list of conditions and the following disclaimer. 15757Sdg * 2. Redistributions in binary form must reproduce the above copyright 16757Sdg * notice, this list of conditions and the following disclaimer in the 17757Sdg * documentation and/or other materials provided with the distribution. 18757Sdg * 19757Sdg * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20757Sdg * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21757Sdg * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22757Sdg * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23757Sdg * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24757Sdg * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25757Sdg * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26757Sdg * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27757Sdg * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28757Sdg * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29757Sdg * POSSIBILITY OF SUCH DAMAGE. 3050477Speter */ 31757Sdg 32757Sdg#include <lib/libsa/stand.h> 33129653Sbde#include <lib/libkern/libkern.h> 34129653Sbde 35129653Sbde#include "cmd.h" 3628921Sfsmp#include "local.h" 3730786Sbde 3830786Sbdestruct cmd { 39757Sdg char *name; 4030786Sbde int (*func)(int, char**, int); 4130786Sbde} cmdtab[] = { 42757Sdg { "batch", cmd_batch }, 43757Sdg { "help", cmd_help }, 44757Sdg { "boot", cmd_boot }, 45757Sdg { "bootux", cmd_boot_ux }, 46757Sdg { "loadbin", cmd_load_binary }, 47757Sdg { "jump", cmd_jump }, 4858717Sdillon { "reboot", cmd_reboot }, 4958717Sdillon { "mem", cmd_mem }, 50114928Speter { "info", cmd_info }, 51114928Speter 52114928Speter { "disklabel", cmd_disklabel }, 53114928Speter { "ls", cmd_ls }, 54114928Speter { "log_save", cmd_log_save }, 55114928Speter 5658717Sdillon { "test", cmd_test }, 5758717Sdillon { "tlb", cmd_tlb }, 58114928Speter { "cop0", cmd_cop0 }, 59114928Speter { "ks", cmd_kbd_scancode }, 6058717Sdillon { "ether_test", cmd_ether_test }, 6158717Sdillon { "ga_test", cmd_ga_test }, 6258717Sdillon { 0, 0 } /* terminate */ 6358717Sdillon}; 6458717Sdillon 6558717Sdillonvoid 6658717Sdilloncmd_exec(const char *buf) 6758717Sdillon{ 6858717Sdillon char cmdbuf[CMDBUF_SIZE]; 6958717Sdillon char *argp[CMDARG_MAX]; 701321Sdg struct cmd *cmd; 711321Sdg char *p; 721321Sdg char *q; 731321Sdg int i, argc, sep; 741321Sdg 75114952Speter strncpy(cmdbuf, buf, CMDBUF_SIZE); 76114952Speter printf("%s\n", cmdbuf); 77114952Speter 78114952Speter /* find command */ 79114952Speter for (cmd = cmdtab; cmd->name; cmd++) { 80114952Speter for (q = cmdbuf, p = cmd->name; *p; p++, q++) { 81114952Speter if (*p != *q) 82114952Speter break; 83114952Speter } 84114952Speter if (*p == 0 && (*q == '\0' || *q == ' ')) 85114952Speter goto found; 86114952Speter } 87114952Speter printf("***ERROR*** %s\n", cmdbuf); 88114952Speter 89114952Speter cmd_help(0, 0, 0); 90114952Speter return; 91114952Speter 92114952Speter found: 93114952Speter /* setup argument */ 94757Sdg p = cmdbuf; 95114952Speter argc = 0; 96757Sdg argp[argc++] = p; 97114952Speter sep = 0; 98757Sdg for (i = 0; (i < CMDBUF_SIZE) && (argc < CMDARG_MAX); i++, p++) { 99114952Speter if (*p == ' ') { 100757Sdg *p = 0; 101114952Speter sep = 1; 102757Sdg } else if (sep) { 103114952Speter sep = 0; 104757Sdg argp[argc++] = p; 105114952Speter } 106757Sdg } 107114952Speter *--p = 0; 108114952Speter 109114952Speter cmd->func (argc, argp, 1); 110114952Speter} 111114952Speter 112114952Speterint 113114952Spetercmd_batch(int argc, char *argp[], int interactive) 114114952Speter{ 115114952Speter struct cmd_batch_tab *p; 116114952Speter char *args[CMDARG_MAX]; 117114952Speter int i; 118114952Speter 119114952Speter args[0] = "batch"; 120114952Speter for (p = cmd_batch_tab; p->func; p++) { 121114952Speter for (i = 0; i < p->argc; i++) 122114952Speter args[i + 1] = p->arg[i]; 123757Sdg 124114952Speter if (p->func(p->argc + 1, args, interactive)) { 125757Sdg printf("batch aborted.\n"); 126114952Speter return 1; 127757Sdg } 128114952Speter } 129757Sdg 130114952Speter return 0; 1315603Sbde} 132114952Speter 13379609Speterint 13458717Sdilloncmd_help(int argc, char *argp[], int interactive) 135114928Speter{ 136114928Speter struct cmd *cmd; 137114928Speter 13858717Sdillon printf("command: "); 13958717Sdillon for (cmd = cmdtab; cmd->name; cmd++) 140757Sdg printf("%s ", cmd->name); 14173011Sjake printf("\n"); 14273011Sjake 14373011Sjake return 0; 144114928Speter} 145114928Speter