version 1.2.6.1, 2012/07/31 11:56:16
|
version 1.3.2.2, 2012/08/06 11:26:23
|
Line 60 www_cmp(const char *ct, const char *s)
|
Line 60 www_cmp(const char *ct, const char *s)
|
|
|
assert(ct && s); |
assert(ct && s); |
|
|
while (isspace(*ct)) | while (isspace((int) *ct)) |
ct++; |
ct++; |
|
|
if (!(sc = strchr(ct, ';'))) |
if (!(sc = strchr(ct, ';'))) |
sc = strchr(ct, '\x0'); |
sc = strchr(ct, '\x0'); |
while (isspace(*(sc - 1))) | while (isspace((int) *(sc - 1))) |
sc--; |
sc--; |
|
|
if (strlen(s) != sc - ct) |
if (strlen(s) != sc - ct) |
Line 87 www_cmptype(const char *ct, const char *type)
|
Line 87 www_cmptype(const char *ct, const char *type)
|
|
|
assert(ct && type); |
assert(ct && type); |
|
|
while (isspace(*ct)) | while (isspace((int) *ct)) |
ct++; |
ct++; |
|
|
if (!(sl = strchr(ct, '/'))) |
if (!(sl = strchr(ct, '/'))) |
Line 103 www_cmptype(const char *ct, const char *type)
|
Line 103 www_cmptype(const char *ct, const char *type)
|
* |
* |
* @str = query string |
* @str = query string |
* @delim = delimiter |
* @delim = delimiter |
* return: NULL error or AV pair, must be free() after use! | * return: NULL error or AV pair, must be io_free() after use! |
*/ |
*/ |
char * | ait_val_t * |
www_getpair(char ** __restrict str, const char *delim) |
www_getpair(char ** __restrict str, const char *delim) |
{ |
{ |
char *tr, *s = NULL; | char *tr; |
int cx; |
int cx; |
|
ait_val_t *s; |
|
|
assert(str && *str && delim); |
assert(str && *str && delim); |
|
|
|
s = io_allocVar(); |
|
if (!s) { |
|
www_SetErr(io_GetErrno(), "%s", io_GetError()); |
|
return NULL; |
|
} |
|
|
cx = strcspn(*str, delim); |
cx = strcspn(*str, delim); |
tr = *str + cx; |
tr = *str + cx; |
|
if (*tr) |
|
*tr++ = 0; |
|
|
s = malloc(cx + 1); | AIT_SET_STR(s, *str); |
if (!s) { | |
LOGERR; | |
return NULL; | |
} else | |
strlcpy(s, *str, cx + 1); | |
|
|
*str = tr; |
*str = tr; |
if (**str) |
|
(*str)++; |
|
|
|
return s; |
return s; |
} |
} |
|
|
Line 161 www_unescape(char * __restrict str)
|
Line 162 www_unescape(char * __restrict str)
|
{ |
{ |
register int i, j; |
register int i, j; |
|
|
assert(str); | if (!str) |
| return; |
|
|
for (i = j = 0; str[j]; i++, j++) { |
for (i = j = 0; str[j]; i++, j++) { |
str[i] = str[j]; |
str[i] = str[j]; |
Line 175 www_unescape(char * __restrict str)
|
Line 177 www_unescape(char * __restrict str)
|
} |
} |
|
|
str[i] = 0; |
str[i] = 0; |
|
} |
|
|
|
/* |
|
* www_undot() - Undotted and clean WWW query filename |
|
* |
|
* @fname = query filename |
|
* @fnlen = filename length |
|
* return: -1 error, 0 not valid filename or >0 validated filename length |
|
*/ |
|
int |
|
www_undot(const char * __restrict fname, int fnlen) |
|
{ |
|
char *s, *s2; |
|
int l; |
|
|
|
if (!fname || !fnlen) |
|
return -1; |
|
|
|
/* collapse / sequences */ |
|
if ((s = strstr(fname, "//"))) { |
|
s2 = s + 1; |
|
for (s2 = ++s; *s2 == '/'; s2++); |
|
memmove(s, s2, strlen(s2) + 1); |
|
} |
|
|
|
/* escaped ./ and /./ sequences */ |
|
while (!strncmp(fname, "./", 2)) |
|
memmove((void*) fname, fname + 2, strlen(fname + 1)); |
|
while ((s = strstr(fname, "/./"))) |
|
memmove(s, s + 2, strlen(s + 1)); |
|
|
|
/* alternate between removing leading ../ and removing xxx/../ */ |
|
while (42) { |
|
while (!strncmp(fname, "../", 3)) |
|
memmove((void*) fname, fname + 3, strlen(fname + 2)); |
|
if (!(s = strstr(fname, "/../"))) |
|
break; |
|
for (s2 = s - 1; s2 >= fname && *s2 != '/'; --s2); |
|
memmove(s2 + 1, s + 4, strlen(s + 3)); |
|
} |
|
|
|
/* elide any /.. at the end */ |
|
while ((l = strlen(fname)) > 3 && |
|
!strcmp((s = (char*) fname + l - 3), "/..")) { |
|
for (s2 = s - 1; s2 >= fname && *s2 != '/'; --s2); |
|
if (s2 < fname) |
|
break; |
|
*s2 = 0; |
|
} |
|
|
|
/* if filename is empry add current dir */ |
|
if (!*fname) |
|
strlcpy((char*) fname, "./", fnlen); |
|
|
|
/* check for valid filename */ |
|
if (*fname == '/' || (fname[0] == '.' && fname[1] == '.' && |
|
(!fname[2] || fname[2] == '/'))) |
|
return 0; |
|
|
|
return strlen(fname); |
} |
} |