Anyone?
On Fri, Jul 04, 2014 at 07:41:07PM +0200, Tobias Stoeckmann wrote:
> 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);
> }