From 12089155210f8d84054cc8413d79cd2800d26929 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 15 Nov 2011 15:17:19 +0100 Subject: [PATCH] lib,match: split match_fstype() from libmount Signed-off-by: Karel Zak --- include/match.h | 12 ++++++++++ lib/match.c | 51 ++++++++++++++++++++++++++++++++++++++++ libmount/src/Makefile.am | 1 + libmount/src/utils.c | 30 +---------------------- 4 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 include/match.h create mode 100644 lib/match.c diff --git a/include/match.h b/include/match.h new file mode 100644 index 0000000000..94440c22e9 --- /dev/null +++ b/include/match.h @@ -0,0 +1,12 @@ +/* + * Copyright (C) 2011 Karel Zak + * + * This file may be redistributed under the terms of the + * GNU Lesser General Public License. + */ +#ifndef UTIL_LINUX_MATCH_H +#define UTIL_LINUX_MATCH_H + +extern int match_fstype(const char *type, const char *pattern); + +#endif /* UTIL_LINUX_MATCH_H */ diff --git a/lib/match.c b/lib/match.c new file mode 100644 index 0000000000..c5c48a0f63 --- /dev/null +++ b/lib/match.c @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2011 Karel Zak + * + * This file may be redistributed under the terms of the + * GNU Lesser General Public License. + */ + +#include + +/* + * match_fstype: + * @type: filesystem type + * @pattern: filesystem name or comma delimited list of names + * + * The @pattern list of filesystem can be prefixed with a global + * "no" prefix to invert matching of the whole list. The "no" could + * also be used for individual items in the @pattern list. So, + * "nofoo,bar" has the same meaning as "nofoo,nobar". + */ +int match_fstype(const char *type, const char *pattern) +{ + int no = 0; /* negated types list */ + int len; + const char *p; + + if (!pattern && !type) + return 1; + if (!pattern) + return 0; + + if (!strncmp(pattern, "no", 2)) { + no = 1; + pattern += 2; + } + + /* Does type occur in types, separated by commas? */ + len = strlen(type); + p = pattern; + while(1) { + if (!strncmp(p, "no", 2) && !strncmp(p+2, type, len) && + (p[len+2] == 0 || p[len+2] == ',')) + return 0; + if (strncmp(p, type, len) == 0 && (p[len] == 0 || p[len] == ',')) + return !no; + p = strchr(p,','); + if (!p) + break; + p++; + } + return no; +} diff --git a/libmount/src/Makefile.am b/libmount/src/Makefile.am index 5525ba279e..edf766e1fe 100644 --- a/libmount/src/Makefile.am +++ b/libmount/src/Makefile.am @@ -16,6 +16,7 @@ libmount_la_SOURCES = mountP.h version.c utils.c test.c init.c cache.c \ context_loopdev.c \ $(mountinc_HEADERS) \ $(top_srcdir)/lib/at.c \ + $(top_srcdir)/lib/match.c \ $(top_srcdir)/include/list.h \ $(top_srcdir)/lib/mangle.c \ $(top_srcdir)/lib/canonicalize.c \ diff --git a/libmount/src/utils.c b/libmount/src/utils.c index 239e587fe4..7cd50ec3a8 100644 --- a/libmount/src/utils.c +++ b/libmount/src/utils.c @@ -245,35 +245,7 @@ int mnt_fstype_is_netfs(const char *type) */ int mnt_match_fstype(const char *type, const char *pattern) { - int no = 0; /* negated types list */ - int len; - const char *p; - - if (!pattern && !type) - return 1; - if (!pattern) - return 0; - - if (!strncmp(pattern, "no", 2)) { - no = 1; - pattern += 2; - } - - /* Does type occur in types, separated by commas? */ - len = strlen(type); - p = pattern; - while(1) { - if (!strncmp(p, "no", 2) && !strncmp(p+2, type, len) && - (p[len+2] == 0 || p[len+2] == ',')) - return 0; - if (strncmp(p, type, len) == 0 && (p[len] == 0 || p[len] == ',')) - return !no; - p = strchr(p,','); - if (!p) - break; - p++; - } - return no; + return match_fstype(type, pattern); } -- 2.47.2