1/*	$NetBSD$	*/
2
3/*
4 * Copyright (c) 1997-2014 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.
9 *
10 * This code is derived from software contributed to Berkeley by
11 * Jan-Simon Pendry at Imperial College, London.
12 *
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. Neither the name of the University nor the names of its contributors
22 *    may be used to endorse or promote products derived from this software
23 *    without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 *
37 *
38 * File: am-utils/fsinfo/fsi_gram.y
39 *
40 */
41
42%{
43#ifdef HAVE_CONFIG_H
44# include <config.h>
45#endif /* HAVE_CONFIG_H */
46#include <am_defs.h>
47#include <fsi_data.h>
48#include <fsinfo.h>
49
50extern qelem *list_of_hosts, *list_of_automounts;
51%}
52
53%union {
54	auto_tree *a;
55	disk_fs *d;
56	ether_if *e;
57	host *h;
58	qelem *q;
59	char *s;
60	fsi_mount *m;
61	fsmount *f;
62}
63
64%token	tARCH
65%token	tAS
66%token	tAUTOMOUNT
67%token	tCLUSTER
68%token	tCONFIG
69%token	tDUMPSET
70%token	tEQ
71%token  tNFSEQ
72%token	tEXPORTFS
73%token	tFREQ
74%token	tFROM
75%token	tFS
76%token	tFSTYPE
77%token	tHWADDR
78%token	tINADDR
79%token	tHOST
80%token	tLOCALHOST
81%token	tLOG
82%token	tMOUNT
83%token	tNETMASK
84%token	tNETIF
85%token	tVOLNAME
86%token	tOPTS
87%token	tOS
88%token	tPASSNO
89%token        tDIRECT
90%token	tSEL
91%token	<s> tSTR
92
93%start list_of_hosts
94
95%type <a> automount
96%type <q> automount_tree
97%type <e> ether_attr
98%type <m> dir_tree_info
99%type <d> filesystem fs_info_list
100%type <h> host host_attr host_attr_list
101%type <q> list_of_hosts list_of_filesystems list_of_mounts dir_tree
102%type <f> localinfo_list
103%type <s> opt_auto_opts
104
105%%
106
107list_of_hosts :
108	  /* empty */
109	  { $$ = new_que(); }
110
111	| list_of_hosts host
112	  { if ($2) ins_que((qelem *) $2, list_of_hosts->q_back);
113	    $$ = $1; }
114
115	| list_of_hosts automount
116	  { if ($2) ins_que((qelem *) $2, list_of_automounts->q_back);
117	    $$ = $1; }
118	;
119
120/*
121 * A new host:
122 *
123 * host foo.domain
124 */
125host :
126	  tHOST host_attr list_of_filesystems list_of_mounts
127	  { $$ = $2; $$->h_disk_fs = $3; $$->h_mount = $4; }
128
129	| error tHOST host_attr list_of_filesystems list_of_mounts
130	  { $$ = $3; $$->h_disk_fs = $4; $$->h_mount = $5; }
131
132	;
133
134host_attr :
135	  tSTR
136	  { $$ = new_host(); set_host($$, HF_HOST, $1); }
137
138	| '{' host_attr_list '}' tSTR
139	  { $$ = $2; set_host($$, HF_HOST, $4); }
140
141	;
142
143host_attr_list :
144	  /* empty */
145	  { $$ = new_host(); }
146
147	| host_attr_list tNETIF tSTR '{' ether_attr '}'
148	  { if ($5) {
149		$5->e_if = $3;
150		$$ = $1; set_host($$, HF_ETHER, (char *) $5); }
151	  }
152
153	| host_attr_list tCONFIG tSTR
154	  { $$ = $1; set_host($$, HF_CONFIG, $3); }
155
156	| host_attr_list tARCH '=' tSTR
157	  { $$ = $1; set_host($$, HF_ARCH, $4); }
158
159	| host_attr_list tOS '=' tSTR
160	  { $$ = $1; set_host($$, HF_OS, $4); }
161
162	| host_attr_list tCLUSTER '=' tSTR
163	  { $$ = $1; set_host($$, HF_CLUSTER, $4); }
164
165	| host_attr_list error '=' tSTR
166	  { yyerror("unknown host attribute"); }
167	;
168
169ether_attr :
170	  /* empty */
171	  { $$ = new_ether_if(); }
172
173	| ether_attr tINADDR '=' tSTR
174	  { $$ = $1; set_ether_if($$, EF_INADDR, $4); }
175	| ether_attr tNETMASK '=' tSTR
176	  { $$ = $1; set_ether_if($$, EF_NETMASK, $4); }
177	| ether_attr tHWADDR '=' tSTR
178	  { $$ = $1; set_ether_if($$, EF_HWADDR, $4); }
179	;
180
181/*
182 * A new automount tree:
183 *
184 * automount /mountpoint { ... }
185 */
186automount :
187	  tAUTOMOUNT opt_auto_opts automount_tree
188	  { if ($3) {
189		$$ = new_auto_tree($2, $3);
190	    } else {
191		$$ = 0;
192	    }
193	  }
194
195	| tAUTOMOUNT error
196	  { $$ = 0; }
197	;
198
199opt_auto_opts :
200	  /* empty */
201	  { $$ = xstrdup(""); }
202
203	| tOPTS tSTR
204	  { $$ = $2; }
205	;
206
207list_of_filesystems :
208	  /* empty */
209	  { $$ = 0; }
210
211	| list_of_filesystems filesystem
212	  { if ($2) {
213		if ($1)
214			$$ = $1;
215		else
216			$$ = new_que();
217		ins_que(&$2->d_q, $$->q_back);
218	    } else {
219		$$ = $1;
220	    }
221	  }
222	;
223
224/*
225 * A new filesystem:
226 *
227 * fs /dev/whatever { ... }
228 */
229filesystem :
230	  tFS tSTR '{' fs_info_list '}'
231	  { $4->d_dev = $2; $$ = $4; }
232
233	| tFS error '}'
234	  { $$ = (disk_fs *) NULL; }
235	;
236
237/*
238 * Per-filesystem information:
239 *
240 * fstype - the type of the filesystem (4.2, nfs, swap, export)
241 * opts - the mount options ("rw,grpid")
242 * passno - fsck pass number
243 * freq - dump frequency
244 * dumpset - tape set for filesystem dumps
245 * mount - where to mount this filesystem
246 * log - log device
247 */
248fs_info_list :
249	  /* empty */
250	  { $$ = new_disk_fs(); }
251
252	| fs_info_list tFSTYPE '=' tSTR
253	  { $$ = $1; set_disk_fs($$, DF_FSTYPE, $4); }
254
255	| fs_info_list tOPTS '=' tSTR
256	  { $$ = $1; set_disk_fs($$, DF_OPTS, $4); }
257
258	| fs_info_list tPASSNO '=' tSTR
259	  { $$ = $1; set_disk_fs($$, DF_PASSNO, $4); }
260
261	| fs_info_list tFREQ '=' tSTR
262	  { $$ = $1; set_disk_fs($$, DF_FREQ, $4); }
263
264	| fs_info_list tMOUNT dir_tree
265	  { $$ = $1; set_disk_fs($$, DF_MOUNT, (char *) $3); }
266
267	| fs_info_list tDUMPSET '=' tSTR
268	  { $$ = $1; set_disk_fs($$, DF_DUMPSET, $4); }
269
270	| fs_info_list tLOG '=' tSTR
271	  { $$ = $1; set_disk_fs($$, DF_LOG, $4); }
272
273	| fs_info_list error '=' tSTR
274	  { yyerror("unknown filesystem attribute"); }
275	;
276
277/*
278 * An automount tree:
279 *
280 * name = "volname"	name is a reference to volname
281 * name -> "string"	name is a link to "string"
282 * name nfsalias "string"  name is a link to "string", string parsed as NFS
283 *			   pathname.
284 * name { ... }		name is an automount tree
285 */
286automount_tree :
287	  /* empty */
288	  { $$ = 0; }
289
290	| automount_tree tSTR opt_auto_opts '=' tSTR
291	  { automount *a = new_automount($2);
292	    a->a_volname = $5;
293	    a->a_opts = $3;
294	    if ($1)
295		$$ = $1;
296	    else
297		$$ = new_que();
298	    ins_que(&a->a_q, $$->q_back);
299	  }
300          | automount_tree tSTR opt_auto_opts tNFSEQ tSTR
301            { automount *a = new_automount($2);
302            a->a_hardwiredfs = $5;
303            a->a_opts = $3;
304            if ($1)
305                $$ = $1;
306            else
307                $$ = new_que();
308            ins_que(&a->a_q, $$->q_back);
309          }
310
311	| automount_tree tSTR tEQ tSTR
312	  { automount *a = new_automount($2);
313	    a->a_symlink = $4;
314	    if ($1)
315		$$ = $1;
316	    else
317		$$ = new_que();
318	    ins_que(&a->a_q, $$->q_back);
319	  }
320
321	| automount_tree tSTR opt_auto_opts '{' automount_tree '}'
322	  { automount *a = new_automount($2);
323	    a->a_mount = $5;
324	    a->a_opts = $3;
325	    if ($1)
326		$$ = $1;
327	    else
328		$$ = new_que();
329	    ins_que(&a->a_q, $$->q_back);
330	  }
331	;
332
333dir_tree :
334	  /* empty */
335	  { $$ = 0; }
336
337	| dir_tree tSTR '{' dir_tree_info dir_tree '}'
338	  { $4->m_mount = $5;
339	    $4->m_name = $2;
340	    if ($2[0] != '/' && $2[1] && strchr($2+1, '/'))
341		yyerror("not allowed '/' in a directory name");
342	    if ($1)
343		$$ = $1;
344	    else
345		$$ = new_que();
346	    ins_que(&$4->m_q, $$->q_back);
347	  }
348	;
349
350dir_tree_info :
351	  /* empty */
352	  { $$ = new_mount(); }
353
354	| dir_tree_info tEXPORTFS tSTR
355	  { $$ = $1; set_mount($$, DM_EXPORTFS, $3); }
356
357	| dir_tree_info tVOLNAME tSTR
358	  { $$ = $1; set_mount($$, DM_VOLNAME, $3); }
359
360	| dir_tree_info tSEL tSTR
361	  { $$ = $1; set_mount($$, DM_SEL, $3); }
362
363	| dir_tree_info error '=' tSTR
364	  { yyerror("unknown directory attribute"); }
365	;
366
367/*
368 * Additional mounts on a host
369 *
370 * mount "volname" ...
371 */
372list_of_mounts :
373	  /* empty */
374	  { $$ = 0; }
375
376	| list_of_mounts tMOUNT tSTR localinfo_list
377	  { set_fsmount($4, FM_VOLNAME, $3);
378	    if ($1)
379		$$ = $1;
380	    else
381		$$ = new_que();
382	    ins_que(&$4->f_q, $$->q_back);
383	    }
384	;
385
386/*
387 * Mount info:
388 *
389 * from "hostname"	- obtain the object from the named host
390 * as "string"		- where to mount, if different from the volname
391 * opts "string"	- mount options
392 * fstype "type"	- type of filesystem mount, if not nfs
393 * direct             - mount entry, no need to create ad-hoc hosts file
394 */
395localinfo_list :
396	  /* empty */
397	  { $$ = new_fsmount(); }
398
399        | localinfo_list tDIRECT
400          { $$ = $1; set_fsmount($$, FM_DIRECT, ""); }
401
402	| localinfo_list tAS tSTR
403	  { $$ = $1; set_fsmount($$, FM_LOCALNAME, $3); }
404
405	| localinfo_list tFROM tSTR
406	  { $$ = $1; set_fsmount($$, FM_FROM, $3); }
407
408	| localinfo_list tFSTYPE tSTR
409	  { $$ = $1; set_fsmount($$, FM_FSTYPE, $3); }
410
411	| localinfo_list tOPTS tSTR
412	  { $$ = $1; set_fsmount($$, FM_OPTS, $3); }
413
414	| localinfo_list error '=' tSTR
415	  { yyerror("unknown mount attribute"); }
416	;
417