Patrick Welche <prlw1@cam.ac.uk>
[netbsd-mini2440.git] / external / bsd / am-utils / dist / fsinfo / fsi_gram.y
blob16f4c19dba6c13d58e5eecf261d6e743078ea520
1 /* $NetBSD$ */
3 /*
4 * Copyright (c) 1997-2009 Erez Zadok
5 * Copyright (c) 1989 Jan-Simon Pendry
6 * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
7 * Copyright (c) 1989 The Regents of the University of California.
8 * All rights reserved.
10 * This code is derived from software contributed to Berkeley by
11 * Jan-Simon Pendry at Imperial College, London.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 3. All advertising materials mentioning features or use of this software
22 * must display the following acknowledgment:
23 * This product includes software developed by the University of
24 * California, Berkeley and its contributors.
25 * 4. Neither the name of the University nor the names of its contributors
26 * may be used to endorse or promote products derived from this software
27 * without specific prior written permission.
29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
42 * File: am-utils/fsinfo/fsi_gram.y
47 #ifdef HAVE_CONFIG_H
48 # include <config.h>
49 #endif /* HAVE_CONFIG_H */
50 #include <am_defs.h>
51 #include <fsi_data.h>
52 #include <fsinfo.h>
54 extern qelem *list_of_hosts, *list_of_automounts;
57 %union {
58 auto_tree *a;
59 disk_fs *d;
60 ether_if *e;
61 host *h;
62 qelem *q;
63 char *s;
64 fsi_mount *m;
65 fsmount *f;
68 %token tARCH
69 %token tAS
70 %token tAUTOMOUNT
71 %token tCLUSTER
72 %token tCONFIG
73 %token tDUMPSET
74 %token tEQ
75 %token tNFSEQ
76 %token tEXPORTFS
77 %token tFREQ
78 %token tFROM
79 %token tFS
80 %token tFSTYPE
81 %token tHWADDR
82 %token tINADDR
83 %token tHOST
84 %token tLOCALHOST
85 %token tLOG
86 %token tMOUNT
87 %token tNETMASK
88 %token tNETIF
89 %token tVOLNAME
90 %token tOPTS
91 %token tOS
92 %token tPASSNO
93 %token tDIRECT
94 %token tSEL
95 %token <s> tSTR
97 %start list_of_hosts
99 %type <a> automount
100 %type <q> automount_tree
101 %type <e> ether_attr
102 %type <m> dir_tree_info
103 %type <d> filesystem fs_info_list
104 %type <h> host host_attr host_attr_list
105 %type <q> list_of_hosts list_of_filesystems list_of_mounts dir_tree
106 %type <f> localinfo_list
107 %type <s> opt_auto_opts
111 list_of_hosts :
112 /* empty */
113 { $$ = new_que(); }
115 | list_of_hosts host
116 { if ($2) ins_que((qelem *) $2, list_of_hosts->q_back);
117 $$ = $1; }
119 | list_of_hosts automount
120 { if ($2) ins_que((qelem *) $2, list_of_automounts->q_back);
121 $$ = $1; }
125 * A new host:
127 * host foo.domain
129 host :
130 tHOST host_attr list_of_filesystems list_of_mounts
131 { $$ = $2; $$->h_disk_fs = $3; $$->h_mount = $4; }
133 | error tHOST host_attr list_of_filesystems list_of_mounts
134 { $$ = $3; $$->h_disk_fs = $4; $$->h_mount = $5; }
138 host_attr :
139 tSTR
140 { $$ = new_host(); set_host($$, HF_HOST, $1); }
142 | '{' host_attr_list '}' tSTR
143 { $$ = $2; set_host($$, HF_HOST, $4); }
147 host_attr_list :
148 /* empty */
149 { $$ = new_host(); }
151 | host_attr_list tNETIF tSTR '{' ether_attr '}'
152 { if ($5) {
153 $5->e_if = $3;
154 $$ = $1; set_host($$, HF_ETHER, (char *) $5); }
157 | host_attr_list tCONFIG tSTR
158 { $$ = $1; set_host($$, HF_CONFIG, $3); }
160 | host_attr_list tARCH '=' tSTR
161 { $$ = $1; set_host($$, HF_ARCH, $4); }
163 | host_attr_list tOS '=' tSTR
164 { $$ = $1; set_host($$, HF_OS, $4); }
166 | host_attr_list tCLUSTER '=' tSTR
167 { $$ = $1; set_host($$, HF_CLUSTER, $4); }
169 | host_attr_list error '=' tSTR
170 { yyerror("unknown host attribute"); }
173 ether_attr :
174 /* empty */
175 { $$ = new_ether_if(); }
177 | ether_attr tINADDR '=' tSTR
178 { $$ = $1; set_ether_if($$, EF_INADDR, $4); }
179 | ether_attr tNETMASK '=' tSTR
180 { $$ = $1; set_ether_if($$, EF_NETMASK, $4); }
181 | ether_attr tHWADDR '=' tSTR
182 { $$ = $1; set_ether_if($$, EF_HWADDR, $4); }
186 * A new automount tree:
188 * automount /mountpoint { ... }
190 automount :
191 tAUTOMOUNT opt_auto_opts automount_tree
192 { if ($3) {
193 $$ = new_auto_tree($2, $3);
194 } else {
195 $$ = 0;
199 | tAUTOMOUNT error
200 { $$ = 0; }
203 opt_auto_opts :
204 /* empty */
205 { $$ = strdup(""); }
207 | tOPTS tSTR
208 { $$ = $2; }
211 list_of_filesystems :
212 /* empty */
213 { $$ = 0; }
215 | list_of_filesystems filesystem
216 { if ($2) {
217 if ($1)
218 $$ = $1;
219 else
220 $$ = new_que();
221 ins_que(&$2->d_q, $$->q_back);
222 } else {
223 $$ = $1;
229 * A new filesystem:
231 * fs /dev/whatever { ... }
233 filesystem :
234 tFS tSTR '{' fs_info_list '}'
235 { $4->d_dev = $2; $$ = $4; }
237 | tFS error '}'
238 { $$ = (disk_fs *) NULL; }
242 * Per-filesystem information:
244 * fstype - the type of the filesystem (4.2, nfs, swap, export)
245 * opts - the mount options ("rw,grpid")
246 * passno - fsck pass number
247 * freq - dump frequency
248 * dumpset - tape set for filesystem dumps
249 * mount - where to mount this filesystem
250 * log - log device
252 fs_info_list :
253 /* empty */
254 { $$ = new_disk_fs(); }
256 | fs_info_list tFSTYPE '=' tSTR
257 { $$ = $1; set_disk_fs($$, DF_FSTYPE, $4); }
259 | fs_info_list tOPTS '=' tSTR
260 { $$ = $1; set_disk_fs($$, DF_OPTS, $4); }
262 | fs_info_list tPASSNO '=' tSTR
263 { $$ = $1; set_disk_fs($$, DF_PASSNO, $4); }
265 | fs_info_list tFREQ '=' tSTR
266 { $$ = $1; set_disk_fs($$, DF_FREQ, $4); }
268 | fs_info_list tMOUNT dir_tree
269 { $$ = $1; set_disk_fs($$, DF_MOUNT, (char *) $3); }
271 | fs_info_list tDUMPSET '=' tSTR
272 { $$ = $1; set_disk_fs($$, DF_DUMPSET, $4); }
274 | fs_info_list tLOG '=' tSTR
275 { $$ = $1; set_disk_fs($$, DF_LOG, $4); }
277 | fs_info_list error '=' tSTR
278 { yyerror("unknown filesystem attribute"); }
282 * An automount tree:
284 * name = "volname" name is a reference to volname
285 * name -> "string" name is a link to "string"
286 * name nfsalias "string" name is a link to "string", string parsed as NFS
287 * pathname.
288 * name { ... } name is an automount tree
290 automount_tree :
291 /* empty */
292 { $$ = 0; }
294 | automount_tree tSTR opt_auto_opts '=' tSTR
295 { automount *a = new_automount($2);
296 a->a_volname = $5;
297 a->a_opts = $3;
298 if ($1)
299 $$ = $1;
300 else
301 $$ = new_que();
302 ins_que(&a->a_q, $$->q_back);
304 | automount_tree tSTR opt_auto_opts tNFSEQ tSTR
305 { automount *a = new_automount($2);
306 a->a_hardwiredfs = $5;
307 a->a_opts = $3;
308 if ($1)
309 $$ = $1;
310 else
311 $$ = new_que();
312 ins_que(&a->a_q, $$->q_back);
315 | automount_tree tSTR tEQ tSTR
316 { automount *a = new_automount($2);
317 a->a_symlink = $4;
318 if ($1)
319 $$ = $1;
320 else
321 $$ = new_que();
322 ins_que(&a->a_q, $$->q_back);
325 | automount_tree tSTR opt_auto_opts '{' automount_tree '}'
326 { automount *a = new_automount($2);
327 a->a_mount = $5;
328 a->a_opts = $3;
329 if ($1)
330 $$ = $1;
331 else
332 $$ = new_que();
333 ins_que(&a->a_q, $$->q_back);
337 dir_tree :
338 /* empty */
339 { $$ = 0; }
341 | dir_tree tSTR '{' dir_tree_info dir_tree '}'
342 { $4->m_mount = $5;
343 $4->m_name = $2;
344 if ($2[0] != '/' && $2[1] && strchr($2+1, '/'))
345 yyerror("not allowed '/' in a directory name");
346 if ($1)
347 $$ = $1;
348 else
349 $$ = new_que();
350 ins_que(&$4->m_q, $$->q_back);
354 dir_tree_info :
355 /* empty */
356 { $$ = new_mount(); }
358 | dir_tree_info tEXPORTFS tSTR
359 { $$ = $1; set_mount($$, DM_EXPORTFS, $3); }
361 | dir_tree_info tVOLNAME tSTR
362 { $$ = $1; set_mount($$, DM_VOLNAME, $3); }
364 | dir_tree_info tSEL tSTR
365 { $$ = $1; set_mount($$, DM_SEL, $3); }
367 | dir_tree_info error '=' tSTR
368 { yyerror("unknown directory attribute"); }
372 * Additional mounts on a host
374 * mount "volname" ...
376 list_of_mounts :
377 /* empty */
378 { $$ = 0; }
380 | list_of_mounts tMOUNT tSTR localinfo_list
381 { set_fsmount($4, FM_VOLNAME, $3);
382 if ($1)
383 $$ = $1;
384 else
385 $$ = new_que();
386 ins_que(&$4->f_q, $$->q_back);
391 * Mount info:
393 * from "hostname" - obtain the object from the named host
394 * as "string" - where to mount, if different from the volname
395 * opts "string" - mount options
396 * fstype "type" - type of filesystem mount, if not nfs
397 * direct - mount entry, no need to create ad-hoc hosts file
399 localinfo_list :
400 /* empty */
401 { $$ = new_fsmount(); }
403 | localinfo_list tDIRECT
404 { $$ = $1; set_fsmount($$, FM_DIRECT, ""); }
406 | localinfo_list tAS tSTR
407 { $$ = $1; set_fsmount($$, FM_LOCALNAME, $3); }
409 | localinfo_list tFROM tSTR
410 { $$ = $1; set_fsmount($$, FM_FROM, $3); }
412 | localinfo_list tFSTYPE tSTR
413 { $$ = $1; set_fsmount($$, FM_FSTYPE, $3); }
415 | localinfo_list tOPTS tSTR
416 { $$ = $1; set_fsmount($$, FM_OPTS, $3); }
418 | localinfo_list error '=' tSTR
419 { yyerror("unknown mount attribute"); }