version 1.1.1.1.2.1, 2012/03/09 09:38:55
|
version 1.3.4.1, 2012/07/31 11:56:16
|
Line 44 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH
|
Line 44 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH
|
SUCH DAMAGE. |
SUCH DAMAGE. |
*/ |
*/ |
#include "global.h" |
#include "global.h" |
#include "tools.h" |
|
#include "mime.h" |
#include "mime.h" |
|
|
|
|
Line 76 www_SetErr(int eno, char *estr, ...)
|
Line 75 www_SetErr(int eno, char *estr, ...)
|
va_list lst; |
va_list lst; |
|
|
www_Errno = eno; |
www_Errno = eno; |
memset(www_Error, 0, STRSIZ); | memset(www_Error, 0, sizeof www_Errno); |
va_start(lst, estr); |
va_start(lst, estr); |
vsnprintf(www_Error, STRSIZ, estr, lst); | vsnprintf(www_Error, sizeof www_Errno, estr, lst); |
va_end(lst); |
va_end(lst); |
} |
} |
|
|
Line 99 www_initCGI(void)
|
Line 98 www_initCGI(void)
|
|
|
str = getenv("REQUEST_METHOD"); |
str = getenv("REQUEST_METHOD"); |
if (!str) { |
if (!str) { |
www_SetErr(EBADMSG, "Request method not found"); | www_SetErr(EFAULT, "Request method not found"); |
return NULL; |
return NULL; |
} |
} |
if (!strcmp(str, "GET") || !strcmp(str, "HEAD")) { |
if (!strcmp(str, "GET") || !strcmp(str, "HEAD")) { |
/* GET | HEAD */ |
/* GET | HEAD */ |
str = getenv("QUERY_STRING"); |
str = getenv("QUERY_STRING"); |
if (!str) { |
if (!str) { |
www_SetErr(EBADMSG, "Query string not found"); | www_SetErr(EFAULT, "Query string not found"); |
return NULL; |
return NULL; |
} |
} |
cgi = www_parseQuery(str); |
cgi = www_parseQuery(str); |
Line 114 www_initCGI(void)
|
Line 113 www_initCGI(void)
|
/* POST */ |
/* POST */ |
str = getenv("CONTENT_LENGTH"); |
str = getenv("CONTENT_LENGTH"); |
if (!str) { |
if (!str) { |
www_SetErr(EBADMSG, "Content length not found"); | www_SetErr(EFAULT, "Content length not found"); |
return NULL; |
return NULL; |
} else |
} else |
ctlen = strtol(str, NULL, 0); |
ctlen = strtol(str, NULL, 0); |
|
|
s = getenv("CONTENT_TYPE"); |
s = getenv("CONTENT_TYPE"); |
if (!s) { |
if (!s) { |
www_SetErr(EBADMSG, "Content type not found"); | www_SetErr(EFAULT, "Content type not found"); |
return NULL; |
return NULL; |
} |
} |
if (www_cmp(s, "multipart/form-data") && |
if (www_cmp(s, "multipart/form-data") && |
www_cmp(s, "application/x-www-form-urlencoded")) { |
www_cmp(s, "application/x-www-form-urlencoded")) { |
www_SetErr(EBADMSG, "MIME parts are broken"); | www_SetErr(EFAULT, "MIME parts are broken"); |
return NULL; |
return NULL; |
} |
} |
|
|
Line 135 www_initCGI(void)
|
Line 134 www_initCGI(void)
|
if (!str) { |
if (!str) { |
LOGERR; |
LOGERR; |
return NULL; |
return NULL; |
} | } else |
| memset(str, 0, ctlen + 1); |
for (i = 0; i < ctlen && (rlen = |
for (i = 0; i < ctlen && (rlen = |
read(STDIN_FILENO, (void*) str + i, ctlen - i)) > 0; i += rlen); |
read(STDIN_FILENO, (void*) str + i, ctlen - i)) > 0; i += rlen); |
str[ctlen] = 0; |
str[ctlen] = 0; |
Line 148 www_initCGI(void)
|
Line 148 www_initCGI(void)
|
free(str); |
free(str); |
} else { |
} else { |
/* Unknown method */ |
/* Unknown method */ |
www_SetErr(EBADMSG, "Unknown request method"); | www_SetErr(EFAULT, "Unknown request method"); |
return NULL; |
return NULL; |
} |
} |
|
|
Line 324 www_addValue(cgi_t * __restrict cgi, const char *name,
|
Line 324 www_addValue(cgi_t * __restrict cgi, const char *name,
|
int |
int |
www_delPair(cgi_t * __restrict cgi, const char *name) |
www_delPair(cgi_t * __restrict cgi, const char *name) |
{ |
{ |
struct tagCGI *t; | struct tagCGI *t, *tmp; |
|
|
if (!cgi || !name) { |
if (!cgi || !name) { |
www_SetErr(EINVAL, "Invalid argument(s)"); |
www_SetErr(EINVAL, "Invalid argument(s)"); |
Line 332 www_delPair(cgi_t * __restrict cgi, const char *name)
|
Line 332 www_delPair(cgi_t * __restrict cgi, const char *name)
|
} |
} |
|
|
/* search for delete */ |
/* search for delete */ |
SLIST_FOREACH(t, cgi, cgi_node) | SLIST_FOREACH_SAFE(t, cgi, cgi_node, tmp) |
if (t->cgi_name && !strcmp(name, t->cgi_name)) { |
if (t->cgi_name && !strcmp(name, t->cgi_name)) { |
SLIST_REMOVE(cgi, t, tagCGI, cgi_node); |
SLIST_REMOVE(cgi, t, tagCGI, cgi_node); |
|
|
|
if (t->cgi_name) |
|
free(t->cgi_name); |
|
if (t->cgi_value) |
|
free(t->cgi_value); |
|
free(t); |
return 1; |
return 1; |
} |
} |
|
|
Line 342 www_delPair(cgi_t * __restrict cgi, const char *name)
|
Line 348 www_delPair(cgi_t * __restrict cgi, const char *name)
|
} |
} |
|
|
/* |
/* |
|
* www_listPairs() - Walk over CGI session variables |
|
* |
|
* @cgi = Cgi session |
|
* @func = If !=NULL call function for each element |
|
* @arg = Optional argument pass through callback |
|
* return: -1 error or >-1 number of elements |
|
*/ |
|
inline int |
|
www_listPairs(cgi_t * __restrict cgi, list_cb_t func, void *arg) |
|
{ |
|
register int ret = 0; |
|
struct tagCGI *t; |
|
|
|
if (!cgi) { |
|
www_SetErr(EINVAL, "Invalid CGI session argument"); |
|
return -1; |
|
} |
|
|
|
SLIST_FOREACH(t, cgi, cgi_node) { |
|
ret++; |
|
|
|
if (func) |
|
func(t, arg); |
|
} |
|
|
|
return ret; |
|
} |
|
|
|
/* |
* www_header() - Output initial html header |
* www_header() - Output initial html header |
* |
* |
* @output = file handle |
* @output = file handle |
Line 489 www_parseMultiPart(const char *str, int ctlen, const c
|
Line 524 www_parseMultiPart(const char *str, int ctlen, const c
|
} |
} |
mime = mime_parseMultiPart(str, ctlen, www_getAttribute(attr, "boundary"), NULL); |
mime = mime_parseMultiPart(str, ctlen, www_getAttribute(attr, "boundary"), NULL); |
www_freeAttributes(&attr); |
www_freeAttributes(&attr); |
|
if (!mime) { |
|
www_closeCGI(&cgi); |
|
return NULL; |
|
} |
|
|
SLIST_FOREACH(m, mime, mime_node) { |
SLIST_FOREACH(m, mime, mime_node) { |
s = mime_getValue(m, "content-disposition"); |
s = mime_getValue(m, "content-disposition"); |
attr = www_parseAttributes(&s); |
attr = www_parseAttributes(&s); |
|
if (!www_getAttribute(attr, "name")) { |
|
www_freeAttributes(&attr); |
|
continue; |
|
} |
|
|
t = malloc(sizeof(struct tagCGI)); |
t = malloc(sizeof(struct tagCGI)); |
if (!t) { |
if (!t) { |