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