xref: /original-bsd/usr.sbin/amd/fsinfo/fsi_gram.y (revision c3e32dec)
1 /*
2  * Copyright (c) 1989 Jan-Simon Pendry
3  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
4  * Copyright (c) 1989, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * Jan-Simon Pendry at Imperial College, London.
9  *
10  * %sccs.include.redist.c%
11  *
12  *	@(#)fsi_gram.y	8.1 (Berkeley) 06/06/93
13  *
14  * $Id: fsi_gram.y,v 5.2.2.1 1992/02/09 15:09:35 jsp beta $
15  *
16  */
17 
18 %{
19 #include "../fsinfo/fsinfo.h"
20 #include <stdio.h>
21 
22 extern qelem *list_of_hosts, *list_of_automounts;
23 %}
24 
25 %union {
26 	auto_tree *a;
27 	disk_fs *d;
28 	ether_if *e;
29 	host *h;
30 	qelem *q;
31 	char *s;
32 	mount *m;
33 	fsmount *f;
34 }
35 
36 %token	tARCH
37 %token	tAS
38 %token	tAUTOMOUNT
39 %token	tCLUSTER
40 %token	tCONFIG
41 %token	tDUMPSET
42 %token	tEQ
43 %token	tEXPORTFS
44 %token	tFREQ
45 %token	tFROM
46 %token	tFS
47 %token	tFSTYPE
48 %token	tHWADDR
49 %token	tINADDR
50 %token	tHOST
51 %token	tLOCALHOST
52 %token	tLOG
53 %token	tMOUNT
54 %token	tNETMASK
55 %token	tNETIF
56 %token	tVOLNAME
57 %token	tOPTS
58 %token	tOS
59 %token	tPASSNO
60 %token	tSEL
61 %token	<s> tSTR
62 
63 %start list_of_hosts
64 
65 %type <a> automount
66 %type <q> automount_tree
67 %type <e> ether_attr
68 %type <m> dir_tree_info
69 %type <d> filesystem fs_info_list
70 %type <h> host host_attr host_attr_list
71 %type <q> list_of_hosts list_of_filesystems list_of_mounts dir_tree
72 %type <f> localinfo_list
73 %type <s> opt_auto_opts
74 
75 %%
76 
77 list_of_hosts :
78 	  /* empty */
79 	  { $$ = new_que(); }
80 
81 	| list_of_hosts host
82 	  { if ($2) ins_que((qelem *) $2, list_of_hosts->q_back);
83 	    $$ = $1; }
84 
85 	| list_of_hosts automount
86 	  { if ($2) ins_que((qelem *) $2, list_of_automounts->q_back);
87 	    $$ = $1; }
88 	;
89 
90 /*
91  * A new host:
92  *
93  * host foo.domain
94  */
95 host :
96 	  tHOST host_attr list_of_filesystems list_of_mounts
97 	  { $$ = $2; $$->h_disk_fs = $3; $$->h_mount = $4; }
98 
99 	| error tHOST host_attr list_of_filesystems list_of_mounts
100 	  { $$ = $3; $$->h_disk_fs = $4; $$->h_mount = $5; }
101 
102 	;
103 
104 host_attr :
105 	  tSTR
106 	  { $$ = new_host(); set_host($$, HF_HOST, $1); }
107 
108 	| '{' host_attr_list '}' tSTR
109 	  { $$ = $2; set_host($$, HF_HOST, $4); }
110 
111 	;
112 
113 host_attr_list :
114 	  /* empty */
115 	  { $$ = new_host(); }
116 
117 	| host_attr_list tNETIF tSTR '{' ether_attr '}'
118 	  { if ($5) {
119 		$5->e_if = $3;
120 		$$ = $1; set_host($$, HF_ETHER, $5); }
121 	  }
122 
123 	| host_attr_list tCONFIG tSTR
124 	  { $$ = $1; set_host($$, HF_CONFIG, $3); }
125 
126 	| host_attr_list tARCH '=' tSTR
127 	  { $$ = $1; set_host($$, HF_ARCH, $4); }
128 
129 	| host_attr_list tOS '=' tSTR
130 	  { $$ = $1; set_host($$, HF_OS, $4); }
131 
132 	| host_attr_list tCLUSTER '=' tSTR
133 	  { $$ = $1; set_host($$, HF_CLUSTER, $4); }
134 
135 	| host_attr_list error '=' tSTR
136 	  { yyerror("unknown host attribute"); }
137 	;
138 
139 ether_attr :
140 	  /* empty */
141 	  { $$ = new_ether_if(); }
142 
143 	| ether_attr tINADDR '=' tSTR
144 	  { $$ = $1; set_ether_if($$, EF_INADDR, $4); }
145 	| ether_attr tNETMASK '=' tSTR
146 	  { $$ = $1; set_ether_if($$, EF_NETMASK, $4); }
147 	| ether_attr tHWADDR '=' tSTR
148 	  { $$ = $1; set_ether_if($$, EF_HWADDR, $4); }
149 	;
150 
151 /*
152  * A new automount tree:
153  *
154  * automount /mountpoint { ... }
155  */
156 automount :
157 	  tAUTOMOUNT opt_auto_opts automount_tree
158 	  { if ($3) {
159 		$$ = new_auto_tree($2, $3);
160 	    } else {
161 		$$ = 0;
162 	    }
163 	  }
164 
165 	| tAUTOMOUNT error
166 	  { $$ = 0; }
167 	;
168 
169 opt_auto_opts :
170 	  /* empty */
171 	  { $$ = strdup(""); }
172 
173 	| tOPTS tSTR
174 	  { $$ = $2; }
175 	;
176 
177 list_of_filesystems :
178 	  /* empty */
179 	  { $$ = 0; }
180 
181 	| list_of_filesystems filesystem
182 	  { if ($2) {
183 		if ($1)
184 			$$ = $1;
185 		else
186 			$$ = new_que();
187 		ins_que(&$2->d_q, $$->q_back);
188 	    } else {
189 		$$ = $1;
190 	    }
191 	  }
192 	;
193 
194 /*
195  * A new filesystem:
196  *
197  * fs /dev/whatever { ... }
198  */
199 filesystem :
200 	  tFS tSTR '{' fs_info_list '}'
201 	  { $4->d_dev = $2; $$ = $4; }
202 
203 	| tFS error '}'
204 	  { $$ = (disk_fs *) 0; }
205 	;
206 
207 /*
208  * Per-filesystem information:
209  *
210  * fstype - the type of the filesystem (4.2, nfs, swap, export)
211  * opts - the mount options ("rw,grpid")
212  * passno - fsck pass number
213  * freq - dump frequency
214  * dumpset - tape set for filesystem dumps
215  * mount - where to mount this filesystem
216  * log - log device
217  */
218 fs_info_list :
219 	  /* empty */
220 	  { $$ = new_disk_fs(); }
221 
222 	| fs_info_list tFSTYPE '=' tSTR
223 	  { $$ = $1; set_disk_fs($$, DF_FSTYPE, $4); }
224 
225 	| fs_info_list tOPTS '=' tSTR
226 	  { $$ = $1; set_disk_fs($$, DF_OPTS, $4); }
227 
228 	| fs_info_list tPASSNO '=' tSTR
229 	  { $$ = $1; set_disk_fs($$, DF_PASSNO, $4); }
230 
231 	| fs_info_list tFREQ '=' tSTR
232 	  { $$ = $1; set_disk_fs($$, DF_FREQ, $4); }
233 
234 	| fs_info_list tMOUNT dir_tree
235 	  { $$ = $1; set_disk_fs($$, DF_MOUNT, (char *) $3); }
236 
237 	| fs_info_list tDUMPSET '=' tSTR
238 	  { $$ = $1; set_disk_fs($$, DF_DUMPSET, $4); }
239 
240 	| fs_info_list tLOG '=' tSTR
241 	  { $$ = $1; set_disk_fs($$, DF_LOG, $4); }
242 
243 	| fs_info_list error '=' tSTR
244 	  { yyerror("unknown filesystem attribute"); }
245 	;
246 
247 /*
248  * An automount tree:
249  *
250  * name = "volname"	name is a reference to volname
251  * name -> "string"	name is a link to "string"
252  * name { ... }		name is an automount tree
253  */
254 automount_tree :
255 	  /* empty */
256 	  { $$ = 0; }
257 
258 	| automount_tree tSTR '=' tSTR
259 	  { automount *a = new_automount($2);
260 	    a->a_volname = $4;
261 	    if ($1)
262 		$$ = $1;
263 	    else
264 		$$ = new_que();
265 	    ins_que(&a->a_q, $$->q_back);
266 	  }
267 
268 	| automount_tree tSTR tEQ tSTR
269 	  { automount *a = new_automount($2);
270 	    a->a_symlink = $4;
271 	    if ($1)
272 		$$ = $1;
273 	    else
274 		$$ = new_que();
275 	    ins_que(&a->a_q, $$->q_back);
276 	  }
277 
278 	| automount_tree tSTR '{' automount_tree '}'
279 	  { automount *a = new_automount($2);
280 	    a->a_mount = $4;
281 	    if ($1)
282 		$$ = $1;
283 	    else
284 		$$ = new_que();
285 	    ins_que(&a->a_q, $$->q_back);
286 	  }
287 	;
288 
289 dir_tree :
290 	  /* empty */
291 	  { $$ = 0; }
292 
293 	| dir_tree tSTR '{' dir_tree_info dir_tree '}'
294 	  { $4->m_mount = $5;
295 	    $4->m_name = $2;
296 	    if ($2[0] != '/' && $2[1] && strchr($2+1, '/'))
297 		yyerror("not allowed '/' in a directory name");
298 	    if ($1)
299 		$$ = $1;
300 	    else
301 		$$ = new_que();
302 	    ins_que(&$4->m_q, $$->q_back);
303 	  }
304 	;
305 
306 dir_tree_info :
307 	  /* empty */
308 	  { $$ = new_mount(); }
309 
310 	| dir_tree_info tEXPORTFS tSTR
311 	  { $$ = $1; set_mount($$, DM_EXPORTFS, $3); }
312 
313 	| dir_tree_info tVOLNAME tSTR
314 	  { $$ = $1; set_mount($$, DM_VOLNAME, $3); }
315 
316 	| dir_tree_info tSEL tSTR
317 	  { $$ = $1; set_mount($$, DM_SEL, $3); }
318 
319 	| dir_tree_info error '=' tSTR
320 	  { yyerror("unknown directory attribute"); }
321 	;
322 
323 /*
324  * Additional mounts on a host
325  *
326  * mount "volname" ...
327  */
328 list_of_mounts :
329 	  /* empty */
330 	  { $$ = 0; }
331 
332 	| list_of_mounts tMOUNT tSTR localinfo_list
333 	  { set_fsmount($4, FM_VOLNAME, $3);
334 	    if ($1)
335 		$$ = $1;
336 	    else
337 		$$ = new_que();
338 	    ins_que(&$4->f_q, $$->q_back);
339 	    }
340 	;
341 
342 /*
343  * Mount info:
344  *
345  * from "hostname"	- obtain the object from the named host
346  * as "string"		- where to mount, if different from the volname
347  * opts "string"	- mount options
348  * fstype "type"	- type of filesystem mount, if not nfs
349  */
350 localinfo_list :
351 	  /* empty */
352 	  { $$ = new_fsmount(); }
353 
354 	| localinfo_list tAS tSTR
355 	  { $$ = $1; set_fsmount($$, FM_LOCALNAME, $3); }
356 
357 	| localinfo_list tFROM tSTR
358 	  { $$ = $1; set_fsmount($$, FM_FROM, $3); }
359 
360 	| localinfo_list tFSTYPE tSTR
361 	  { $$ = $1; set_fsmount($$, FM_FSTYPE, $3); }
362 
363 	| localinfo_list tOPTS tSTR
364 	  { $$ = $1; set_fsmount($$, FM_OPTS, $3); }
365 
366 	| localinfo_list error '=' tSTR
367 	  { yyerror("unknown mount attribute"); }
368 	;
369