From f542134058abb88434706973a99d019182eff58f Mon Sep 17 00:00:00 2001 From: Joey Schulze Date: Thu, 13 Dec 2007 18:44:33 +0000 Subject: [PATCH] Support functions for transmitted files --- cgi.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- cgi.h | 14 +++++++++++- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/cgi.c b/cgi.c index e274e5a..f1fa9a0 100644 --- a/cgi.c +++ b/cgi.c @@ -477,7 +477,8 @@ s_cgi *cgiReadVariables () s_cgi *res; cp = getenv("CONTENT_TYPE"); - cgiDebugOutput (2, "Content-Type: %s", cp); + if (cp) + cgiDebugOutput (2, "Content-Type: %s", cp); if (cp && strstr(cp, "multipart/form-data") && strstr(cp, "boundary=")) { cp = strstr(cp, "boundary=") + strlen ("boundary=") - 2; *cp = *(cp+1) = '-'; @@ -488,8 +489,11 @@ s_cgi *cgiReadVariables () return NULL; cp = getenv("REQUEST_METHOD"); - cgiDebugOutput (2, "REQUEST_METHOD: %s", cp); + if (cp) + cgiDebugOutput (2, "REQUEST_METHOD: %s", cp); ip = getenv("CONTENT_LENGTH"); + if (ip) + cgiDebugOutput (2, "CONTENT_LENGTH: %s", ip); if (cp && !strcmp(cp, "POST")) { if (ip) { @@ -689,6 +693,54 @@ char **cgiGetVariables (s_cgi *parms) return res; } +/* cgiGetFiles + * + * Returns a list of names of all files. + */ +char **cgiGetFiles (s_cgi *parms) +{ + int i; + char **res = NULL; + int len; + + if (!parms || !parms->files) + return NULL; + + for (i=0;parms->files[i]; i++); + len = sizeof (char *) * ++i; + if ((res = (char **)malloc (len)) == NULL) + return NULL; + memset (res, 0, len); + for (i=0;parms->files[i]; i++) { + len = strlen (parms->files[i]->name) +1; + if ((res[i] = (char *)malloc (len)) == NULL) + return NULL; + memset (res[i], 0, len); + strcpy (res[i], parms->files[i]->name); + } + return res; +} + +/* cgiGetFile + * + * Return data structure for CGI file variable + */ +s_file *cgiGetFile (s_cgi *parms, const char *name) +{ + int i; + + if (!parms || !parms->files) + return NULL; + + for (i=0;parms->files[i]; i++) + if (!strcmp(name,parms->files[i]->name)) { + cgiDebugOutput (1, "%s found as %s", name, parms->files[i]->filename); + return parms->files[i]; + } + cgiDebugOutput (1, "%s not found", name); + return NULL; +} + void cgiRedirect (const char *url) { if (url && strlen(url)) { @@ -740,6 +792,20 @@ void cgiFree (s_cgi *parms) } free (parms->cookies); } + if (parms->files) { + for (i=0;parms->files[i]; i++) { + if (parms->files[i]->name) + free (parms->files[i]->name); + if (parms->files[i]->type) + free (parms->files[i]->type); + if (parms->files[i]->filename) + free (parms->files[i]->filename); + if (parms->files[i]->tmpfile) + free (parms->files[i]->tmpfile); + free (parms->files[i]); + } + free (parms->files); + } free (parms); if (cgiHeaderString) { diff --git a/cgi.h b/cgi.h index 79e438e..a48d4b2 100644 --- a/cgi.h +++ b/cgi.h @@ -104,10 +104,22 @@ s_cookie *cgiGetCookie (s_cgi *parms, const char *name); /* cgiGetCookies * - * Returns a list of name of all cookies. + * Returns a list of names of all cookies. */ char **cgiGetCookies (s_cgi *parms); +/* cgiGetFiles + * + * Returns a list of names of all files. + */ +char **cgiGetFiles (s_cgi *parms); + +/* cgiGetFile + * + * Return data structure for CGI file variable + */ +s_file *cgiGetFile (s_cgi *parms, const char *name); + /* cgiFreeList * * Frees a list as returned by cgiGetVariables() and cgiGetCookies() -- 2.20.1