xref: /original-bsd/sbin/mount/mount.c (revision 9a96b58b)
1 static char *sccsid = "@(#)mount.c	4.7 (Berkeley) 03/31/82";
2 #include <stdio.h>
3 #include <fstab.h>
4 
5 /*
6  * mount
7  */
8 
9 #define	NMOUNT	16
10 #define	NAMSIZ	32
11 
12 struct mtab {
13 	char	file[NAMSIZ];
14 	char	spec[NAMSIZ];
15 } mtab[NMOUNT];
16 
17 int	all;
18 int	ro;
19 int	fake;
20 int	verbose;
21 
22 main(argc, argv)
23 	int argc;
24 	char **argv;
25 {
26 	register struct mtab *mp;
27 	register char *np;
28 	int mf;
29 
30 	mf = open("/etc/mtab", 0);
31 	read(mf, (char *)mtab, NMOUNT*2*NAMSIZ);
32 	if (argc==1) {
33 		for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
34 			if (mp->file[0])
35 				printf("%s on %s\n", mp->spec, mp->file);
36 		exit(0);
37 	}
38 top:
39 	if (argc > 1) {
40 		if (!strcmp(argv[1], "-a")) {
41 			all++;
42 			argc--, argv++;
43 			goto top;
44 		}
45 		if (!strcmp(argv[1], "-r")) {
46 			ro++;
47 			argc--, argv++;
48 			goto top;
49 		}
50 		if (!strcmp(argv[1], "-f")) {
51 			fake++;
52 			argc--, argv++;
53 			goto top;
54 		}
55 		if (!strcmp(argv[1], "-v")) {
56 			verbose++;
57 			argc--, argv++;
58 			goto top;
59 		}
60 	}
61 	if (all) {
62 		struct fstab *fsp;
63 
64 		if (argc > 1)
65 			goto argcnt;
66 		close(2); dup(1);
67 		if (setfsent() == 0)
68 			perror(FSTAB), exit(1);
69 		while ( (fsp = getfsent()) != 0) {
70 			if (strcmp(fsp->fs_file, "/") == 0)
71 				continue;
72 			ro = !strcmp(fsp->fs_type, FSTAB_RO);
73 			if (ro==0 && strcmp(fsp->fs_type, FSTAB_RW))
74 				continue;
75 			mountfs(fsp->fs_spec, fsp->fs_file, ro);
76 		}
77 		exit(0);
78 	}
79 	if (argc < 2 || argc > 3) {
80 argcnt:
81 		fprintf(stderr,
82 	    "usage: mount [ -a ] [ -r ] [ -f ] [ -v ] [ special dir ]\n");
83 		exit(1);
84 	}
85 	mountfs(argv[1], argv[2], ro);
86 }
87 
88 mountfs(spec, name, ro)
89 	char *spec, *name;
90 {
91 	register char *np;
92 	register struct mtab *mp;
93 	int mf;
94 
95 	if (fake==0) {
96 		if (mount(spec, name, ro) < 0) {
97 			fprintf(stderr, "%s on ", spec);
98 			perror(name);
99 			return;
100 		}
101 	}
102 	if (verbose)
103 		fprintf(stderr, "%s on %s%s\n", spec, name,
104 		    ro ? " read only" : "");
105 	np = spec;
106 	while (*np++)
107 		;
108 	np--;
109 	while (*--np == '/')
110 		*np = '\0';
111 	while (np > spec && *--np != '/')
112 		;
113 	if (*np == '/')
114 		np++;
115 	spec = np;
116 	for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
117 		if (!strcmp(mp->spec, spec))
118 			goto replace;
119 	for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
120 		if (mp->file[0] == 0)
121 			goto replace;
122 	return;
123 replace:
124 	for (np = mp->spec; np < &mp->spec[NAMSIZ-1];)
125 		if ((*np++ = *spec++) == 0)
126 			spec--;
127 	for (np = mp->file; np < &mp->file[NAMSIZ-1];)
128 		if ((*np++ = *name++) == 0)
129 			name--;
130 	mp = &mtab[NMOUNT];
131 	while ((--mp)->file[0] == 0);
132 	mf = creat("/etc/mtab", 0644);
133 	write(mf, (char *)mtab, (mp-mtab+1)*2*NAMSIZ);
134 	close(mf);
135 	return;
136 }
137