Support functions for transmitted files
authorJoey Schulze <joey@infodrom.org>
Thu, 13 Dec 2007 18:44:33 +0000 (18:44 +0000)
committerJoey Schulze <joey@infodrom.org>
Thu, 13 Dec 2007 18:44:33 +0000 (18:44 +0000)
cgi.c
cgi.h

diff --git a/cgi.c b/cgi.c
index e274e5a..f1fa9a0 100644 (file)
--- 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 (file)
--- 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()