1 /* $NetBSD: parseutils.c,v 1.5 2008/12/14 17:03:43 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1996, 1997 5 * Matthias Drochner. All rights reserved. 6 * Copyright (c) 1996, 1997 7 * Perry E. Metzger. All rights reserved. 8 * Copyright (c) 1997 9 * Jason R. Thorpe. All rights reserved 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgements: 21 * This product includes software developed for the NetBSD Project 22 * by Matthias Drochner. 23 * This product includes software developed for the NetBSD Project 24 * by Perry E. Metzger. 25 * 4. The names of the authors may not be used to endorse or promote products 26 * derived from this software without specific prior written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 29 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 30 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 31 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 33 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 34 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 35 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 37 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 #include <lib/libkern/libkern.h> 41 #include <lib/libsa/stand.h> 42 #include <sys/boot_flag.h> 43 44 #include "libi386.h" 45 46 /* 47 * chops the head from the arguments and returns the arguments if any, 48 * or possibly an empty string. 49 */ 50 char * 51 gettrailer(char *arg) 52 { 53 char *options; 54 55 if ((options = strchr(arg, ' ')) == NULL) 56 return ""; 57 else 58 *options++ = '\0'; 59 60 /* trim leading blanks */ 61 while (*options && *options == ' ') 62 options++; 63 64 return options; 65 } 66 67 int 68 parseopts(const char *opts, int *howto) 69 { 70 int r, tmpopt = 0; 71 72 opts++; /* skip - */ 73 while (*opts) { 74 r = 0; 75 BOOT_FLAG(*opts, r); 76 if (r == 0) { 77 printf("-%c: unknown flag\n", *opts); 78 command_help(NULL); 79 return 0; 80 } 81 tmpopt |= r; 82 opts++; 83 if (*opts == ' ' || *opts == '\t') { 84 do 85 opts++; /* skip whitespace */ 86 while (*opts == ' ' || *opts == '\t'); 87 if (*opts == '-') 88 opts++; /* skip - */ 89 else if (*opts != '\0') { 90 printf("invalid arguments\n"); 91 command_help(NULL); 92 return 0; 93 } 94 } 95 } 96 97 *howto = tmpopt; 98 return 1; 99 } 100 101 int 102 parseboot(char *arg, char **filename, int *howto) 103 { 104 char *opts = NULL; 105 106 *filename = 0; 107 *howto = 0; 108 109 /* if there were no arguments */ 110 if (!*arg) 111 return 1; 112 113 /* format is... */ 114 /* [[xxNx:]filename] [-adqsv] */ 115 116 /* check for just args */ 117 if (arg[0] == '-') 118 opts = arg; 119 else { 120 /* there's a file name */ 121 *filename = arg; 122 123 opts = gettrailer(arg); 124 if (!*opts) 125 opts = NULL; 126 else if (*opts != '-') { 127 printf("invalid arguments\n"); 128 command_help(NULL); 129 return 0; 130 } 131 } 132 133 /* at this point, we have dealt with filenames. */ 134 135 /* now, deal with options */ 136 if (opts) { 137 if (parseopts(opts, howto) == 0) 138 return 0; 139 } 140 141 return 1; 142 } 143