wr_fstab.c revision 38494
138494Sobrien/* 238494Sobrien * Copyright (c) 1997-1998 Erez Zadok 338494Sobrien * Copyright (c) 1989 Jan-Simon Pendry 438494Sobrien * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 538494Sobrien * Copyright (c) 1989 The Regents of the University of California. 638494Sobrien * All rights reserved. 738494Sobrien * 838494Sobrien * This code is derived from software contributed to Berkeley by 938494Sobrien * Jan-Simon Pendry at Imperial College, London. 1038494Sobrien * 1138494Sobrien * Redistribution and use in source and binary forms, with or without 1238494Sobrien * modification, are permitted provided that the following conditions 1338494Sobrien * are met: 1438494Sobrien * 1. Redistributions of source code must retain the above copyright 1538494Sobrien * notice, this list of conditions and the following disclaimer. 1638494Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1738494Sobrien * notice, this list of conditions and the following disclaimer in the 1838494Sobrien * documentation and/or other materials provided with the distribution. 1938494Sobrien * 3. All advertising materials mentioning features or use of this software 2038494Sobrien * must display the following acknowledgement: 2138494Sobrien * This product includes software developed by the University of 2238494Sobrien * California, Berkeley and its contributors. 2338494Sobrien * 4. Neither the name of the University nor the names of its contributors 2438494Sobrien * may be used to endorse or promote products derived from this software 2538494Sobrien * without specific prior written permission. 2638494Sobrien * 2738494Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2838494Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2938494Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 3038494Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 3138494Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3238494Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3338494Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3438494Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3538494Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3638494Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3738494Sobrien * SUCH DAMAGE. 3838494Sobrien * 3938494Sobrien * %W% (Berkeley) %G% 4038494Sobrien * 4138494Sobrien * $Id: wr_fstab.c,v 5.2.2.1 1992/02/09 15:09:49 jsp beta $ 4238494Sobrien * 4338494Sobrien */ 4438494Sobrien 4538494Sobrien#ifdef HAVE_CONFIG_H 4638494Sobrien# include <config.h> 4738494Sobrien#endif /* HAVE_CONFIG_H */ 4838494Sobrien#include <am_defs.h> 4938494Sobrien#include <fsi_data.h> 5038494Sobrien#include <fsinfo.h> 5138494Sobrien 5238494Sobrien#define GENERIC_OS_NAME "generic" 5338494Sobrien 5438494Sobrien/* forward definitions */ 5538494Sobrienstatic void write_aix1_dkfstab(FILE *ef, disk_fs *dp); 5638494Sobrienstatic void write_aix1_dkrmount(FILE *ef, char *hn, fsmount *fp); 5738494Sobrienstatic void write_aix3_dkfstab(FILE *ef, disk_fs *dp); 5838494Sobrienstatic void write_aix3_dkrmount(FILE *ef, char *hn, fsmount *fp); 5938494Sobrienstatic int write_dkfstab(FILE *ef, qelem *q, void (*output) (FILE *, disk_fs *)); 6038494Sobrienstatic int write_dkrmount(FILE *ef, qelem *q, char *hn, void (*output) (FILE *, char *, fsmount *)); 6138494Sobrienstatic void write_generic_dkfstab(FILE *ef, disk_fs *dp); 6238494Sobrienstatic void write_generic_dkrmount(FILE *ef, char *hn, fsmount *fp); 6338494Sobrienstatic void write_ultrix_dkfstab(FILE *ef, disk_fs *dp); 6438494Sobrienstatic void write_ultrix_dkrmount(FILE *ef, char *hn, fsmount *fp); 6538494Sobrien 6638494Sobrien/* ----------------------------------------------- */ 6738494Sobrien 6838494Sobrienstatic struct os_fstab_type { 6938494Sobrien char *os_name; 7038494Sobrien void (*op_fstab) (FILE *ef, disk_fs *dp); 7138494Sobrien void (*op_mount) (FILE *ef, char *hn, fsmount *fp); 7238494Sobrien} os_tabs[] = { 7338494Sobrien 7438494Sobrien { 7538494Sobrien "aix1", write_aix1_dkfstab, write_aix1_dkrmount 7638494Sobrien }, /* AIX 1 */ 7738494Sobrien { 7838494Sobrien "aix3", write_aix3_dkfstab, write_aix3_dkrmount 7938494Sobrien }, /* AIX 3 */ 8038494Sobrien { 8138494Sobrien "generic", write_generic_dkfstab, write_generic_dkrmount 8238494Sobrien }, /* Generic */ 8338494Sobrien { 8438494Sobrien "u2_0", write_ultrix_dkfstab, write_ultrix_dkrmount 8538494Sobrien }, /* Ultrix */ 8638494Sobrien { 8738494Sobrien "u3_0", write_ultrix_dkfstab, write_ultrix_dkrmount 8838494Sobrien }, /* Ultrix */ 8938494Sobrien { 9038494Sobrien "u4_0", write_ultrix_dkfstab, write_ultrix_dkrmount 9138494Sobrien }, /* Ultrix */ 9238494Sobrien { 9338494Sobrien 0, 0, 0 9438494Sobrien } 9538494Sobrien}; 9638494Sobrien 9738494Sobrien 9838494Sobrien/* ---------- AIX 1 ------------------------------ */ 9938494Sobrien 10038494Sobrien/* 10138494Sobrien * AIX 1 format 10238494Sobrien */ 10338494Sobrienstatic void 10438494Sobrienwrite_aix1_dkfstab(FILE *ef, disk_fs *dp) 10538494Sobrien{ 10638494Sobrien char *hp = strdup(dp->d_host->h_hostname); 10738494Sobrien char *p = strchr(hp, '.'); 10838494Sobrien 10938494Sobrien if (p) 11038494Sobrien *p = '\0'; 11138494Sobrien 11238494Sobrien 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", 11338494Sobrien dp->d_mountpt, 11438494Sobrien dp->d_dev, 11538494Sobrien dp->d_fstype, 11638494Sobrien dp->d_fstype, 11738494Sobrien dp->d_log, 11838494Sobrien dp->d_mountpt, 11938494Sobrien dp->d_opts); 12038494Sobrien XFREE(hp); 12138494Sobrien} 12238494Sobrien 12338494Sobrien 12438494Sobrienstatic void 12538494Sobrienwrite_aix1_dkrmount(FILE *ef, char *hn, fsmount *fp) 12638494Sobrien{ 12738494Sobrien char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); 12838494Sobrien char *hp = strdup(h); 12938494Sobrien char *p = strchr(hp, '.'); 13038494Sobrien 13138494Sobrien if (p) 13238494Sobrien *p = '\0'; 13338494Sobrien domain_strip(h, hn); 13438494Sobrien 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", 13538494Sobrien fp->f_localname, 13638494Sobrien hp, 13738494Sobrien h, 13838494Sobrien fp->f_volname, 13938494Sobrien fp->f_fstype, 14038494Sobrien fp->f_fstype, 14138494Sobrien fp->f_localname, 14238494Sobrien fp->f_opts); 14338494Sobrien 14438494Sobrien XFREE(hp); 14538494Sobrien XFREE(h); 14638494Sobrien} 14738494Sobrien 14838494Sobrien 14938494Sobrien/* ---------- AIX 3 ------------------------------ */ 15038494Sobrien 15138494Sobrien/* 15238494Sobrien * AIX 3 format 15338494Sobrien */ 15438494Sobrienstatic void 15538494Sobrienwrite_aix3_dkfstab(FILE *ef, disk_fs *dp) 15638494Sobrien{ 15738494Sobrien if (STREQ(dp->d_fstype, "jfs") && 15838494Sobrien NSTREQ(dp->d_dev, "/dev/", 5) && 15938494Sobrien !dp->d_log) 16038494Sobrien error("aix 3 needs a log device for journalled filesystem (jfs) mounts"); 16138494Sobrien 16238494Sobrien 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", 16338494Sobrien dp->d_mountpt, 16438494Sobrien dp->d_dev, 16538494Sobrien dp->d_fstype, 16638494Sobrien dp->d_fstype, 16738494Sobrien dp->d_log, 16838494Sobrien dp->d_mountpt, 16938494Sobrien dp->d_opts); 17038494Sobrien} 17138494Sobrien 17238494Sobrien 17338494Sobrienstatic void 17438494Sobrienwrite_aix3_dkrmount(FILE *ef, char *hn, fsmount *fp) 17538494Sobrien{ 17638494Sobrien char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); 17738494Sobrien 17838494Sobrien domain_strip(h, hn); 17938494Sobrien 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", 18038494Sobrien fp->f_localname, 18138494Sobrien h, 18238494Sobrien fp->f_volname, 18338494Sobrien fp->f_fstype, 18438494Sobrien fp->f_fstype, 18538494Sobrien fp->f_localname, 18638494Sobrien fp->f_opts); 18738494Sobrien 18838494Sobrien XFREE(h); 18938494Sobrien} 19038494Sobrien 19138494Sobrien 19238494Sobrien/* ---------- Ultrix ----------------------------- */ 19338494Sobrien 19438494Sobrienstatic void 19538494Sobrienwrite_ultrix_dkfstab(FILE *ef, disk_fs *dp) 19638494Sobrien{ 19738494Sobrien fprintf(ef, "%s:%s:%s:%s:%d:%d\n", 19838494Sobrien dp->d_dev, 19938494Sobrien dp->d_mountpt, 20038494Sobrien dp->d_fstype, 20138494Sobrien dp->d_opts, 20238494Sobrien dp->d_freq, 20338494Sobrien dp->d_passno); 20438494Sobrien} 20538494Sobrien 20638494Sobrien 20738494Sobrienstatic void 20838494Sobrienwrite_ultrix_dkrmount(FILE *ef, char *hn, fsmount *fp) 20938494Sobrien{ 21038494Sobrien char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); 21138494Sobrien 21238494Sobrien domain_strip(h, hn); 21338494Sobrien fprintf(ef, "%s@%s:%s:%s:%s:0:0\n", 21438494Sobrien fp->f_volname, 21538494Sobrien h, 21638494Sobrien fp->f_localname, 21738494Sobrien fp->f_fstype, 21838494Sobrien fp->f_opts); 21938494Sobrien XFREE(h); 22038494Sobrien} 22138494Sobrien 22238494Sobrien 22338494Sobrien/* ---------- Generic ---------------------------- */ 22438494Sobrien 22538494Sobrien/* 22638494Sobrien * Generic (BSD, SunOS, HPUX) format 22738494Sobrien */ 22838494Sobrienstatic void 22938494Sobrienwrite_generic_dkfstab(FILE *ef, disk_fs *dp) 23038494Sobrien{ 23138494Sobrien fprintf(ef, "%s %s %s %s %d %d\n", 23238494Sobrien dp->d_dev, 23338494Sobrien dp->d_mountpt, 23438494Sobrien dp->d_fstype, 23538494Sobrien dp->d_opts, 23638494Sobrien dp->d_freq, 23738494Sobrien dp->d_passno); 23838494Sobrien} 23938494Sobrien 24038494Sobrien 24138494Sobrienstatic void 24238494Sobrienwrite_generic_dkrmount(FILE *ef, char *hn, fsmount *fp) 24338494Sobrien{ 24438494Sobrien char *h; 24538494Sobrien 24638494Sobrien if (fp->f_ref) { 24738494Sobrien h = strdup(fp->f_ref->m_dk->d_host->h_hostname); 24838494Sobrien } else { 24938494Sobrien h = strdup(fp->f_from); 25038494Sobrien } 25138494Sobrien domain_strip(h, hn); 25238494Sobrien fprintf(ef, "%s:%s %s %s %s 0 0\n", 25338494Sobrien h, 25438494Sobrien fp->f_volname, 25538494Sobrien fp->f_localname, 25638494Sobrien fp->f_fstype, 25738494Sobrien fp->f_opts); 25838494Sobrien XFREE(h); 25938494Sobrien} 26038494Sobrien 26138494Sobrien 26238494Sobrienstatic struct os_fstab_type * 26338494Sobrienfind_fstab_type(host *hp) 26438494Sobrien{ 26538494Sobrien struct os_fstab_type *op = 0; 26638494Sobrien char *os_name = 0; 26738494Sobrien 26838494Sobrienagain:; 26938494Sobrien if (os_name == 0) { 27038494Sobrien if (ISSET(hp->h_mask, HF_OS)) 27138494Sobrien os_name = hp->h_os; 27238494Sobrien else 27338494Sobrien os_name = GENERIC_OS_NAME; 27438494Sobrien } 27538494Sobrien for (op = os_tabs; op->os_name; op++) 27638494Sobrien if (STREQ(os_name, op->os_name)) 27738494Sobrien return op; 27838494Sobrien 27938494Sobrien os_name = GENERIC_OS_NAME; 28038494Sobrien goto again; 28138494Sobrien} 28238494Sobrien 28338494Sobrien 28438494Sobrienstatic int 28538494Sobrienwrite_dkfstab(FILE *ef, qelem *q, void (*output) (FILE *, disk_fs *)) 28638494Sobrien{ 28738494Sobrien int errors = 0; 28838494Sobrien disk_fs *dp; 28938494Sobrien 29038494Sobrien ITER(dp, disk_fs, q) 29138494Sobrien if (!STREQ(dp->d_fstype, "export")) 29238494Sobrien (*output) (ef, dp); 29338494Sobrien 29438494Sobrien return errors; 29538494Sobrien} 29638494Sobrien 29738494Sobrien 29838494Sobrienstatic int 29938494Sobrienwrite_dkrmount(FILE *ef, qelem *q, char *hn, void (*output) (FILE *, char *, fsmount *)) 30038494Sobrien{ 30138494Sobrien int errors = 0; 30238494Sobrien fsmount *fp; 30338494Sobrien 30438494Sobrien ITER(fp, fsmount, q) 30538494Sobrien (*output) (ef, hn, fp); 30638494Sobrien 30738494Sobrien return errors; 30838494Sobrien} 30938494Sobrien 31038494Sobrien 31138494Sobrienint 31238494Sobrienwrite_fstab(qelem *q) 31338494Sobrien{ 31438494Sobrien int errors = 0; 31538494Sobrien 31638494Sobrien if (fstab_pref) { 31738494Sobrien host *hp; 31838494Sobrien 31938494Sobrien show_area_being_processed("write fstab", 4); 32038494Sobrien ITER(hp, host, q) { 32138494Sobrien if (hp->h_disk_fs || hp->h_mount) { 32238494Sobrien FILE *ef = pref_open(fstab_pref, hp->h_hostname, gen_hdr, hp->h_hostname); 32338494Sobrien if (ef) { 32438494Sobrien struct os_fstab_type *op = find_fstab_type(hp); 32538494Sobrien show_new(hp->h_hostname); 32638494Sobrien if (hp->h_disk_fs) 32738494Sobrien errors += write_dkfstab(ef, hp->h_disk_fs, op->op_fstab); 32838494Sobrien else 32938494Sobrien log("No local disk mounts on %s", hp->h_hostname); 33038494Sobrien 33138494Sobrien if (hp->h_mount) 33238494Sobrien errors += write_dkrmount(ef, hp->h_mount, hp->h_hostname, op->op_mount); 33338494Sobrien 33438494Sobrien pref_close(ef); 33538494Sobrien } 33638494Sobrien } else { 33738494Sobrien error("no disk mounts on %s", hp->h_hostname); 33838494Sobrien } 33938494Sobrien } 34038494Sobrien } 34138494Sobrien return errors; 34238494Sobrien} 343