fix for 2.4 build
authorMiklos Szeredi <miklos@szeredi.hu>
Mon, 19 Apr 2004 10:24:41 +0000 (10:24 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Mon, 19 Apr 2004 10:24:41 +0000 (10:24 +0000)
ChangeLog
kernel/Makefile.in
kernel/compat/parser.c [new file with mode: 0644]
kernel/compat/parser.h [new file with mode: 0644]
kernel/inode.c

index 5ceddaf7e47ba398bc7e721525d73a2b380ffeb6..05121a9b516ffae8ddc1726772563ded1faa1046 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2004-04-19  Miklos Szeredi <mszeredi@inf.bme.hu>
+
+       * Added mount option parser to 2.4 build
+       
 2004-04-13  Miklos Szeredi <mszeredi@inf.bme.hu>
 
        * Replaced binary mount data with text options
index 0421f54192b2f6f28050a8c740e74a7810af1b54..1737dc027b20c84394e1dec6f1968ad504d206bc 100644 (file)
@@ -27,7 +27,7 @@ uninstall:
        -/sbin/depmod -a
 
 clean:
-       -rm -f $(fusemodule) *.o .*.cmd *.mod.c *.ko *.s
+       -rm -f $(fusemodule) *.o .*.cmd *.mod.c *.ko *.s */*.o
 
 distclean: clean
        rm -f Makefile
@@ -42,17 +42,17 @@ ifeq ($(majver), 2.4)
 
 CC = @CC@
 LD = @LD@
-CFLAGS = -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -pipe
+CFLAGS = -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -pipe 
 CPPFLAGS = -I@kernelsrc@/include -I../include -D__KERNEL__ -DMODULE -D_LOOSE_KERNEL_NAMES -DFUSE_VERSION=\"@VERSION@\"
 
-fuse_objs = dev.o dir.o file.o inode.o util.o
+fuse_objs = dev.o dir.o file.o inode.o util.o compat/parser.o
 
 SUFFIXES = .c .o .s
 
 all-spec: fuse.o
 
 .c.o:
-       $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
 
 fuse.o: $(fuse_objs)
        $(LD) -r -o fuse.o $(fuse_objs)
diff --git a/kernel/compat/parser.c b/kernel/compat/parser.c
new file mode 100644 (file)
index 0000000..5527c33
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * lib/parser.c - simple parser for mount, etc. options.
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+
+#include <linux/ctype.h>
+#include <linux/module.h>
+#include <linux/parser.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+
+/**
+ * match_one: - Determines if a string matches a simple pattern
+ * @s: the string to examine for presense of the pattern
+ * @p: the string containing the pattern
+ * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
+ * locations.
+ *
+ * Description: Determines if the pattern @p is present in string @s. Can only
+ * match extremely simple token=arg style patterns. If the pattern is found,
+ * the location(s) of the arguments will be returned in the @args array.
+ */
+static int match_one(char *s, char *p, substring_t args[])
+{
+       char *meta;
+       int argc = 0;
+
+       if (!p)
+               return 1;
+
+       while(1) {
+               int len = -1;
+               meta = strchr(p, '%');
+               if (!meta)
+                       return strcmp(p, s) == 0;
+
+               if (strncmp(p, s, meta-p))
+                       return 0;
+
+               s += meta - p;
+               p = meta + 1;
+
+               if (isdigit(*p))
+                       len = simple_strtoul(p, &p, 10);
+               else if (*p == '%') {
+                       if (*s++ != '%')
+                               return 0;
+                       continue;
+               }
+
+               if (argc >= MAX_OPT_ARGS)
+                       return 0;
+
+               args[argc].from = s;
+               switch (*p++) {
+               case 's':
+                       if (strlen(s) == 0)
+                               return 0;
+                       else if (len == -1 || len > strlen(s))
+                               len = strlen(s);
+                       args[argc].to = s + len;
+                       break;
+               case 'd':
+                       simple_strtol(s, &args[argc].to, 0);
+                       goto num;
+               case 'u':
+                       simple_strtoul(s, &args[argc].to, 0);
+                       goto num;
+               case 'o':
+                       simple_strtoul(s, &args[argc].to, 8);
+                       goto num;
+               case 'x':
+                       simple_strtoul(s, &args[argc].to, 16);
+               num:
+                       if (args[argc].to == args[argc].from)
+                               return 0;
+                       break;
+               default:
+                       return 0;
+               }
+               s = args[argc].to;
+               argc++;
+       }
+}
+
+/**
+ * match_token: - Find a token (and optional args) in a string
+ * @s: the string to examine for token/argument pairs
+ * @table: match_table_t describing the set of allowed option tokens and the
+ * arguments that may be associated with them. Must be terminated with a
+ * &struct match_token whose pattern is set to the NULL pointer.
+ * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
+ * locations.
+ *
+ * Description: Detects which if any of a set of token strings has been passed
+ * to it. Tokens can include up to MAX_OPT_ARGS instances of basic c-style
+ * format identifiers which will be taken into account when matching the
+ * tokens, and whose locations will be returned in the @args array.
+ */
+int match_token(char *s, match_table_t table, substring_t args[])
+{
+       struct match_token *p;
+
+       for (p = table; !match_one(s, p->pattern, args) ; p++)
+               ;
+
+       return p->token;
+}
+
+/**
+ * match_number: scan a number in the given base from a substring_t
+ * @s: substring to be scanned
+ * @result: resulting integer on success
+ * @base: base to use when converting string
+ *
+ * Description: Given a &substring_t and a base, attempts to parse the substring
+ * as a number in that base. On success, sets @result to the integer represented
+ * by the string and returns 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
+static int match_number(substring_t *s, int *result, int base)
+{
+       char *endp;
+       char *buf;
+       int ret;
+
+       buf = kmalloc(s->to - s->from + 1, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+       memcpy(buf, s->from, s->to - s->from);
+       buf[s->to - s->from] = '\0';
+       *result = simple_strtol(buf, &endp, base);
+       ret = 0;
+       if (endp == buf)
+               ret = -EINVAL;
+       kfree(buf);
+       return ret;
+}
+
+/**
+ * match_int: - scan a decimal representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as a decimal integer. On
+ * success, sets @result to the integer represented by the string and returns 0.
+ * Returns either -ENOMEM or -EINVAL on failure.
+ */
+int match_int(substring_t *s, int *result)
+{
+       return match_number(s, result, 0);
+}
+
+/**
+ * match_octal: - scan an octal representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as an octal integer. On
+ * success, sets @result to the integer represented by the string and returns
+ * 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
+int match_octal(substring_t *s, int *result)
+{
+       return match_number(s, result, 8);
+}
+
+/**
+ * match_hex: - scan a hex representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as a hexadecimal integer.
+ * On success, sets @result to the integer represented by the string and
+ * returns 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
+int match_hex(substring_t *s, int *result)
+{
+       return match_number(s, result, 16);
+}
+
+/**
+ * match_strcpy: - copies the characters from a substring_t to a string
+ * @to: string to copy characters to.
+ * @s: &substring_t to copy
+ *
+ * Description: Copies the set of characters represented by the given
+ * &substring_t @s to the c-style string @to. Caller guarantees that @to is
+ * large enough to hold the characters of @s.
+ */
+void match_strcpy(char *to, substring_t *s)
+{
+       memcpy(to, s->from, s->to - s->from);
+       to[s->to - s->from] = '\0';
+}
+
+/**
+ * match_strdup: - allocate a new string with the contents of a substring_t
+ * @s: &substring_t to copy
+ *
+ * Description: Allocates and returns a string filled with the contents of
+ * the &substring_t @s. The caller is responsible for freeing the returned
+ * string with kfree().
+ */
+char *match_strdup(substring_t *s)
+{
+       char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL);
+       if (p)
+               match_strcpy(p, s);
+       return p;
+}
+
diff --git a/kernel/compat/parser.h b/kernel/compat/parser.h
new file mode 100644 (file)
index 0000000..fa33328
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * linux/include/linux/parser.h
+ *
+ * Header for lib/parser.c
+ * Intended use of these functions is parsing filesystem argument lists,
+ * but could potentially be used anywhere else that simple option=arg
+ * parsing is required.
+ */
+
+
+/* associates an integer enumerator with a pattern string. */
+struct match_token {
+       int token;
+       char *pattern;
+};
+
+typedef struct match_token match_table_t[];
+
+/* Maximum number of arguments that match_token will find in a pattern */
+enum {MAX_OPT_ARGS = 3};
+
+/* Describe the location within a string of a substring */
+typedef struct {
+       char *from;
+       char *to;
+} substring_t;
+
+int match_token(char *, match_table_t table, substring_t args[]);
+int match_int(substring_t *, int *result);
+int match_octal(substring_t *, int *result);
+int match_hex(substring_t *, int *result);
+void match_strcpy(char *, substring_t *);
+char *match_strdup(substring_t *);
index a719ad900d068ae078244a2bd54dbcfc5d4f7ea9..3aa3f02ff23d3a50ebdba6a9504fc5048906ff29 100644 (file)
 #include <linux/file.h>
 #include <linux/mount.h>
 #include <linux/proc_fs.h>
-#include <linux/parser.h>
 #include <linux/seq_file.h>
 #ifdef KERNEL_2_6
+#include <linux/parser.h>
 #include <linux/statfs.h>
+#else
+#include "compat/parser.h"
 #endif
 
 #define FUSE_SUPER_MAGIC 0x65735546