aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/busybox/busybox-1.2.2/mount-all-type.patch
blob: 476094a8045914974798a95907408c7db0f7a8ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
--- busybox-1.00/.pc/mount-all-type.patch/util-linux/mount.c	2004-08-02 17:14:02.000000000 -0700
+++ busybox-1.00/util-linux/mount.c	2005-05-13 00:17:19.054232796 -0700
@@ -364,6 +364,56 @@
 	exit(EXIT_SUCCESS);
 }
 
+/* Does this file system type, from /etc/fstab, match the given
+ * -t option value?
+ */
+static int match_fs(const char *option, const char *type)
+{
+	const int len = strlen(type);
+	const int no = option[0] == 'n' && option[1] == 'o';
+	const char *optp = option;
+
+	if (len > 0) do {
+		const char *match = strstr(optp, type);
+
+		if (match == NULL) {
+			/* No match, but if the option string starts 'no' no match
+			 * means yes.
+			 */
+			return no;
+		}
+
+		/* Match, may be partial, check for end-of-type in option string. */
+		if (match[len] == 0 || match[len] == ',') {
+			/* Ok, check for type or notype. */
+			if (match == option) {
+				/* Exact match at start (can't be 'no') */
+				return 1;
+			}
+			if (match > option+1) {
+				if (match[-1] == ',') {
+					/* Exact match in middle, might be 'no' */
+					return !no;
+				}
+				if (match == option+2 && no) {
+					/* Exact match to 'notype' at start. */
+					return 0;
+				}
+				if (match > option+2 && match[-3] == ',' &&
+						match[-2] == 'n' && match[-1] == 'o') {
+					return 0;
+				}
+			}
+		}
+
+		/* Look for another match. */
+		optp = match+1;
+	} while (1);
+
+	/* zero length type in fstab (impossible?), don't match it. */
+	return 0;
+}
+
 extern int mount_main(int argc, char **argv)
 {
 	struct stat statbuf;
@@ -371,6 +421,7 @@
 	char *extra_opts;
 	int flags = 0;
 	char *filesystemType = "auto";
+	char *filesystemOption = 0;
 	int got_filesystemType = 0;
 	char *device = xmalloc(PATH_MAX);
 	char *directory = xmalloc(PATH_MAX);
@@ -393,6 +444,7 @@
 			break;
 		case 't':
 			filesystemType = optarg;
+			filesystemOption = optarg;
 			got_filesystemType = 1;
 			break;
 		case 'w':
@@ -460,6 +512,8 @@
 
 			strcpy(device, m->mnt_fsname);
 			strcpy(directory, m->mnt_dir);
+			if (all && filesystemOption != 0 && !match_fs(filesystemOption, m->mnt_type))
+				continue;
 			filesystemType = bb_xstrdup(m->mnt_type);
 		  singlemount:
 			extra_opts = string_flags;