opnsense-ports/sysutils/fusefs-curlftpfs/files/patch-path__utils.c
Franco Fichtner 2a9ae9eae0 */*: sync with upstream
Taken from: FreeBSD
2024-11-04 08:48:13 +01:00

75 lines
1.8 KiB
C

--- path_utils.c.orig 2007-11-20 19:27:58 UTC
+++ path_utils.c
@@ -92,3 +92,72 @@ char* get_dir_path(const char* path) {
return ret;
}
+
+/*
+ * the chars not needed to be escaped:
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ */
+static inline int is_unreserved_rfc3986(char c)
+{
+ int is_locase_alpha = (c >= 'a' && c <= 'z');
+ int is_upcase_alpha = (c >= 'A' && c <= 'Z');
+ int is_digit = (c >= '0' && c <= '9');
+ int is_special = c == '-'
+ || c == '.'
+ || c == '_'
+ || c == '~';
+ int is_unreserved = is_locase_alpha
+ || is_upcase_alpha
+ || is_digit
+ || is_special;
+
+ return is_unreserved;
+}
+
+static inline int is_unreserved(char c)
+{
+ return is_unreserved_rfc3986(c) || c == '/';
+}
+
+char* path_to_uri(const char* path)
+{
+ static const char hex[] = "0123456789ABCDEF";
+ size_t path_len = strlen(path);
+ size_t host_len = strlen(ftpfs.host);
+ /* at worst: c -> %XX */
+ char * encoded_path = malloc (3 * path_len + 1);
+ const char * s = path;
+ char * d = encoded_path;
+
+ /*
+ * 'path' is always prefixed with 'ftpfs.host'
+ */
+ memcpy (d, ftpfs.host, host_len);
+ s += host_len;
+ d += host_len;
+
+ for (; *s; ++s)
+ {
+ char c = *s;
+ if (is_unreserved (c))
+ {
+ *d++ = c;
+ }
+ else
+ {
+ unsigned int hi = ((unsigned)c >> 4) & 0xF;
+ unsigned int lo = ((unsigned)c >> 0) & 0xF;
+ *d++ = '%';
+ *d++ = hex[hi];
+ *d++ = hex[lo];
+ }
+ }
+ *d = '\0';
+
+ return encoded_path;
+}
+
+void free_uri(char* path)
+{
+ free(path);
+}