summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--name.c27
-rw-r--r--name.h1
2 files changed, 28 insertions, 0 deletions
diff --git a/name.c b/name.c
index 4b4b0b87d..15e324c5f 100644
--- a/name.c
+++ b/name.c
@@ -2,6 +2,7 @@
#include <assert.h>
#include <errno.h>
+#include <string.h>
#include "set.h"
#include "name.h"
@@ -30,6 +31,32 @@ NameType name_type_from_string(const char *n) {
return _NAME_TYPE_INVALID;
}
+#define VALID_CHARS \
+ "0123456789" \
+ "abcdefghijklmnopqrstuvwxyz" \
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
+ "-_"
+
+bool name_is_valid(const char *n) {
+ NameType t;
+ const char *e, *i;
+
+ assert(n);
+
+ t = name_type_from_string(n);
+ if (t < 0 || t >= _NAME_TYPE_MAX)
+ return false;
+
+ if (!(e = strrchr(n, '.')))
+ return false;
+
+ for (i = n; i < e; i++)
+ if (!strchr(VALID_CHARS, *i))
+ return false;
+
+ return true;
+}
+
Name *name_new(Manager *m) {
Name *n;
diff --git a/name.h b/name.h
index 3b364f00f..062c95aa1 100644
--- a/name.h
+++ b/name.h
@@ -260,6 +260,7 @@ DEFINE_CAST(SNAPSHOT, Snapshot, snapshot);
bool name_is_ready(Name *name);
NameType name_type_from_string(const char *n);
+bool name_is_valid(const char *n);
Name *name_new(Manager *m);
void name_free(Name *name);