root/stand/boot/vars.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. Xdebug
  2. Xtimeout
  3. Xset
  4. Xdevice
  5. Ximage
  6. Xaddr
  7. Xtty
  8. Xhowto
  9. bootparse
  10. Xenv

    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 }

/* [<][>][^][v][top][bottom][index][help] */