diff options
Diffstat (limited to 'filesystems/curlftpfs/files/patch-path__utils.c')
-rw-r--r-- | filesystems/curlftpfs/files/patch-path__utils.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/filesystems/curlftpfs/files/patch-path__utils.c b/filesystems/curlftpfs/files/patch-path__utils.c new file mode 100644 index 000000000000..7855c90e7043 --- /dev/null +++ b/filesystems/curlftpfs/files/patch-path__utils.c @@ -0,0 +1,75 @@ +--- 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); ++} |