summaryrefslogtreecommitdiff
path: root/src/libudev
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-07-31 17:48:47 -0400
committerIan Stakenvicius <axs@gentoo.org>2013-07-31 17:48:47 -0400
commitf8e6d758cd65b28f94b62344bd95e7bab94370d4 (patch)
treed6382c8413fac1d5e0e90f636a0f50ff7cf23ecd /src/libudev
parent9a769172c3af6e9c51b7c55cb9df9fddcc13dbc6 (diff)
add various escaping/path handling utility functions
A portion of systemd commit 4fe88d28a4cfa504c1f2362d4a7030fae4c4af29 , needed to support changes made by commit 6284c1ca41dca85e968e8d304cdc154c5a46d6d2 Signed-off-by: Ian Stakenvicius <axs@gentoo.org>
Diffstat (limited to 'src/libudev')
-rw-r--r--src/libudev/util.c28
-rw-r--r--src/libudev/util.h2
2 files changed, 30 insertions, 0 deletions
diff --git a/src/libudev/util.c b/src/libudev/util.c
index f625cfe99b..8fec6856e0 100644
--- a/src/libudev/util.c
+++ b/src/libudev/util.c
@@ -1046,3 +1046,31 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
return NULL;
}
+char *xescape(const char *s, const char *bad) {
+ char *r, *t;
+ const char *f;
+
+ /* Escapes all chars in bad, in addition to \ and all special
+ * chars, in \xFF style escaping. May be reversed with
+ * cunescape. */
+
+ if (!(r = new(char, strlen(s)*4+1)))
+ return NULL;
+
+ for (f = s, t = r; *f; f++) {
+
+ if (*f < ' ' || *f >= 127 ||
+ *f == '\\' || strchr(bad, *f)) {
+ *(t++) = '\\';
+ *(t++) = 'x';
+ *(t++) = hexchar(*f >> 4);
+ *(t++) = hexchar(*f);
+ } else
+ *(t++) = *f;
+ }
+
+ *t = 0;
+
+ return r;
+}
+
diff --git a/src/libudev/util.h b/src/libudev/util.h
index 60b300da3c..96a42bf3d3 100644
--- a/src/libudev/util.h
+++ b/src/libudev/util.h
@@ -272,6 +272,8 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
int (*compar) (const void *, const void *, void *),
void *arg);
+char *xescape(const char *s, const char *bad);
+
static inline void _reset_errno_(int *saved_errno) {
errno = *saved_errno;
}