diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-07-31 17:48:47 -0400 |
---|---|---|
committer | Ian Stakenvicius <axs@gentoo.org> | 2013-07-31 17:48:47 -0400 |
commit | f8e6d758cd65b28f94b62344bd95e7bab94370d4 (patch) | |
tree | d6382c8413fac1d5e0e90f636a0f50ff7cf23ecd | |
parent | 9a769172c3af6e9c51b7c55cb9df9fddcc13dbc6 (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>
-rw-r--r-- | src/libudev/util.c | 28 | ||||
-rw-r--r-- | src/libudev/util.h | 2 |
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; } |