xref: /netbsd-src/external/bsd/am-utils/dist/fsinfo/wr_fstab.c (revision 8bae5d409deb915cf7c8f0539fae22ff2cb8a313)
1 /*	$NetBSD: wr_fstab.c,v 1.1.1.3 2015/01/17 16:34:17 christos Exp $	*/
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/wr_fstab.c
39  *
40  */
41 
42 #ifdef HAVE_CONFIG_H
43 # include <config.h>
44 #endif /* HAVE_CONFIG_H */
45 #include <am_defs.h>
46 #include <fsi_data.h>
47 #include <fsinfo.h>
48 
49 #define	GENERIC_OS_NAME "generic"
50 
51 /* forward definitions */
52 static void write_aix1_dkfstab(FILE *ef, disk_fs *dp);
53 static void write_aix1_dkrmount(FILE *ef, char *hn, fsmount *fp);
54 static void write_aix3_dkfstab(FILE *ef, disk_fs *dp);
55 static void write_aix3_dkrmount(FILE *ef, char *hn, fsmount *fp);
56 static int  write_dkfstab(FILE *ef, qelem *q, void (*output) (FILE *, disk_fs *));
57 static int write_dkrmount(FILE *ef, qelem *q, char *hn, void (*output) (FILE *, char *, fsmount *));
58 static void write_generic_dkfstab(FILE *ef, disk_fs *dp);
59 static void write_generic_dkrmount(FILE *ef, char *hn, fsmount *fp);
60 static void write_ultrix_dkfstab(FILE *ef, disk_fs *dp);
61 static void write_ultrix_dkrmount(FILE *ef, char *hn, fsmount *fp);
62 
63 /* ----------------------------------------------- */
64 
65 static struct os_fstab_type {
66   char *os_name;
67   void (*op_fstab) (FILE *ef, disk_fs *dp);
68   void (*op_mount) (FILE *ef, char *hn, fsmount *fp);
69 } os_tabs[] = {
70 
71   {
72     "aix1", write_aix1_dkfstab, write_aix1_dkrmount
73   },				/* AIX 1 */
74   {
75     "aix3", write_aix3_dkfstab, write_aix3_dkrmount
76   },				/* AIX 3 */
77   {
78     "generic", write_generic_dkfstab, write_generic_dkrmount
79   },				/* Generic */
80   {
81     "u2_0", write_ultrix_dkfstab, write_ultrix_dkrmount
82   },				/* Ultrix */
83   {
84     "u3_0", write_ultrix_dkfstab, write_ultrix_dkrmount
85   },				/* Ultrix */
86   {
87     "u4_0", write_ultrix_dkfstab, write_ultrix_dkrmount
88   },				/* Ultrix */
89   {
90     NULL, NULL, NULL
91   }
92 };
93 
94 
95 /* ---------- AIX 1 ------------------------------ */
96 
97 /*
98  * AIX 1 format
99  */
100 static void
write_aix1_dkfstab(FILE * ef,disk_fs * dp)101 write_aix1_dkfstab(FILE *ef, disk_fs *dp)
102 {
103   char *hp = xstrdup(dp->d_host->h_hostname);
104   char *p = strchr(hp, '.');
105 
106   if (p)
107     *p = '\0';
108 
109   fprintf(ef, "\n%s:\n\tdev = %s\n\tvfs = %s\n\ttype = %s\n\tlog = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n",
110 	  dp->d_mountpt,
111 	  dp->d_dev,
112 	  dp->d_fstype,
113 	  dp->d_fstype,
114 	  dp->d_log,
115 	  dp->d_mountpt,
116 	  dp->d_opts);
117   XFREE(hp);
118 }
119 
120 
121 static void
write_aix1_dkrmount(FILE * ef,char * hn,fsmount * fp)122 write_aix1_dkrmount(FILE *ef, char *hn, fsmount *fp)
123 {
124   char *h = xstrdup(fp->f_ref->m_dk->d_host->h_hostname);
125   char *hp = xstrdup(h);
126   char *p = strchr(hp, '.');
127 
128   if (p)
129     *p = '\0';
130   domain_strip(h, hn);
131   fprintf(ef, "\n%s:\n\tsite = %s\n\tdev = %s:%s\n\tvfs = %s\n\ttype = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n",
132 	  fp->f_localname,
133 	  hp,
134 	  h,
135 	  fp->f_volname,
136 	  fp->f_fstype,
137 	  fp->f_fstype,
138 	  fp->f_localname,
139 	  fp->f_opts);
140 
141   XFREE(hp);
142   XFREE(h);
143 }
144 
145 
146 /* ---------- AIX 3 ------------------------------ */
147 
148 /*
149  * AIX 3 format
150  */
151 static void
write_aix3_dkfstab(FILE * ef,disk_fs * dp)152 write_aix3_dkfstab(FILE *ef, disk_fs *dp)
153 {
154   if (STREQ(dp->d_fstype, "jfs") &&
155       NSTREQ(dp->d_dev, "/dev/", 5) &&
156       !dp->d_log)
157     error("aix 3 needs a log device for journalled filesystem (jfs) mounts");
158 
159   fprintf(ef, "\n%s:\n\tdev = %s\n\tvfs = %s\n\ttype = %s\n\tlog = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n",
160 	  dp->d_mountpt,
161 	  dp->d_dev,
162 	  dp->d_fstype,
163 	  dp->d_fstype,
164 	  dp->d_log,
165 	  dp->d_mountpt,
166 	  dp->d_opts);
167 }
168 
169 
170 static void
write_aix3_dkrmount(FILE * ef,char * hn,fsmount * fp)171 write_aix3_dkrmount(FILE *ef, char *hn, fsmount *fp)
172 {
173   char *h = xstrdup(fp->f_ref->m_dk->d_host->h_hostname);
174 
175   domain_strip(h, hn);
176   fprintf(ef, "\n%s:\n\tdev = %s:%s\n\tvfs = %s\n\ttype = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n",
177 	  fp->f_localname,
178 	  h,
179 	  fp->f_volname,
180 	  fp->f_fstype,
181 	  fp->f_fstype,
182 	  fp->f_localname,
183 	  fp->f_opts);
184 
185   XFREE(h);
186 }
187 
188 
189 /* ---------- Ultrix ----------------------------- */
190 
191 static void
write_ultrix_dkfstab(FILE * ef,disk_fs * dp)192 write_ultrix_dkfstab(FILE *ef, disk_fs *dp)
193 {
194   fprintf(ef, "%s:%s:%s:%s:%d:%d\n",
195 	  dp->d_dev,
196 	  dp->d_mountpt,
197 	  dp->d_fstype,
198 	  dp->d_opts,
199 	  dp->d_freq,
200 	  dp->d_passno);
201 }
202 
203 
204 static void
write_ultrix_dkrmount(FILE * ef,char * hn,fsmount * fp)205 write_ultrix_dkrmount(FILE *ef, char *hn, fsmount *fp)
206 {
207   char *h = xstrdup(fp->f_ref->m_dk->d_host->h_hostname);
208 
209   domain_strip(h, hn);
210   fprintf(ef, "%s@%s:%s:%s:%s:0:0\n",
211 	  fp->f_volname,
212 	  h,
213 	  fp->f_localname,
214 	  fp->f_fstype,
215 	  fp->f_opts);
216   XFREE(h);
217 }
218 
219 
220 /* ---------- Generic ---------------------------- */
221 
222 /*
223  * Generic (BSD, SunOS, HPUX) format
224  */
225 static void
write_generic_dkfstab(FILE * ef,disk_fs * dp)226 write_generic_dkfstab(FILE *ef, disk_fs *dp)
227 {
228   fprintf(ef, "%s %s %s %s %d %d\n",
229 	  dp->d_dev,
230 	  dp->d_mountpt,
231 	  dp->d_fstype,
232 	  dp->d_opts,
233 	  dp->d_freq,
234 	  dp->d_passno);
235 }
236 
237 
238 static void
write_generic_dkrmount(FILE * ef,char * hn,fsmount * fp)239 write_generic_dkrmount(FILE *ef, char *hn, fsmount *fp)
240 {
241   char *h;
242 
243   if (fp->f_ref) {
244     h = xstrdup(fp->f_ref->m_dk->d_host->h_hostname);
245   } else {
246     h = xstrdup(fp->f_from);
247   }
248   domain_strip(h, hn);
249   fprintf(ef, "%s:%s %s %s %s 0 0\n",
250 	  h,
251 	  fp->f_volname,
252 	  fp->f_localname,
253 	  fp->f_fstype,
254 	  fp->f_opts);
255   XFREE(h);
256 }
257 
258 
259 static struct os_fstab_type *
find_fstab_type(host * hp)260 find_fstab_type(host *hp)
261 {
262   struct os_fstab_type *op = NULL;
263   char *os_name = NULL;
264 
265 again:;
266   if (os_name == 0) {
267     if (ISSET(hp->h_mask, HF_OS))
268       os_name = hp->h_os;
269     else
270       os_name = GENERIC_OS_NAME;
271   }
272   for (op = os_tabs; op->os_name; op++)
273     if (STREQ(os_name, op->os_name))
274       return op;
275 
276   os_name = GENERIC_OS_NAME;
277   goto again;
278 }
279 
280 
281 static int
write_dkfstab(FILE * ef,qelem * q,void (* output)(FILE *,disk_fs *))282 write_dkfstab(FILE *ef, qelem *q, void (*output) (FILE *, disk_fs *))
283 {
284   int errors = 0;
285   disk_fs *dp;
286 
287   ITER(dp, disk_fs, q)
288   if (!STREQ(dp->d_fstype, "export"))
289       (*output) (ef, dp);
290 
291   return errors;
292 }
293 
294 
295 static int
write_dkrmount(FILE * ef,qelem * q,char * hn,void (* output)(FILE *,char *,fsmount *))296 write_dkrmount(FILE *ef, qelem *q, char *hn, void (*output) (FILE *, char *, fsmount *))
297 {
298   int errors = 0;
299   fsmount *fp;
300 
301   ITER(fp, fsmount, q)
302     (*output) (ef, hn, fp);
303 
304   return errors;
305 }
306 
307 
308 int
write_fstab(qelem * q)309 write_fstab(qelem *q)
310 {
311   int errors = 0;
312 
313   if (fstab_pref) {
314     host *hp;
315 
316     show_area_being_processed("write fstab", 4);
317     ITER(hp, host, q) {
318       if (hp->h_disk_fs || hp->h_mount) {
319 	FILE *ef = pref_open(fstab_pref, hp->h_hostname, gen_hdr, hp->h_hostname);
320 	if (ef) {
321 	  struct os_fstab_type *op = find_fstab_type(hp);
322 	  show_new(hp->h_hostname);
323 	  if (hp->h_disk_fs)
324 	    errors += write_dkfstab(ef, hp->h_disk_fs, op->op_fstab);
325 	  else
326 	    fsi_log("No local disk mounts on %s", hp->h_hostname);
327 
328 	  if (hp->h_mount)
329 	    errors += write_dkrmount(ef, hp->h_mount, hp->h_hostname, op->op_mount);
330 
331 	  pref_close(ef);
332 	}
333       } else {
334 	error("no disk mounts on %s", hp->h_hostname);
335       }
336     }
337   }
338   return errors;
339 }
340