--- libaitwww/src/aitwww.c 2012/03/08 23:40:21 1.1.1.1 +++ libaitwww/src/aitwww.c 2012/03/09 16:09:38 1.1.1.1.2.6 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitwww.c,v 1.1.1.1 2012/03/08 23:40:21 misho Exp $ +* $Id: aitwww.c,v 1.1.1.1.2.6 2012/03/09 16:09:38 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -135,7 +135,8 @@ www_initCGI(void) if (!str) { LOGERR; return NULL; - } + } else + memset(str, 0, ctlen + 1); for (i = 0; i < ctlen && (rlen = read(STDIN_FILENO, (void*) str + i, ctlen - i)) > 0; i += rlen); str[ctlen] = 0; @@ -235,7 +236,7 @@ www_parseQuery(const char *str) } free(base); - return 0; + return cgi; } /* @@ -257,9 +258,9 @@ www_getValue(cgi_t * __restrict cgi, const char *name) SLIST_FOREACH(t, cgi, cgi_node) if (t->cgi_name && !strcmp(name, t->cgi_name)) - break; + return t->cgi_value; - return t->cgi_value; + return NULL; } /* @@ -307,7 +308,10 @@ www_addValue(cgi_t * __restrict cgi, const char *name, if (value) tmp->cgi_value = strdup(value); - SLIST_INSERT_AFTER(t, tmp, cgi_node); + if (!t) + SLIST_INSERT_HEAD(cgi, tmp, cgi_node); + else + SLIST_INSERT_AFTER(t, tmp, cgi_node); return 0; } @@ -321,7 +325,7 @@ www_addValue(cgi_t * __restrict cgi, const char *name, int www_delPair(cgi_t * __restrict cgi, const char *name) { - struct tagCGI *t; + struct tagCGI *t, *tmp; if (!cgi || !name) { www_SetErr(EINVAL, "Invalid argument(s)"); @@ -329,9 +333,15 @@ www_delPair(cgi_t * __restrict cgi, const char *name) } /* 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)) { 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; } @@ -339,6 +349,35 @@ 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 * * @output = file handle @@ -486,10 +525,18 @@ www_parseMultiPart(const char *str, int ctlen, const c } mime = mime_parseMultiPart(str, ctlen, www_getAttribute(attr, "boundary"), NULL); www_freeAttributes(&attr); + if (!mime) { + www_closeCGI(&cgi); + return NULL; + } SLIST_FOREACH(m, mime, mime_node) { s = mime_getValue(m, "content-disposition"); attr = www_parseAttributes(&s); + if (!www_getAttribute(attr, "name")) { + www_freeAttributes(&attr); + continue; + } t = malloc(sizeof(struct tagCGI)); if (!t) {