[BACK]Return to vars.c CVS log [TXT][DIR] Up to [local] / sys / stand / boot

Annotation of sys/stand/boot/vars.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: vars.c,v 1.13 2005/05/24 20:48:35 uwe Exp $   */
                      2:
                      3: /*
                      4:  * Copyright (c) 1998-2000 Michael Shalayeff
                      5:  * All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  *
                     16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     17:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     18:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     19:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     20:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     21:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     22:  * OR SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     24:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     25:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     26:  * SUCH DAMAGE.
                     27:  *
                     28:  */
                     29:
                     30: #include <sys/param.h>
                     31: #include <libsa.h>
                     32: #include <sys/reboot.h>
                     33: #include <lib/libkern/funcs.h>
                     34: #include "cmd.h"
                     35:
                     36: extern char prog_ident[];
                     37: extern int debug;
                     38:
                     39: static int Xaddr(void);
                     40: static int Xdevice(void);
                     41: #ifdef DEBUG
                     42: static int Xdebug(void);
                     43: #endif
                     44: static int Ximage(void);
                     45: static int Xhowto(void);
                     46: static int Xtty(void);
                     47: static int Xtimeout(void);
                     48: int Xset(void);
                     49: int Xenv(void);
                     50:
                     51: const struct cmd_table cmd_set[] = {
                     52:        {"addr",   CMDT_VAR, Xaddr},
                     53:        {"howto",  CMDT_VAR, Xhowto},
                     54: #ifdef DEBUG
                     55:        {"debug",  CMDT_VAR, Xdebug},
                     56: #endif
                     57:        {"device", CMDT_VAR, Xdevice},
                     58:        {"tty",    CMDT_VAR, Xtty},
                     59:        {"image",  CMDT_VAR, Ximage},
                     60:        {"timeout",CMDT_VAR, Xtimeout},
                     61:        {NULL,0}
                     62: };
                     63:
                     64: #ifdef DEBUG
                     65: static int
                     66: Xdebug(void)
                     67: {
                     68:        if (cmd.argc != 2)
                     69:                printf( "o%s\n", debug? "n": "ff" );
                     70:        else
                     71:                debug = (cmd.argv[1][0] == '0' ||
                     72:                         (cmd.argv[1][0] == 'o' && cmd.argv[1][1] == 'f'))?
                     73:                         0: 1;
                     74:        return 0;
                     75: }
                     76: #endif
                     77:
                     78: static int
                     79: Xtimeout(void)
                     80: {
                     81:        if (cmd.argc != 2)
                     82:                printf( "%d\n", cmd.timeout );
                     83:        else
                     84:                cmd.timeout = (int)strtol( cmd.argv[1], (char **)NULL, 0 );
                     85:        return 0;
                     86: }
                     87:
                     88: /* called only w/ no arguments */
                     89: int
                     90: Xset(void)
                     91: {
                     92:        const struct cmd_table *ct;
                     93:
                     94:        printf("%s\n", prog_ident);
                     95:        for (ct = cmd_set; ct->cmd_name != NULL; ct++) {
                     96:                printf("%s\t ", ct->cmd_name);
                     97:                (*ct->cmd_exec)();
                     98:        }
                     99:        return 0;
                    100: }
                    101:
                    102: static int
                    103: Xdevice(void)
                    104: {
                    105:        if (cmd.argc != 2)
                    106:                printf("%s\n", cmd.bootdev);
                    107:        else
                    108:                strlcpy(cmd.bootdev, cmd.argv[1], sizeof(cmd.bootdev));
                    109:        return 0;
                    110: }
                    111:
                    112: static int
                    113: Ximage(void)
                    114: {
                    115:        if (cmd.argc != 2)
                    116:                printf("%s\n", cmd.image);
                    117:        else
                    118:                strlcpy(cmd.image, cmd.argv[1], sizeof(cmd.image));
                    119:        return 0;
                    120: }
                    121:
                    122: static int
                    123: Xaddr(void)
                    124: {
                    125:        if (cmd.argc != 2)
                    126:                printf("%p\n", cmd.addr);
                    127:        else
                    128:                cmd.addr = (void *)strtol(cmd.argv[1], NULL, 0);
                    129:        return 0;
                    130: }
                    131:
                    132: static int
                    133: Xtty(void)
                    134: {
                    135:        dev_t dev;
                    136:
                    137:        if (cmd.argc != 2)
                    138:                printf("%s\n", ttyname(0));
                    139:        else {
                    140:                dev = ttydev(cmd.argv[1]);
                    141:                if (dev == NODEV)
                    142:                        printf("%s not a console device\n", cmd.argv[1]);
                    143:                else {
                    144:                        printf("switching console to %s\n", cmd.argv[1]);
                    145:                        if (cnset(dev))
                    146:                                printf("%s console not present\n",
                    147:                                    cmd.argv[1]);
                    148:                        else
                    149:                                printf("%s\n", prog_ident);
                    150:                }
                    151:        }
                    152:        return 0;
                    153: }
                    154:
                    155: static int
                    156: Xhowto(void)
                    157: {
                    158:        if (cmd.argc == 1) {
                    159:                if (cmd.boothowto) {
                    160:                        putchar('-');
                    161:                        if (cmd.boothowto & RB_ASKNAME)
                    162:                                putchar('a');
                    163: #ifdef notused
                    164:                        if (cmd.boothowto & RB_HALT)
                    165:                                putchar('b');
                    166: #endif
                    167:                        if (cmd.boothowto & RB_CONFIG)
                    168:                                putchar('c');
                    169:                        if (cmd.boothowto & RB_SINGLE)
                    170:                                putchar('s');
                    171:                        if (cmd.boothowto & RB_KDB)
                    172:                                putchar('d');
                    173:                }
                    174:                putchar('\n');
                    175:        } else
                    176:                bootparse(1);
                    177:        return 0;
                    178: }
                    179:
                    180: int
                    181: bootparse(int i)
                    182: {
                    183:        char *cp;
                    184:        int howto = cmd.boothowto;
                    185:
                    186:        for (; i < cmd.argc; i++) {
                    187:                cp = cmd.argv[i];
                    188:                if (*cp == '-') {
                    189:                        while (*++cp) {
                    190:                                switch (*cp) {
                    191:                                case 'a':
                    192:                                        howto |= RB_ASKNAME;
                    193:                                        break;
                    194: #ifdef notused
                    195:        /*
                    196:         * one day i get the same nice drink i was having
                    197:         * and figure out what is it supposed to be used for
                    198:         */
                    199:                                case 'b':
                    200:                                        howto |= RB_HALT;
                    201:                                        break;
                    202: #endif
                    203:                                case 'c':
                    204:                                        howto |= RB_CONFIG;
                    205:                                        break;
                    206:                                case 's':
                    207:                                        howto |= RB_SINGLE;
                    208:                                        break;
                    209:                                case 'd':
                    210:                                        howto |= RB_KDB;
                    211:                                        break;
                    212:                                default:
                    213:                                        printf("howto: bad option: %c\n", *cp);
                    214:                                        return 1;
                    215:                                }
                    216:                        }
                    217:                } else {
                    218:                        printf("boot: illegal argument %s\n", cmd.argv[i]);
                    219:                        return 1;
                    220:                }
                    221:        }
                    222:        cmd.boothowto = howto;
                    223:        return 0;
                    224: }
                    225:
                    226: /*
                    227:  * maintain environment as a sequence of '\n' separated
                    228:  * variable definitions in the form <name>=[<value>]
                    229:  * terminated by the usual '\0'
                    230:  */
                    231: char *environ;
                    232:
                    233: int
                    234: Xenv(void)
                    235: {
                    236:        if (cmd.argc == 1) {
                    237:                if (environ)
                    238:                        printf("%s", environ);
                    239:                else
                    240:                        printf("empty\n");
                    241:        } else {
                    242:                char *p, *q;
                    243:                int l;
                    244:
                    245:                for (p = environ; p && *p; p = q) {
                    246:                        l = strlen(cmd.argv[1]);
                    247:                        for (q = p; *q != '='; q++)
                    248:                                ;
                    249:                        l = max(l, q - p) + 1;
                    250:                        for (q = p; *q != '\n'; q++)
                    251:                                ;
                    252:                        if (*q)
                    253:                                q++;
                    254:                        if (!strncmp(p, cmd.argv[1], l)) {
                    255:                                while((*p++ = *q++))
                    256:                                        ;
                    257:                                p--;
                    258:                        }
                    259:                }
                    260:                if (!p)
                    261:                        p = environ = alloc(4096);
                    262:                snprintf(p, environ + 4096 - p, "%s=%s\n",
                    263:                    cmd.argv[1], (cmd.argc==3?cmd.argv[2]:""));
                    264:        }
                    265:
                    266:        return 0;
                    267: }

CVSweb