Browse Source

lib,match: split match_fstype() from libmount

Signed-off-by: Karel Zak <kzak@redhat.com>
pull/4/head
Karel Zak 11 years ago
parent
commit
1208915521
  1. 12
      include/match.h
  2. 51
      lib/match.c
  3. 1
      libmount/src/Makefile.am
  4. 30
      libmount/src/utils.c

12
include/match.h

@ -0,0 +1,12 @@
/*
* Copyright (C) 2011 Karel Zak <kzak@redhat.com>
*
* 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 */

51
lib/match.c

@ -0,0 +1,51 @@
/*
* Copyright (C) 2011 Karel Zak <kzak@redhat.com>
*
* This file may be redistributed under the terms of the
* GNU Lesser General Public License.
*/
#include <string.h>
/*
* 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;
}

1
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 \

30
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);
}

Loading…
Cancel
Save