diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
commit | d6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch) | |
tree | ece253b876159b39c620e62b6c9b1174642e070e /usr.sbin/amd/fsinfo/wr_fstab.c |
initial import of NetBSD tree
Diffstat (limited to 'usr.sbin/amd/fsinfo/wr_fstab.c')
-rw-r--r-- | usr.sbin/amd/fsinfo/wr_fstab.c | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/usr.sbin/amd/fsinfo/wr_fstab.c b/usr.sbin/amd/fsinfo/wr_fstab.c new file mode 100644 index 00000000000..d28d6e84ec6 --- /dev/null +++ b/usr.sbin/amd/fsinfo/wr_fstab.c @@ -0,0 +1,301 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)wr_fstab.c 8.1 (Berkeley) 6/6/93 + * $Id: wr_fstab.c,v 1.1 1995/10/18 08:47:19 deraadt Exp $ + */ + +#include "../fsinfo/fsinfo.h" + +/* ---------- AIX 1 ------------------------------ */ + +/* + * AIX 1 format + */ +static void write_aix1_dkfstab(ef, dp) +FILE *ef; +disk_fs *dp; +{ + char *hp = strdup(dp->d_host->h_hostname); + char *p = strchr(hp, '.'); + if (p) + *p = '\0'; + + 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", + dp->d_mountpt, + dp->d_dev, + dp->d_fstype, + dp->d_fstype, + dp->d_log, + dp->d_mountpt, + dp->d_opts); + free(hp); +} + +static void write_aix1_dkrmount(ef, hn, fp) +FILE *ef; +char *hn; +fsmount *fp; +{ + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + char *hp = strdup(h); + char *p = strchr(hp, '.'); + if (p) + *p = '\0'; + domain_strip(h, hn); + 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", + fp->f_localname, + hp, + h, + fp->f_volname, + fp->f_fstype, + fp->f_fstype, + fp->f_localname, + fp->f_opts); + + free(hp); + free(h); +} + +/* ---------- AIX 3 ------------------------------ */ + +/* + * AIX 3 format + */ +static void write_aix3_dkfstab(ef, dp) +FILE *ef; +disk_fs *dp; +{ + if (strcmp(dp->d_fstype, "jfs") == 0 && strncmp(dp->d_dev, "/dev/", 5) == 0 && !dp->d_log) + error("aix 3 needs a log device for journalled filesystem (jfs) mounts"); + + 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", + dp->d_mountpt, + dp->d_dev, + dp->d_fstype, + dp->d_fstype, + dp->d_log, + dp->d_mountpt, + dp->d_opts); +} + +static void write_aix3_dkrmount(ef, hn, fp) +FILE *ef; +char *hn; +fsmount *fp; +{ + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + domain_strip(h, hn); + 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", + fp->f_localname, + h, + fp->f_volname, + fp->f_fstype, + fp->f_fstype, + fp->f_localname, + fp->f_opts); + + free(h); +} + +/* ---------- Ultrix ----------------------------- */ + +static void write_ultrix_dkfstab(ef, dp) +FILE *ef; +disk_fs *dp; +{ + fprintf(ef, "%s:%s:%s:%s:%d:%d\n", + dp->d_dev, + dp->d_mountpt, + dp->d_fstype, + dp->d_opts, + dp->d_freq, + dp->d_passno); +} + +static void write_ultrix_dkrmount(ef, hn, fp) +FILE *ef; +char *hn; +fsmount *fp; +{ + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + domain_strip(h, hn); + fprintf(ef, "%s@%s:%s:%s:%s:0:0\n", + fp->f_volname, + h, + fp->f_localname, + fp->f_fstype, + fp->f_opts); + free(h); +} + +/* ---------- Generic ---------------------------- */ + +/* + * Generic (BSD, SunOS, HPUX) format + */ +static void write_generic_dkfstab(ef, dp) +FILE *ef; +disk_fs *dp; +{ + fprintf(ef, "%s %s %s %s %d %d\n", + dp->d_dev, + dp->d_mountpt, + dp->d_fstype, + dp->d_opts, + dp->d_freq, + dp->d_passno); +} + +static void write_generic_dkrmount(ef, hn, fp) +FILE *ef; +char *hn; +fsmount *fp; +{ + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + domain_strip(h, hn); + fprintf(ef, "%s:%s %s %s %s 0 0\n", + h, + fp->f_volname, + fp->f_localname, + fp->f_fstype, + fp->f_opts); + free(h); +} + +/* ----------------------------------------------- */ + +static struct os_fstab_type { + char *os_name; + void (*op_fstab)(); + void (*op_mount)(); +} os_tabs[] = { + { "aix1", write_aix1_dkfstab, write_aix1_dkrmount }, /* AIX 1 */ + { "aix3", write_aix3_dkfstab, write_aix3_dkrmount }, /* AIX 3 */ + { "generic", write_generic_dkfstab, write_generic_dkrmount }, /* Generic */ + { "u2_0", write_ultrix_dkfstab, write_ultrix_dkrmount }, /* Ultrix */ + { "u3_0", write_ultrix_dkfstab, write_ultrix_dkrmount }, /* Ultrix */ + { "u4_0", write_ultrix_dkfstab, write_ultrix_dkrmount }, /* Ultrix */ + { 0, 0, 0 } +}; + +#define GENERIC_OS_NAME "generic" + +static struct os_fstab_type *find_fstab_type(hp) +host *hp; +{ + struct os_fstab_type *op = 0; + char *os_name = 0; + +again:; + if (os_name == 0) { + if (ISSET(hp->h_mask, HF_OS)) + os_name = hp->h_os; + else + os_name = GENERIC_OS_NAME; + } + + for (op = os_tabs; op->os_name; op++) + if (strcmp(os_name, op->os_name) == 0) + return op; + + os_name = GENERIC_OS_NAME; + goto again; +} + +static int write_dkfstab(ef, q, output) +FILE *ef; +qelem *q; +void (*output)(); +{ + int errors = 0; + disk_fs *dp; + + ITER(dp, disk_fs, q) + if (strcmp(dp->d_fstype, "export") != 0) + (*output)(ef, dp); + + return errors; +} + +static int write_dkrmount(ef, q, hn, output) +FILE *ef; +qelem *q; +char *hn; +void (*output)(); +{ + int errors = 0; + fsmount *fp; + + ITER(fp, fsmount, q) + (*output)(ef, hn, fp); + + return errors; +} + +int write_fstab(q) +qelem *q; +{ + int errors = 0; + + if (fstab_pref) { + host *hp; + show_area_being_processed("write fstab", 4); + ITER(hp, host, q) { + if (hp->h_disk_fs || hp->h_mount) { + FILE *ef = pref_open(fstab_pref, hp->h_hostname, gen_hdr, hp->h_hostname); + if (ef) { + struct os_fstab_type *op = find_fstab_type(hp); + show_new(hp->h_hostname); + if (hp->h_disk_fs) + errors += write_dkfstab(ef, hp->h_disk_fs, op->op_fstab); + else + log("No local disk mounts on %s", hp->h_hostname); + + if (hp->h_mount) + errors += write_dkrmount(ef, hp->h_mount, hp->h_hostname, op->op_mount); + + pref_close(ef); + } + } else { + error("no disk mounts on %s", hp->h_hostname); + } + } + } + + return errors; +} |