85 lines
2.1 KiB
Diff
85 lines
2.1 KiB
Diff
--- 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;
|