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 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 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 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 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 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 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 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 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 * 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 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 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 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