/* * Copyright (c) 1990 Jan-Simon Pendry * Copyright (c) 1990 Imperial College of Science, Technology & Medicine * Copyright (c) 1990, 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. * * %sccs.include.redist.c% * * @(#)mount_fs.c 8.1 (Berkeley) 06/06/93 * * $Id: mount_fs.c,v 5.2.2.2 1992/05/31 16:35:45 jsp Exp $ * */ #include "am.h" #ifdef NFS_3 typedef nfs_fh fhandle_t; #endif /* NFS_3 */ #include #include /* * Standard mount flags */ #ifdef hpux /* * HP-UX has an annoying feature of printing * error msgs on /dev/console */ #undef M_NOSUID #endif /* hpux */ struct opt_tab mnt_flags[] = { { "ro", M_RDONLY }, #ifdef M_CACHE { "nocache", M_NOCACHE }, #endif /* M_CACHE */ #ifdef M_GRPID { "grpid", M_GRPID }, #endif /* M_GRPID */ #ifdef M_MULTI { "multi", M_MULTI }, #endif /* M_MULTI */ #ifdef M_NODEV { "nodev", M_NODEV }, #endif /* M_NODEV */ #ifdef M_NOEXEC { "noexec", M_NOEXEC }, #endif /* M_NOEXEC */ #ifdef M_NOSUB { "nosub", M_NOSUB }, #endif /* M_NOSUB */ #ifdef M_NOSUID { "nosuid", M_NOSUID }, #endif /* M_NOSUID */ #ifdef M_SYNC { "sync", M_SYNC }, #endif /* M_SYNC */ { 0, 0 } }; int compute_mount_flags(mnt) struct mntent *mnt; { struct opt_tab *opt; int flags; #ifdef NFS_4 flags = M_NEWTYPE; #else flags = 0; #endif /* NFS_4 */ /* * Crack basic mount options */ for (opt = mnt_flags; opt->opt; opt++) flags |= hasmntopt(mnt, opt->opt) ? opt->flag : 0; return flags; } int mount_fs P((struct mntent *mnt, int flags, caddr_t mnt_data, int retry, MTYPE_TYPE type)); int mount_fs(mnt, flags, mnt_data, retry, type) struct mntent *mnt; int flags; caddr_t mnt_data; int retry; MTYPE_TYPE type; { int error = 0; #ifdef MNTINFO_DEV struct stat stb; char *xopts = 0; #endif /* MNTINFO_DEV */ #ifdef DEBUG #ifdef NFS_4 dlog("%s fstype %s (%s) flags %#x (%s)", mnt->mnt_dir, type, mnt->mnt_type, flags, mnt->mnt_opts); #else dlog("%s fstype %d (%s) flags %#x (%s)", mnt->mnt_dir, type, mnt->mnt_type, flags, mnt->mnt_opts); #endif /* NFS_4 */ #endif /* DEBUG */ /* * Fake some mount table entries for the automounter */ #ifdef FASCIST_DF_COMMAND /* * Some systems have a df command which blows up when * presented with an unknown mount type. */ if (STREQ(mnt->mnt_type, MNTTYPE_AUTO)) { /* * Try it with the normal name */ mnt->mnt_type = FASCIST_DF_COMMAND; } #endif /* FASCIST_DF_COMMAND */ again: clock_valid = 0; error = MOUNT_TRAP(type, mnt, flags, mnt_data); if (error < 0) plog(XLOG_ERROR, "%s: mount: %m", mnt->mnt_dir); if (error < 0 && --retry > 0) { sleep(1); goto again; } if (error < 0) { #ifdef notdef if (automount) going_down(errno); #endif return errno; } #ifdef UPDATE_MTAB #ifdef MNTINFO_DEV /* * Add the extra dev= field to the mount table. */ if (lstat(mnt->mnt_dir, &stb) == 0) { char *zopts = (char *) xmalloc(strlen(mnt->mnt_opts) + 32); xopts = mnt->mnt_opts; if (sizeof(stb.st_dev) == 2) { /* e.g. SunOS 4.1 */ sprintf(zopts, "%s,%s=%s%04lx", xopts, MNTINFO_DEV, MNTINFO_PREF, (u_long) stb.st_dev & 0xffff); } else { /* e.g. System Vr4 */ sprintf(zopts, "%s,%s=%s%08lx", xopts, MNTINFO_DEV, MNTINFO_PREF, (u_long) stb.st_dev); } mnt->mnt_opts = zopts; } #endif /* MNTINFO_DEV */ #ifdef FIXUP_MNTENT /* * Additional fields in struct mntent * are fixed up here */ FIXUP_MNTENT(mnt); #endif write_mntent(mnt); #ifdef MNTINFO_DEV if (xopts) { free(mnt->mnt_opts); mnt->mnt_opts = xopts; } #endif /* MNTINFO_DEV */ #endif /* UPDATE_MTAB */ return 0; } #ifdef NEED_MNTOPT_PARSER /* * Some systems don't provide these to the user, * but amd needs them, so... * * From: Piete Brooks */ #include static char *nextmntopt(p) char **p; { char *cp = *p; char *rp; /* * Skip past white space */ while (*cp && isspace(*cp)) cp++; /* * Word starts here */ rp = cp; /* * Scan to send of string or separator */ while (*cp && *cp != ',') cp++; /* * If separator found the overwrite with nul char. */ if (*cp) { *cp = '\0'; cp++; } /* * Return value for next call */ *p = cp; return rp; } char *hasmntopt(mnt, opt) struct mntent *mnt; char *opt; { char t[MNTMAXSTR]; char *f; char *o = t; int l = strlen(opt); strcpy(t, mnt->mnt_opts); while (*(f = nextmntopt(&o))) if (strncmp(opt, f, l) == 0) return f - t + mnt->mnt_opts; return 0; } #endif /* NEED_MNTOPT_PARSER */ #ifdef MOUNT_HELPER_SOURCE #include MOUNT_HELPER_SOURCE #endif /* MOUNT_HELPER_SOURCE */