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