summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/path.c33
-rw-r--r--common/path.h4
-rw-r--r--common/test-path.c22
3 files changed, 59 insertions, 0 deletions
diff --git a/common/path.c b/common/path.c
index 8b8b66c..5cf0e1a 100644
--- a/common/path.c
+++ b/common/path.c
@@ -38,9 +38,11 @@
#include "config.h"
+#include "buffer.h"
#include "debug.h"
#include "message.h"
#include "path.h"
+#include "url.h"
#include <assert.h>
#include <errno.h>
@@ -325,3 +327,34 @@ p11_path_canon (char *name)
name[i] = '_';
}
}
+
+char *
+p11_path_encode (const char *path)
+{
+ static const char *VALID =
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_/\\";
+ p11_buffer buf;
+ char *result;
+
+ return_val_if_fail (path != NULL, NULL);
+
+ if (!p11_buffer_init_null (&buf, strlen (path)))
+ return_val_if_reached (NULL);
+
+ p11_url_encode ((unsigned char *)path,
+ (unsigned char *)path + strlen (path),
+ VALID,
+ &buf);
+ return_val_if_fail (p11_buffer_ok (&buf), NULL);
+
+ result = p11_buffer_steal (&buf, NULL);
+ p11_buffer_uninit (&buf);
+
+ return result;
+}
+
+char *
+p11_path_decode (const char *path)
+{
+ return (char *) p11_url_decode (path, path + strlen (path), "", NULL);
+}
diff --git a/common/path.h b/common/path.h
index 0b19a5d..243c14f 100644
--- a/common/path.h
+++ b/common/path.h
@@ -66,4 +66,8 @@ bool p11_path_prefix (const char *string,
void p11_path_canon (char *name);
+char * p11_path_encode (const char *path);
+
+char * p11_path_decode (const char *path);
+
#endif /* P11_PATH_H__ */
diff --git a/common/test-path.c b/common/test-path.c
index 1394e0f..c77acf2 100644
--- a/common/test-path.c
+++ b/common/test-path.c
@@ -200,6 +200,26 @@ test_canon (void)
free (test);
}
+static void
+test_encode (void)
+{
+ char *test;
+
+ test = p11_path_encode ("2309haonutb;/AOE@#$O ");
+ assert_str_eq (test, "2309haonutb%3b/AOE%40%23%24O%20");
+ free (test);
+}
+
+static void
+test_decode (void)
+{
+ char *test;
+
+ test = p11_path_decode ("2309haonutb%3b/AOE%40%23%24O%20");
+ assert_str_eq (test, "2309haonutb;/AOE@#$O ");
+ free (test);
+}
+
int
main (int argc,
char *argv[])
@@ -211,6 +231,8 @@ main (int argc,
p11_test (test_parent, "/path/parent");
p11_test (test_prefix, "/path/prefix");
p11_test (test_canon, "/path/canon");
+ p11_test (test_encode, "/path/encode");
+ p11_test (test_decode, "/path/decode");
return p11_test_run (argc, argv);
}