/etc/rc: use mount -a instead of manual parsing
The rc script manually parses /etc/fstab to mount all file systems. To do that it needs /bin/sed which does not exist anymore. mount(8) now supports the -a flag which causes it to mount all file systems listed in /etc/fstab except for '/'. File systems marked with 'noauto' are skipped.
This commit is contained in:
		
							parent
							
								
									eecd451343
								
							
						
					
					
						commit
						6759b24c57
					
				@ -15,24 +15,27 @@
 | 
			
		||||
#include <sys/svrctl.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "mfs/const.h"
 | 
			
		||||
#include <fstab.h>
 | 
			
		||||
 | 
			
		||||
#define MINIX_FS_TYPE "mfs"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv);
 | 
			
		||||
void list(void);
 | 
			
		||||
void usage(void);
 | 
			
		||||
void update_mtab(char *dev, char *mountpoint, char *fstype, int mountflags);
 | 
			
		||||
int mount_all(void);
 | 
			
		||||
 | 
			
		||||
static int write_mtab = 1;
 | 
			
		||||
 | 
			
		||||
int main(argc, argv)
 | 
			
		||||
int argc;
 | 
			
		||||
char *argv[];
 | 
			
		||||
{
 | 
			
		||||
  int i, n, v = 0, mountflags, write_mtab;
 | 
			
		||||
  char **ap, *vs, *opt, *err, *type, *args, *device;
 | 
			
		||||
  char special[PATH_MAX], mounted_on[PATH_MAX], version[10], rw_flag[10];
 | 
			
		||||
  int all = 0, i, v = 0, mountflags;
 | 
			
		||||
  char **ap, *opt, *err, *type, *args, *device;
 | 
			
		||||
 | 
			
		||||
  if (argc == 1) list();	/* just list /etc/mtab */
 | 
			
		||||
  mountflags = 0;
 | 
			
		||||
  write_mtab = 1;
 | 
			
		||||
  type = NULL;
 | 
			
		||||
  args = NULL;
 | 
			
		||||
  ap = argv+1;
 | 
			
		||||
@ -50,6 +53,7 @@ char *argv[];
 | 
			
		||||
		case 'o':	if (++i == argc) usage();
 | 
			
		||||
				args = argv[i];
 | 
			
		||||
				break;
 | 
			
		||||
		case 'a':	all = 1; break;
 | 
			
		||||
		default:	usage();
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
@ -59,7 +63,10 @@ char *argv[];
 | 
			
		||||
  *ap = NULL;
 | 
			
		||||
  argc = (ap - argv);
 | 
			
		||||
 | 
			
		||||
  if (argc != 3 || *argv[1] == 0) usage();
 | 
			
		||||
  if (!all && (argc != 3 || *argv[1] == 0)) usage();
 | 
			
		||||
  if (all == 1) {
 | 
			
		||||
	return mount_all();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  device = argv[1];
 | 
			
		||||
  if (!strcmp(device, "none")) device = NULL;
 | 
			
		||||
@ -79,7 +86,7 @@ char *argv[];
 | 
			
		||||
	err = strerror(errno);
 | 
			
		||||
	fprintf(stderr, "mount: Can't mount %s on %s: %s\n",
 | 
			
		||||
		argv[1], argv[2], err);
 | 
			
		||||
	exit(1);
 | 
			
		||||
	return(EXIT_FAILURE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* The mount has completed successfully. Tell the user. */
 | 
			
		||||
@ -87,11 +94,23 @@ char *argv[];
 | 
			
		||||
	argv[1], mountflags & MS_RDONLY ? "only" : "write", argv[2]);
 | 
			
		||||
  
 | 
			
		||||
  /* Update /etc/mtab. */
 | 
			
		||||
  if (!write_mtab) return 0;
 | 
			
		||||
  update_mtab(argv[1], argv[2], type, mountflags);
 | 
			
		||||
  return(EXIT_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
update_mtab(char *dev, char *mountpoint, char *fstype, int mountflags)
 | 
			
		||||
{
 | 
			
		||||
	int n;
 | 
			
		||||
	char *vs;
 | 
			
		||||
	char special[PATH_MAX], mounted_on[PATH_MAX], version[10], rw_flag[10];
 | 
			
		||||
 | 
			
		||||
	if (!write_mtab) return;
 | 
			
		||||
	n = load_mtab("mount");
 | 
			
		||||
	if (n < 0) exit(1);		/* something is wrong. */
 | 
			
		||||
 | 
			
		||||
  /* Loop on all the /etc/mtab entries, copying each one to the output buf. */
 | 
			
		||||
	/* Loop on all the /etc/mtab entries, copying each one to the output
 | 
			
		||||
	 * buf. */
 | 
			
		||||
	while (1) {
 | 
			
		||||
		n = get_mtab_entry(special, mounted_on, version, rw_flag);
 | 
			
		||||
		if (n < 0) break;
 | 
			
		||||
@ -102,21 +121,14 @@ char *argv[];
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	/* For MFS, use a version number. Otherwise, use the FS type name. */
 | 
			
		||||
  if (!strcmp(type, MINIX_FS_TYPE)) {
 | 
			
		||||
	switch (v) {
 | 
			
		||||
		case FSVERSION_MFS1: vs = "MFSv1"; break;
 | 
			
		||||
		case FSVERSION_MFS2: vs = "MFSv2"; break;
 | 
			
		||||
		case FSVERSION_MFS3: vs = "MFSv3"; break;
 | 
			
		||||
		default: vs = "0"; break;
 | 
			
		||||
	}
 | 
			
		||||
	if (!strcmp(fstype, MINIX_FS_TYPE)) {
 | 
			
		||||
		vs = "MFSv3";
 | 
			
		||||
	} else if (strlen(fstype) < sizeof(version)) {
 | 
			
		||||
		vs = fstype;
 | 
			
		||||
	} else {
 | 
			
		||||
	/* Keep the version field sufficiently short. */
 | 
			
		||||
	if (strlen(type) < sizeof(version))
 | 
			
		||||
		vs = type;
 | 
			
		||||
	else
 | 
			
		||||
		vs = "-";
 | 
			
		||||
	}
 | 
			
		||||
  n = put_mtab_entry(argv[1], argv[2], vs,
 | 
			
		||||
	n = put_mtab_entry(dev, mountpoint, vs,
 | 
			
		||||
			     (mountflags & MS_RDONLY ? "ro" : "rw") );
 | 
			
		||||
	if (n < 0) {
 | 
			
		||||
		std_err("mount: /etc/mtab has grown too large\n");
 | 
			
		||||
@ -124,10 +136,8 @@ char *argv[];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	n = rewrite_mtab("mount");
 | 
			
		||||
  return(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void list()
 | 
			
		||||
{
 | 
			
		||||
  int n;
 | 
			
		||||
@ -147,9 +157,58 @@ void list()
 | 
			
		||||
  exit(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
has_opt(char *mntopts, char *option)
 | 
			
		||||
{
 | 
			
		||||
	char *optbuf, *opt;
 | 
			
		||||
	int found = 0;
 | 
			
		||||
 | 
			
		||||
	optbuf = strdup(mntopts);
 | 
			
		||||
	for (opt = optbuf; (opt = strtok(opt, ",")) != NULL; opt = NULL) {
 | 
			
		||||
		if (!strcmp(opt, option)) found = 1;
 | 
			
		||||
	}
 | 
			
		||||
	free (optbuf);
 | 
			
		||||
	return(found);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
mount_all()
 | 
			
		||||
{
 | 
			
		||||
	struct fstab *fs;
 | 
			
		||||
	char mountpoint[PATH_MAX];
 | 
			
		||||
 | 
			
		||||
	while ((fs = getfsent()) != NULL) {
 | 
			
		||||
		int ro = 0;
 | 
			
		||||
		int mountflags = 0;
 | 
			
		||||
		if (realpath(fs->fs_file, mountpoint) == NULL) {
 | 
			
		||||
			fprintf(stderr, "Can't mount on %s\n", fs->fs_file);
 | 
			
		||||
			return(EXIT_FAILURE);
 | 
			
		||||
		}
 | 
			
		||||
		if (has_opt(fs->fs_mntops, "noauto"))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (!strcmp(mountpoint, "/"))
 | 
			
		||||
			continue; /* Not remounting root */
 | 
			
		||||
		if (has_opt(fs->fs_mntops, "ro"))
 | 
			
		||||
			ro = 1;
 | 
			
		||||
 | 
			
		||||
		if (ro) {
 | 
			
		||||
			mountflags |= MS_RDONLY;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (mount(fs->fs_spec, mountpoint, mountflags, fs->fs_vfstype,
 | 
			
		||||
			NULL) == 0) {
 | 
			
		||||
			update_mtab(fs->fs_spec, fs->fs_file, fs->fs_vfstype,
 | 
			
		||||
					mountflags);
 | 
			
		||||
		} else {
 | 
			
		||||
			return(EXIT_FAILURE);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return(EXIT_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void usage()
 | 
			
		||||
{
 | 
			
		||||
  std_err("Usage: mount [-r] [-e] [-t type] [-o options] special name\n");
 | 
			
		||||
  std_err("Usage: mount [-a] [-r] [-e] [-t type] [-o options] special name\n");
 | 
			
		||||
  exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@ FILES1=group hostname.file inet.conf motd.install mtab profile \
 | 
			
		||||
	protocols rc services termcap utmp rc.cd  \
 | 
			
		||||
	syslog.conf rc.daemons.dist \
 | 
			
		||||
	rs.inet rs.single make.conf system.conf ttys resolv.conf rc.conf \
 | 
			
		||||
	rc.subr rc.subr.minix man.conf shells boot.cfg.default \
 | 
			
		||||
	rc.subr man.conf shells boot.cfg.default \
 | 
			
		||||
	devmand/scripts/block devmand/scripts/singlechar
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@ -53,7 +53,7 @@ install: installpw	# installpw needed to bootstrap pw db
 | 
			
		||||
	@echo "Installing fonts.."
 | 
			
		||||
	${INSTALL_FILE} -m 644 -o root -g operator fonts/*.fnt ${DESTDIR}/usr/lib/fonts/
 | 
			
		||||
 | 
			
		||||
installforce:: $(ETC)/rc $(ETC)/rs.inet $(ETC)/rs.single $(ETC)/system.conf $(ETC)/rc.subr.minix $(USRETC)/rc $(USR)/Makefile installpw
 | 
			
		||||
installforce:: $(ETC)/rc $(ETC)/rs.inet $(ETC)/rs.single $(ETC)/system.conf $(USRETC)/rc $(USR)/Makefile installpw
 | 
			
		||||
 | 
			
		||||
installpw::
 | 
			
		||||
	if [ ! -d $(ETC) ]; then ${INSTALL_DIR} $(ETC); chmod 755 $(ETC); fi
 | 
			
		||||
@ -72,9 +72,6 @@ $(ETC)/rs.single: rs.single .PHONY
 | 
			
		||||
$(ETC)/system.conf: system.conf .PHONY
 | 
			
		||||
	${INSTALL_FILE} -m 644 -o root -g operator $> $@
 | 
			
		||||
 | 
			
		||||
$(ETC)/rc.subr.minix: rc.subr.minix .PHONY
 | 
			
		||||
	${INSTALL_FILE} -m 644 -o root -g operator $> $@
 | 
			
		||||
 | 
			
		||||
$(USRETC)/rc: usr/rc .PHONY
 | 
			
		||||
	${INSTALL_FILE} -m 755 -o root -g operator $> $@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								etc/rc
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								etc/rc
									
									
									
									
									
								
							@ -1,7 +1,5 @@
 | 
			
		||||
# /etc/rc - System startup script run by init before going multiuser.
 | 
			
		||||
 | 
			
		||||
. /etc/rc.subr.minix
 | 
			
		||||
 | 
			
		||||
exec >/dev/log
 | 
			
		||||
exec 2>/dev/log
 | 
			
		||||
exec </dev/null
 | 
			
		||||
@ -147,7 +145,7 @@ start)
 | 
			
		||||
		if [ "$fstabline" = "# Poor man's File System Table." ]
 | 
			
		||||
		then	mountfstab_poorman	# Old minix /etc/fstab
 | 
			
		||||
		else	fsck -x / $fflag $fsckopts
 | 
			
		||||
			mountfstab $FSTAB
 | 
			
		||||
			mount -a
 | 
			
		||||
		fi
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,33 +0,0 @@
 | 
			
		||||
 | 
			
		||||
mountfstab()
 | 
			
		||||
{
 | 
			
		||||
	fstabfile="$1"
 | 
			
		||||
 | 
			
		||||
	if [ ! -f $fstabfile ]
 | 
			
		||||
	then	echo "mountfstab: $fstabfile not found"
 | 
			
		||||
		return 1
 | 
			
		||||
	fi
 | 
			
		||||
	
 | 
			
		||||
	cat $fstabfile | sed 's/#.*//' | while read fsline
 | 
			
		||||
	do	set "" $fsline
 | 
			
		||||
		shift
 | 
			
		||||
	 	if [ $# -eq 0 ]; then continue; fi
 | 
			
		||||
		if [ $# -lt 3 ]
 | 
			
		||||
		then	echo "$fstabfile: short line"
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		# This line's parameters
 | 
			
		||||
		dev="$1"; mp="$2"; fstype="$3"
 | 
			
		||||
 | 
			
		||||
		# Don't mount / as it's already mounted
 | 
			
		||||
		if [ "$mp" = "/" ]; then continue; fi
 | 
			
		||||
 | 
			
		||||
		# Sanity checks
 | 
			
		||||
		if [ ! -b $dev ]; then	echo "$dev missing"; continue; fi
 | 
			
		||||
		if [ ! -d $mp ]; then echo "$mp missing"; continue; fi
 | 
			
		||||
 | 
			
		||||
		# Do actual mount command
 | 
			
		||||
		mount -t $fstype $dev $mp
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
@ -97,10 +97,7 @@ up()
 | 
			
		||||
get_eth_labels() {
 | 
			
		||||
  # Filter out the non-vlan ethernet entries from inet.conf.
 | 
			
		||||
  # Produce as output a list of "drivername_instancenr"-formatted labels.
 | 
			
		||||
  # The first sed is taken from /bin as older GNU sed versions don't know '\t'.
 | 
			
		||||
  # /bin/sed is the minix sed, /usr/bin/sed is the netbsd sed. Earlier versions
 | 
			
		||||
  # of this script used \t that only the minix sed understands.
 | 
			
		||||
  /bin/sed 's/\008/ /g' /etc/inet.conf | \
 | 
			
		||||
  sed 's/\008/ /g' /etc/inet.conf | \
 | 
			
		||||
    sed -n 's/^ *eth[0-9][0-9]* *\([^ ][^ ]*\) *\([0-9][0-9]*\).*$/\1_\2/p' | \
 | 
			
		||||
    grep -v '^vlan_'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,9 @@ mount \- mount a file system
 | 
			
		||||
..
 | 
			
		||||
.SH OPTIONS
 | 
			
		||||
.TP 5
 | 
			
		||||
.B \-a
 | 
			
		||||
# All file systems in /etc/fstab except \/ are mounted. File systems marked 'noauto' are skipped
 | 
			
		||||
.TP 5
 | 
			
		||||
.B \-r
 | 
			
		||||
# File system is mounted read-only
 | 
			
		||||
.TP 5
 | 
			
		||||
@ -34,6 +37,9 @@ mount \- mount a file system
 | 
			
		||||
.TP 20
 | 
			
		||||
.B mount \-t procfs none /proc
 | 
			
		||||
# Mount proc file system on \fI/proc\fP
 | 
			
		||||
.TP 20
 | 
			
		||||
.B mount \-a
 | 
			
		||||
# Mount all file systems listed in /etc/fstab except \/.
 | 
			
		||||
.SH DESCRIPTION
 | 
			
		||||
.PP
 | 
			
		||||
The file system contained on the special file \fIspecial\fP is mounted on
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user