2 * Copyright (c) 1997, 1998
3 * Nan Yang Computer Services Limited. All rights reserved.
5 * This software is distributed under the so-called ``Berkeley
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Nan Yang Computer
20 * 4. Neither the name of the Company nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * This software is provided ``as is'', and any express or implied
25 * warranties, including, but not limited to, the implied warranties of
26 * merchantability and fitness for a particular purpose are disclaimed.
27 * In no event shall the company or contributors be liable for any
28 * direct, indirect, incidental, special, exemplary, or consequential
29 * damages (including, but not limited to, procurement of substitute
30 * goods or services; loss of use, data, or profits; or business
31 * interruption) however caused and on any theory of liability, whether
32 * in contract, strict liability, or tort (including negligence or
33 * otherwise) arising in any way out of the use of this software, even if
34 * advised of the possibility of such damage.
40 * This file contains the parser for the configuration routines. It's used
41 * both in the kernel and in the user interface program, thus the separate file.
45 * Go through a text and split up into text tokens. These are either non-blank
46 * sequences, or any sequence (except \0) enclosed in ' or ". Embedded ' or
47 * " characters may be escaped by \, which otherwise has no special meaning.
49 * Delimit by following with a \0, and return pointers to the starts at token [].
50 * Return the number of tokens found as the return value.
52 * This method has the restriction that a closing " or ' must be followed by
55 * Error conditions are end of line before end of quote, or no space after
56 * a closing quote. In this case, tokenize() returns -1.
59 #include <sys/param.h>
61 #include <sys/systm.h>
67 #include <machine/setjmp.h>
68 /* All this mess for a single struct definition */
70 #include <sys/namei.h>
71 #include <sys/disklabel.h>
72 #include <sys/mount.h>
76 #include <dev/vinum/vinumvar.h>
77 #include <dev/vinum/vinumkw.h>
78 #include <dev/vinum/vinumio.h>
79 #include <dev/vinum/vinumext.h>
81 #define SPACETAB(c) ((c == ' ') || (c == '\t')) /* check for white space */
83 /* enum keyword is defined in vinumvar.h */
85 #define keypair(x) { #x, kw_##x } /* create pair "foo", kw_foo */
86 #define flagkeypair(x) { "-"#x, kw_##x } /* create pair "-foo", kw_foo */
87 #define KEYWORDSET(x) {sizeof (x) / sizeof (struct _keywords), x}
89 /* Normal keywords. These are all the words that vinum knows. */
90 struct _keywords keywords[] =
101 keypair(writethrough),
109 keypair(driveoffset),
118 #ifndef KERNEL /* for vinum(8) only */
127 keypair(printconfig),
144 keypair(resetconfig),
157 keypair(checkparity),
158 keypair(rebuildparity)
160 struct keywordset keyword_set = KEYWORDSET(keywords);
163 struct _keywords flag_keywords[] =
171 struct keywordset flag_set = KEYWORDSET(flag_keywords);
176 tokenize(char *cptr, char *token[])
178 char delim; /* delimiter for searching for the partner */
179 int tokennr; /* index of this token */
180 tokennr = 0; /* none found yet */
183 while (SPACETAB(*cptr))
184 cptr++; /* skip initial white space */
185 if ((*cptr == '\0') || (*cptr == '\n') || (*cptr == '#')) /* end of line */
186 return tokennr; /* return number of tokens found */
188 token[tokennr] = cptr; /* point to it */
189 tokennr++; /* one more */
190 /* XXX this is broken. It leaves superfluous \\ characters in the text */
191 if ((delim == '\'') || (delim == '"')) { /* delimitered */
194 if ((*cptr == delim) && (cptr[-1] != '\\')) { /* found the partner */
195 cptr++; /* move on past */
196 if (!SPACETAB(*cptr)) /* error, no space after closing quote */
198 *cptr++ = '\0'; /* delimit */
199 } else if ((*cptr == '\0') || (*cptr == '\n')) /* end of line */
202 } else { /* not quoted */
203 while ((*cptr != '\0') && (!SPACETAB(*cptr)) && (*cptr != '\n'))
205 if (*cptr != '\0') /* not end of the line, */
206 *cptr++ = '\0'; /* delimit and move to the next */
211 /* Find a keyword and return an index */
213 get_keyword(char *name, struct keywordset *keywordset)
216 struct _keywords *keywords = keywordset->k; /* point to the keywords */
217 if (name != NULL) { /* parameter exists */
218 for (i = 0; i < keywordset->size; i++)
219 if (!strcmp(name, keywords[i].name))
220 return (enum keyword) keywords[i].keyword;
222 return kw_invalid_keyword;