On Sun, Jun 29, 2014 at 08:40:53PM +0200, Tobias Stoeckmann wrote:
> "cc -c" works for zaurus' cmd.c. I don't have a zaurus, so it would be
> nice if a zaurus owner can test these changes.
Got feedback from zaurus users. The Makefile was missing another change:
It still listed cmd.c in SRCS. Compiles for them and nobody shouted at
me for removing "clear".
Patch updated, I also incremented zboot to 2.10, after all this diff
will zap the "clear" command.
Okay?
Index: arch/zaurus/stand/zboot/Makefile
===================================================================
RCS file: /cvs/src/sys/arch/zaurus/stand/zboot/Makefile,v
retrieving revision 1.13
diff -u -p -r1.13 Makefile
--- arch/zaurus/stand/zboot/Makefile 10 Sep 2013 21:00:26 -0000 1.13
+++ arch/zaurus/stand/zboot/Makefile 4 Jul 2014 17:39:53 -0000
@@ -21,7 +21,7 @@ CLEANFILES+= arm machine
.endif
# stand/boot
-SRCS+= boot.c vars.c bootarg.c conf.c
+SRCS+= boot.c cmd.c vars.c bootarg.c conf.c
# libsa
SRCS+= close.c closeall.c cons.c ctime.c disklabel.c dkcksum.c fstat.c \
@@ -33,7 +33,7 @@ SRCS+= strcmp.c strlcpy.c strlen.c strnc
ashrdi3.c divsi3.S divdi3.c moddi3.c qdivrem.c
# local overrides and additions
-SRCS+= alloc.c cmd.c devopen.c diskprobe.c exec.c exit.c loadfile.c \
+SRCS+= alloc.c devopen.c diskprobe.c exec.c exit.c loadfile.c \
machdep.c termios.c unixcons.c unixdev.c unixsys.S
.PATH: ${S}/stand/boot
Index: arch/zaurus/stand/zboot/boot.8
===================================================================
RCS file: /cvs/src/sys/arch/zaurus/stand/zboot/boot.8,v
retrieving revision 1.10
diff -u -p -r1.10 boot.8
--- arch/zaurus/stand/zboot/boot.8 27 Sep 2012 12:26:28 -0000 1.10
+++ arch/zaurus/stand/zboot/boot.8 4 Jul 2014 17:39:53 -0000
@@ -103,6 +103,12 @@ This file may contain any commands
.Nm
accepts at the interactive prompt.
Though default settings usually suffice, they can be changed here.
+.\" XXX CHECK_SKIP_CONF is not defined...
+.\" .Pp
+.\" .Pa boot.conf
+.\" processing can be skipped by holding down either Control key as
+.\" .Nm
+.\" starts.
.It
The header line
.Pp
Index: arch/zaurus/stand/zboot/cmd.c
===================================================================
RCS file: arch/zaurus/stand/zboot/cmd.c
diff -N arch/zaurus/stand/zboot/cmd.c
--- arch/zaurus/stand/zboot/cmd.c 21 Mar 2007 03:29:05 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,532 +0,0 @@
-/* $OpenBSD: cmd.c,v 1.3 2007/03/21 03:29:05 tedu Exp $ */
-
-/*
- * Copyright (c) 1997-1999 Michael Shalayeff
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/reboot.h>
-
-#ifdef REGRESS
-#include <sys/stat.h>
-#include <errno.h>
-#else
-#include <libsa.h>
-#include <lib/libkern/funcs.h>
-#endif
-
-#include <stand/boot/cmd.h>
-
-#define CTRL(c) ((c)&0x1f)
-
-static int Xboot(void);
-static int Xclear(void);
-static int Xecho(void);
-static int Xhelp(void);
-static int Xls(void);
-static int Xnop(void);
-static int Xreboot(void);
-static int Xstty(void);
-static int Xtime(void);
-#ifdef MACHINE_CMD
-static int Xmachine(void);
-extern const struct cmd_table MACHINE_CMD[];
-#endif
-extern int Xset(void);
-extern int Xenv(void);
-
-extern const struct cmd_table cmd_set[];
-const struct cmd_table cmd_table[] = {
- {"#", CMDT_CMD, Xnop}, /* XXX must be first */
- {"boot", CMDT_CMD, Xboot},
- {"clear", CMDT_CMD, Xclear},
- {"echo", CMDT_CMD, Xecho},
- {"env", CMDT_CMD, Xenv},
- {"help", CMDT_CMD, Xhelp},
- {"ls", CMDT_CMD, Xls},
-#ifdef MACHINE_CMD
- {"machine",CMDT_MDC, Xmachine},
-#endif
- {"reboot", CMDT_CMD, Xreboot},
- {"set", CMDT_SET, Xset},
- {"stty", CMDT_CMD, Xstty},
- {"time", CMDT_CMD, Xtime},
- {NULL, 0},
-};
-
-static void ls(char *, struct stat *);
-static int readline(char *, size_t, int);
-char *nextword(char *);
-static char *whatcmd(const struct cmd_table **ct, char *);
-static char *qualify(char *);
-
-char cmd_buf[CMD_BUFF_SIZE];
-
-int
-getcmd(void)
-{
- cmd.cmd = NULL;
-
- if (!readline(cmd_buf, sizeof(cmd_buf), cmd.timeout))
- cmd.cmd = cmd_table;
-
- return docmd();
-}
-
-int
-read_conf(void)
-{
-#ifndef INSECURE
- struct stat sb;
-#endif
- int fd, rc = 0;
-
- if ((fd = open(qualify(cmd.conf), 0)) < 0) {
- if (errno != ENOENT && errno != ENXIO) {
- printf("open(%s): %s\n", cmd.path, strerror(errno));
- return 0;
- }
- return -1;
- }
-
-#ifndef INSECURE
- (void) fstat(fd, &sb);
- if (sb.st_uid || (sb.st_mode & 2)) {
- printf("non-secure %s, will not proceed\n", cmd.path);
- close(fd);
- return -1;
- }
-#endif
-
- do {
- char *p = cmd_buf;
-
- cmd.cmd = NULL;
- do {
- rc = read(fd, p, 1);
- } while (rc > 0 && *p++ != '\n' &&
- (p-cmd_buf) < sizeof(cmd_buf));
-
- if (rc < 0) { /* Error from read() */
- printf("%s: %s\n", cmd.path, strerror(errno));
- break;
- }
-
- if (rc == 0) { /* eof from read() */
- if (p != cmd_buf) { /* Line w/o trailing \n */
- *p = '\0';
- rc = docmd();
- break;
- }
- } else { /* rc > 0, read a char */
- p--; /* Get back to last character */
-
- if (*p != '\n') { /* Line was too long */
- printf("%s: line too long\n", cmd.path);
-
- /* Don't want to run the truncated command */
- rc = -1;
- }
- *p = '\0';
- }
- } while (rc > 0 && !(rc = docmd()));
-
- close(fd);
- return rc;
-}
-
-int
-docmd(void)
-{
- char *p = NULL;
- const struct cmd_table *ct = cmd_table, *cs;
-
- cmd.argc = 1;
- if (cmd.cmd == NULL) {
-
- /* command */
- for (p = cmd_buf; *p == ' ' || *p == '\t'; p++)
- ;
- if (*p == '#' || *p == '\0') { /* comment or empty string */
-#ifdef DEBUG
- printf("rem\n");
-#endif
- return 0;
- }
- ct = cmd_table;
- cs = NULL;
- cmd.argv[cmd.argc] = p; /* in case it's shortcut boot */
- p = whatcmd(&ct, p);
- if (ct == NULL) {
- cmd.argc++;
- ct = cmd_table;
- } else if (ct->cmd_type == CMDT_SET && p != NULL) {
- cs = cmd_set;
-#ifdef MACHINE_CMD
- } else if (ct->cmd_type == CMDT_MDC && p != NULL) {
- cs = MACHINE_CMD;
-#endif
- }
-
- if (cs != NULL) {
- p = whatcmd(&cs, p);
- if (cs == NULL) {
- printf("%s: syntax error\n", ct->cmd_name);
- return 0;
- }
- ct = cs;
- }
- cmd.cmd = ct;
- }
-
- cmd.argv[0] = ct->cmd_name;
- while (p && cmd.argc+1 < sizeof(cmd.argv) / sizeof(cmd.argv[0])) {
- cmd.argv[cmd.argc++] = p;
- p = nextword(p);
- }
- cmd.argv[cmd.argc] = NULL;
-
-#ifdef REGRESS
- printf("%s %s\n", cmd.argv[0],
- (cmd.argv[1] == NULL) ? "(null)" : cmd.argv[1]);
-#else
- return (*cmd.cmd->cmd_exec)();
-#endif
-}
-
-static char *
-whatcmd(const struct cmd_table **ct, char *p)
-{
- char *q;
- int l;
-
- q = nextword(p);
-
- for (l = 0; p[l]; l++)
- ;
-
- while ((*ct)->cmd_name != NULL && strncmp(p, (*ct)->cmd_name, l))
- (*ct)++;
-
- if ((*ct)->cmd_name == NULL)
- *ct = NULL;
-
- return q;
-}
-
-static int
-readline(char *buf, size_t n, int to)
-{
-#ifdef DEBUG
- extern int debug;
-#endif
- char *p = buf, ch;
-
- /* Only do timeout if greater than 0 */
- if (to > 0) {
- u_long i = 0;
- time_t tt = getsecs() + to;
-#ifdef DEBUG
- if (debug > 2)
- printf ("readline: timeout(%d) at %u\n", to, tt);
-#endif
- /* check for timeout expiration less often
- (for some very constrained archs) */
- while (!cnischar())
- if (!(i++ % 1000) && (getsecs() >= tt))
- break;
-
- if (!cnischar()) {
- strlcpy(buf, "boot", 5);
- putchar('\n');
- return strlen(buf);
- }
- } else
- while (!cnischar())
- ;
-
- /* User has typed something. Turn off timeouts. */
- cmd.timeout = 0;
-
- while (1) {
- switch ((ch = getchar())) {
- case CTRL('u'):
- while (p > buf) {
- putchar('\177');
- p--;
- }
- continue;
- case '\n':
- case '\r':
- p[1] = *p = '\0';
- break;
- case '\b':
- case '\177':
- if (p > buf) {
- putchar('\177');
- p--;
- }
- continue;
- default:
- if (p - buf < n-1)
- *p++ = ch;
- else {
- putchar('\007');
- putchar('\177');
- }
- continue;
- }
- break;
- }
-
- return p - buf;
-}
-
-/*
- * Search for spaces/tabs after the current word. If found, \0 the
- * first one. Then pass a pointer to the first character of the
- * next word, or NULL if there is no next word.
- */
-char *
-nextword(char *p)
-{
- /* skip blanks */
- while (*p && *p != '\t' && *p != ' ')
- p++;
- if (*p) {
- *p++ = '\0';
- while (*p == '\t' || *p == ' ')
- p++;
- }
- if (*p == '\0')
- p = NULL;
- return p;
-}
-
-static void
-print_help(const struct cmd_table *ct)
-{
- for (; ct->cmd_name != NULL; ct++)
- printf(" %s", ct->cmd_name);
- putchar('\n');
-}
-
-static int
-Xhelp(void)
-{
- printf("commands:");
- print_help(cmd_table);
-#ifdef MACHINE_CMD
- return Xmachine();
-#else
- return 0;
-#endif
-}
-
-#ifdef MACHINE_CMD
-static int
-Xmachine(void)
-{
- printf("machine:");
- print_help(MACHINE_CMD);
- return 0;
-}
-#endif
-
-static int
-Xclear(void)
-{
- int i;
-
- printf("\033[H\033[J");
- return 0;
-}
-
-static int
-Xecho(void)
-{
- int i;
-
- for (i = 1; i < cmd.argc; i++)
- printf("%s ", cmd.argv[i]);
- putchar('\n');
- return 0;
-}
-
-static int
-Xstty(void)
-{
- int sp;
- char *cp;
- dev_t dev;
-
- if (cmd.argc == 1) {
- printf("%s speed is %d\n", ttyname(0), cnspeed(0, -1));
- return 0;
- }
- dev = ttydev(cmd.argv[1]);
- if (dev == NODEV) {
- printf("%s not a console device\n", cmd.argv[1]);
- return 0;
- }
-
- if (cmd.argc == 2)
- printf("%s speed is %d\n", cmd.argv[1],
- cnspeed(dev, -1));
- else {
- sp = 0;
- for (cp = cmd.argv[2]; isdigit(*cp); cp++)
- sp = sp * 10 + (*cp - '0');
- cnspeed(dev, sp);
- }
- return 0;
-}
-
-static int
-Xtime(void)
-{
- time_t tt = getsecs();
-
- if (cmd.argc == 1)
- printf(ctime(&tt));
-
- return 0;
-}
-
-static int
-Xls(void)
-{
- struct stat sb;
- char *p;
- int fd;
-
- if (stat(qualify((cmd.argv[1]? cmd.argv[1]: "/.")), &sb) < 0) {
- printf("stat(%s): %s\n", cmd.path, strerror(errno));
- return 0;
- }
-
- if ((sb.st_mode & S_IFMT) != S_IFDIR)
- ls(cmd.path, &sb);
- else {
- if ((fd = opendir(cmd.path)) < 0) {
- printf("opendir(%s): %s\n", cmd.path,
- strerror(errno));
- return 0;
- }
-
- /* no strlen in lib !!! */
- for (p = cmd.path; *p; p++)
- ;
- *p++ = '/';
- *p = '\0';
-
- while (readdir(fd, p) >= 0) {
- if (stat(cmd.path, &sb) < 0)
- printf("stat(%s): %s\n", cmd.path,
- strerror(errno));
- else
- ls(p, &sb);
- }
- closedir (fd);
- }
- return 0;
-}
-
-#define lsrwx(mode,s) \
- putchar ((mode) & S_IROTH? 'r' : '-'); \
- putchar ((mode) & S_IWOTH? 'w' : '-'); \
- putchar ((mode) & S_IXOTH? *(s): (s)[1]);
-
-static void
-ls(char *name, struct stat *sb)
-{
- putchar("-fc-d-b---l-s-w-"[(sb->st_mode & S_IFMT) >> 12]);
- lsrwx(sb->st_mode >> 6, (sb->st_mode & S_ISUID? "sS" : "x-"));
- lsrwx(sb->st_mode >> 3, (sb->st_mode & S_ISGID? "sS" : "x-"));
- lsrwx(sb->st_mode , (sb->st_mode & S_ISTXT? "tT" : "x-"));
-
- printf (" %u,%u\t%lu\t%s\n", sb->st_uid, sb->st_gid,
- (u_long)sb->st_size, name);
-}
-#undef lsrwx
-
-int doboot = 1;
-
-static int
-Xnop(void)
-{
- if (doboot) {
- doboot = 0;
- return (Xboot());
- }
-
- return 0;
-}
-
-static int
-Xboot(void)
-{
- if (cmd.argc > 1 && cmd.argv[1][0] != '-') {
- qualify((cmd.argv[1]? cmd.argv[1]: cmd.image));
- if (bootparse(2))
- return 0;
- } else {
- if (bootparse(1))
- return 0;
- snprintf(cmd.path, sizeof cmd.path, "%s:%s",
- cmd.bootdev, cmd.image);
- }
-
- return 1;
-}
-
-/*
- * Qualifies the path adding necessary dev
- */
-
-static char *
-qualify(char *name)
-{
- char *p;
-
- for (p = name; *p; p++)
- if (*p == ':')
- break;
- if (*p == ':')
- strlcpy(cmd.path, name, sizeof(cmd.path));
- else
- snprintf(cmd.path, sizeof cmd.path, "%s:%s",
- cmd.bootdev, name);
- return cmd.path;
-}
-
-static int
-Xreboot(void)
-{
- printf("Rebooting...\n");
- exit();
- return 0; /* just in case */
-}
-
Index: arch/zaurus/stand/zboot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/zaurus/stand/zboot/conf.c,v
retrieving revision 1.8
diff -u -p -r1.8 conf.c
--- arch/zaurus/stand/zboot/conf.c 28 Dec 2013 02:53:04 -0000 1.8
+++ arch/zaurus/stand/zboot/conf.c 4 Jul 2014 17:39:53 -0000
@@ -42,7 +42,7 @@
#include "unixdev.h"
#include <dev/cons.h>
-const char version[] = "2.09";
+const char version[] = "2.10";
int debug = 1;
void (*zaurus_probe1[])(void) = {
Index: stand/boot/cmd.c
===================================================================
RCS file: /cvs/src/sys/stand/boot/cmd.c,v
retrieving revision 1.62
diff -u -p -r1.62 cmd.c
--- stand/boot/cmd.c 27 Jun 2014 20:35:37 -0000 1.62
+++ stand/boot/cmd.c 4 Jul 2014 17:39:53 -0000
@@ -129,7 +129,6 @@ read_conf(void)
char *p = cmd_buf;
cmd.cmd = NULL;
-
do {
rc = read(fd, p, 1);
} while (rc > 0 && *p++ != '\n' &&
@@ -155,10 +154,8 @@ read_conf(void)
/* Don't want to run the truncated command */
rc = -1;
}
-
*p = '\0';
}
-
} while (rc > 0 && !(rc = docmd()));
close(fd);
@@ -378,25 +375,25 @@ Xstty(void)
char *cp;
dev_t dev;
- if (cmd.argc == 1)
+ if (cmd.argc == 1) {
printf("%s speed is %d\n", ttyname(0), cnspeed(0, -1));
- else {
- dev = ttydev(cmd.argv[1]);
- if (dev == NODEV)
- printf("%s not a console device\n", cmd.argv[1]);
- else {
- if (cmd.argc == 2)
- printf("%s speed is %d\n", cmd.argv[1],
- cnspeed(dev, -1));
- else {
- sp = 0;
- for (cp = cmd.argv[2]; *cp && isdigit(*cp);
cp++)
- sp = sp * 10 + (*cp - '0');
- cnspeed(dev, sp);
- }
- }
+ return 0;
+ }
+ dev = ttydev(cmd.argv[1]);
+ if (dev == NODEV) {
+ printf("%s not a console device\n", cmd.argv[1]);
+ return 0;
}
+ if (cmd.argc == 2)
+ printf("%s speed is %d\n", cmd.argv[1],
+ cnspeed(dev, -1));
+ else {
+ sp = 0;
+ for (cp = cmd.argv[2]; isdigit(*cp); cp++)
+ sp = sp * 10 + (*cp - '0');
+ cnspeed(dev, sp);
+ }
return 0;
}
@@ -407,8 +404,6 @@ Xtime(void)
if (cmd.argc == 1)
printf(ctime(&tt));
- else {
- }
return 0;
}
@@ -429,8 +424,8 @@ Xls(void)
ls(cmd.path, &sb);
else {
if ((fd = opendir(cmd.path)) < 0) {
- printf ("opendir(%s): %s\n", cmd.path,
- strerror(errno));
+ printf("opendir(%s): %s\n", cmd.path,
+ strerror(errno));
return 0;
}
@@ -440,10 +435,10 @@ Xls(void)
*p++ = '/';
*p = '\0';
- while(readdir(fd, p) >= 0) {
+ while (readdir(fd, p) >= 0) {
if (stat(cmd.path, &sb) < 0)
printf("stat(%s): %s\n", cmd.path,
- strerror(errno));
+ strerror(errno));
else
ls(p, &sb);
}