138494Sobrien/* 2174294Sobrien * Copyright (c) 1997-2006 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 2042629Sobrien * must display the following acknowledgment: 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 * 40174294Sobrien * File: am-utils/fsinfo/wr_fstab.c 4138494Sobrien * 4238494Sobrien */ 4338494Sobrien 4438494Sobrien#ifdef HAVE_CONFIG_H 4538494Sobrien# include <config.h> 4638494Sobrien#endif /* HAVE_CONFIG_H */ 4738494Sobrien#include <am_defs.h> 4838494Sobrien#include <fsi_data.h> 4938494Sobrien#include <fsinfo.h> 5038494Sobrien 5138494Sobrien#define GENERIC_OS_NAME "generic" 5238494Sobrien 5338494Sobrien/* forward definitions */ 5438494Sobrienstatic void write_aix1_dkfstab(FILE *ef, disk_fs *dp); 5538494Sobrienstatic void write_aix1_dkrmount(FILE *ef, char *hn, fsmount *fp); 5638494Sobrienstatic void write_aix3_dkfstab(FILE *ef, disk_fs *dp); 5738494Sobrienstatic void write_aix3_dkrmount(FILE *ef, char *hn, fsmount *fp); 5838494Sobrienstatic int write_dkfstab(FILE *ef, qelem *q, void (*output) (FILE *, disk_fs *)); 5938494Sobrienstatic int write_dkrmount(FILE *ef, qelem *q, char *hn, void (*output) (FILE *, char *, fsmount *)); 6038494Sobrienstatic void write_generic_dkfstab(FILE *ef, disk_fs *dp); 6138494Sobrienstatic void write_generic_dkrmount(FILE *ef, char *hn, fsmount *fp); 6238494Sobrienstatic void write_ultrix_dkfstab(FILE *ef, disk_fs *dp); 6338494Sobrienstatic void write_ultrix_dkrmount(FILE *ef, char *hn, fsmount *fp); 6438494Sobrien 6538494Sobrien/* ----------------------------------------------- */ 6638494Sobrien 6738494Sobrienstatic struct os_fstab_type { 6838494Sobrien char *os_name; 6938494Sobrien void (*op_fstab) (FILE *ef, disk_fs *dp); 7038494Sobrien void (*op_mount) (FILE *ef, char *hn, fsmount *fp); 7138494Sobrien} os_tabs[] = { 7238494Sobrien 7338494Sobrien { 7438494Sobrien "aix1", write_aix1_dkfstab, write_aix1_dkrmount 7538494Sobrien }, /* AIX 1 */ 7638494Sobrien { 7738494Sobrien "aix3", write_aix3_dkfstab, write_aix3_dkrmount 7838494Sobrien }, /* AIX 3 */ 7938494Sobrien { 8038494Sobrien "generic", write_generic_dkfstab, write_generic_dkrmount 8138494Sobrien }, /* Generic */ 8238494Sobrien { 8338494Sobrien "u2_0", write_ultrix_dkfstab, write_ultrix_dkrmount 8438494Sobrien }, /* Ultrix */ 8538494Sobrien { 8638494Sobrien "u3_0", write_ultrix_dkfstab, write_ultrix_dkrmount 8738494Sobrien }, /* Ultrix */ 8838494Sobrien { 8938494Sobrien "u4_0", write_ultrix_dkfstab, write_ultrix_dkrmount 9038494Sobrien }, /* Ultrix */ 9138494Sobrien { 9238494Sobrien 0, 0, 0 9338494Sobrien } 9438494Sobrien}; 9538494Sobrien 9638494Sobrien 9738494Sobrien/* ---------- AIX 1 ------------------------------ */ 9838494Sobrien 9938494Sobrien/* 10038494Sobrien * AIX 1 format 10138494Sobrien */ 10238494Sobrienstatic void 10338494Sobrienwrite_aix1_dkfstab(FILE *ef, disk_fs *dp) 10438494Sobrien{ 10538494Sobrien char *hp = strdup(dp->d_host->h_hostname); 10638494Sobrien char *p = strchr(hp, '.'); 10738494Sobrien 10838494Sobrien if (p) 10938494Sobrien *p = '\0'; 11038494Sobrien 11138494Sobrien 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", 11238494Sobrien dp->d_mountpt, 11338494Sobrien dp->d_dev, 11438494Sobrien dp->d_fstype, 11538494Sobrien dp->d_fstype, 11638494Sobrien dp->d_log, 11738494Sobrien dp->d_mountpt, 11838494Sobrien dp->d_opts); 11938494Sobrien XFREE(hp); 12038494Sobrien} 12138494Sobrien 12238494Sobrien 12338494Sobrienstatic void 12438494Sobrienwrite_aix1_dkrmount(FILE *ef, char *hn, fsmount *fp) 12538494Sobrien{ 12638494Sobrien char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); 12738494Sobrien char *hp = strdup(h); 12838494Sobrien char *p = strchr(hp, '.'); 12938494Sobrien 13038494Sobrien if (p) 13138494Sobrien *p = '\0'; 13238494Sobrien domain_strip(h, hn); 13338494Sobrien 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", 13438494Sobrien fp->f_localname, 13538494Sobrien hp, 13638494Sobrien h, 13738494Sobrien fp->f_volname, 13838494Sobrien fp->f_fstype, 13938494Sobrien fp->f_fstype, 14038494Sobrien fp->f_localname, 14138494Sobrien fp->f_opts); 14238494Sobrien 14338494Sobrien XFREE(hp); 14438494Sobrien XFREE(h); 14538494Sobrien} 14638494Sobrien 14738494Sobrien 14838494Sobrien/* ---------- AIX 3 ------------------------------ */ 14938494Sobrien 15038494Sobrien/* 15138494Sobrien * AIX 3 format 15238494Sobrien */ 15338494Sobrienstatic void 15438494Sobrienwrite_aix3_dkfstab(FILE *ef, disk_fs *dp) 15538494Sobrien{ 15638494Sobrien if (STREQ(dp->d_fstype, "jfs") && 15738494Sobrien NSTREQ(dp->d_dev, "/dev/", 5) && 15838494Sobrien !dp->d_log) 15938494Sobrien error("aix 3 needs a log device for journalled filesystem (jfs) mounts"); 16038494Sobrien 16138494Sobrien 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", 16238494Sobrien dp->d_mountpt, 16338494Sobrien dp->d_dev, 16438494Sobrien dp->d_fstype, 16538494Sobrien dp->d_fstype, 16638494Sobrien dp->d_log, 16738494Sobrien dp->d_mountpt, 16838494Sobrien dp->d_opts); 16938494Sobrien} 17038494Sobrien 17138494Sobrien 17238494Sobrienstatic void 17338494Sobrienwrite_aix3_dkrmount(FILE *ef, char *hn, fsmount *fp) 17438494Sobrien{ 17538494Sobrien char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); 17638494Sobrien 17738494Sobrien domain_strip(h, hn); 17838494Sobrien 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", 17938494Sobrien fp->f_localname, 18038494Sobrien h, 18138494Sobrien fp->f_volname, 18238494Sobrien fp->f_fstype, 18338494Sobrien fp->f_fstype, 18438494Sobrien fp->f_localname, 18538494Sobrien fp->f_opts); 18638494Sobrien 18738494Sobrien XFREE(h); 18838494Sobrien} 18938494Sobrien 19038494Sobrien 19138494Sobrien/* ---------- Ultrix ----------------------------- */ 19238494Sobrien 19338494Sobrienstatic void 19438494Sobrienwrite_ultrix_dkfstab(FILE *ef, disk_fs *dp) 19538494Sobrien{ 19638494Sobrien fprintf(ef, "%s:%s:%s:%s:%d:%d\n", 19738494Sobrien dp->d_dev, 19838494Sobrien dp->d_mountpt, 19938494Sobrien dp->d_fstype, 20038494Sobrien dp->d_opts, 20138494Sobrien dp->d_freq, 20238494Sobrien dp->d_passno); 20338494Sobrien} 20438494Sobrien 20538494Sobrien 20638494Sobrienstatic void 20738494Sobrienwrite_ultrix_dkrmount(FILE *ef, char *hn, fsmount *fp) 20838494Sobrien{ 20938494Sobrien char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); 21038494Sobrien 21138494Sobrien domain_strip(h, hn); 21238494Sobrien fprintf(ef, "%s@%s:%s:%s:%s:0:0\n", 21338494Sobrien fp->f_volname, 21438494Sobrien h, 21538494Sobrien fp->f_localname, 21638494Sobrien fp->f_fstype, 21738494Sobrien fp->f_opts); 21838494Sobrien XFREE(h); 21938494Sobrien} 22038494Sobrien 22138494Sobrien 22238494Sobrien/* ---------- Generic ---------------------------- */ 22338494Sobrien 22438494Sobrien/* 22538494Sobrien * Generic (BSD, SunOS, HPUX) format 22638494Sobrien */ 22738494Sobrienstatic void 22838494Sobrienwrite_generic_dkfstab(FILE *ef, disk_fs *dp) 22938494Sobrien{ 23038494Sobrien fprintf(ef, "%s %s %s %s %d %d\n", 23138494Sobrien dp->d_dev, 23238494Sobrien dp->d_mountpt, 23338494Sobrien dp->d_fstype, 23438494Sobrien dp->d_opts, 23538494Sobrien dp->d_freq, 23638494Sobrien dp->d_passno); 23738494Sobrien} 23838494Sobrien 23938494Sobrien 24038494Sobrienstatic void 24138494Sobrienwrite_generic_dkrmount(FILE *ef, char *hn, fsmount *fp) 24238494Sobrien{ 24338494Sobrien char *h; 24438494Sobrien 24538494Sobrien if (fp->f_ref) { 24638494Sobrien h = strdup(fp->f_ref->m_dk->d_host->h_hostname); 24738494Sobrien } else { 24838494Sobrien h = strdup(fp->f_from); 24938494Sobrien } 25038494Sobrien domain_strip(h, hn); 25138494Sobrien fprintf(ef, "%s:%s %s %s %s 0 0\n", 25238494Sobrien h, 25338494Sobrien fp->f_volname, 25438494Sobrien fp->f_localname, 25538494Sobrien fp->f_fstype, 25638494Sobrien fp->f_opts); 25738494Sobrien XFREE(h); 25838494Sobrien} 25938494Sobrien 26038494Sobrien 26138494Sobrienstatic struct os_fstab_type * 26238494Sobrienfind_fstab_type(host *hp) 26338494Sobrien{ 26438494Sobrien struct os_fstab_type *op = 0; 26538494Sobrien char *os_name = 0; 26638494Sobrien 26738494Sobrienagain:; 26838494Sobrien if (os_name == 0) { 26938494Sobrien if (ISSET(hp->h_mask, HF_OS)) 27038494Sobrien os_name = hp->h_os; 27138494Sobrien else 27238494Sobrien os_name = GENERIC_OS_NAME; 27338494Sobrien } 27438494Sobrien for (op = os_tabs; op->os_name; op++) 27538494Sobrien if (STREQ(os_name, op->os_name)) 27638494Sobrien return op; 27738494Sobrien 27838494Sobrien os_name = GENERIC_OS_NAME; 27938494Sobrien goto again; 28038494Sobrien} 28138494Sobrien 28238494Sobrien 28338494Sobrienstatic int 28438494Sobrienwrite_dkfstab(FILE *ef, qelem *q, void (*output) (FILE *, disk_fs *)) 28538494Sobrien{ 28638494Sobrien int errors = 0; 28738494Sobrien disk_fs *dp; 28838494Sobrien 28938494Sobrien ITER(dp, disk_fs, q) 29038494Sobrien if (!STREQ(dp->d_fstype, "export")) 29138494Sobrien (*output) (ef, dp); 29238494Sobrien 29338494Sobrien return errors; 29438494Sobrien} 29538494Sobrien 29638494Sobrien 29738494Sobrienstatic int 29838494Sobrienwrite_dkrmount(FILE *ef, qelem *q, char *hn, void (*output) (FILE *, char *, fsmount *)) 29938494Sobrien{ 30038494Sobrien int errors = 0; 30138494Sobrien fsmount *fp; 30238494Sobrien 30338494Sobrien ITER(fp, fsmount, q) 30438494Sobrien (*output) (ef, hn, fp); 30538494Sobrien 30638494Sobrien return errors; 30738494Sobrien} 30838494Sobrien 30938494Sobrien 31038494Sobrienint 31138494Sobrienwrite_fstab(qelem *q) 31238494Sobrien{ 31338494Sobrien int errors = 0; 31438494Sobrien 31538494Sobrien if (fstab_pref) { 31638494Sobrien host *hp; 31738494Sobrien 31838494Sobrien show_area_being_processed("write fstab", 4); 31938494Sobrien ITER(hp, host, q) { 32038494Sobrien if (hp->h_disk_fs || hp->h_mount) { 32138494Sobrien FILE *ef = pref_open(fstab_pref, hp->h_hostname, gen_hdr, hp->h_hostname); 32238494Sobrien if (ef) { 32338494Sobrien struct os_fstab_type *op = find_fstab_type(hp); 32438494Sobrien show_new(hp->h_hostname); 32538494Sobrien if (hp->h_disk_fs) 32638494Sobrien errors += write_dkfstab(ef, hp->h_disk_fs, op->op_fstab); 32738494Sobrien else 328119679Smbr fsi_log("No local disk mounts on %s", hp->h_hostname); 32938494Sobrien 33038494Sobrien if (hp->h_mount) 33138494Sobrien errors += write_dkrmount(ef, hp->h_mount, hp->h_hostname, op->op_mount); 33238494Sobrien 33338494Sobrien pref_close(ef); 33438494Sobrien } 33538494Sobrien } else { 33638494Sobrien error("no disk mounts on %s", hp->h_hostname); 33738494Sobrien } 33838494Sobrien } 33938494Sobrien } 34038494Sobrien return errors; 34138494Sobrien} 342