manage content-encoding
[webserver.git] / file.c
diff --git a/file.c b/file.c
index 472ab4252a16e5b9d719733c3295155fbb9f3972..fdcd1ee711f5eb1a194004fcba6a9eb6bbbb98c3 100644 (file)
--- a/file.c
+++ b/file.c
@@ -16,10 +16,10 @@ int readfile (char **buffer, char *filename)
 
     /* open file */
 
-    VERBOSE (DEBUG, PRINT ("Opening file %s\n", filename));
+    VERBOSE (DEBUG, PRINT ("Opening file %s for reading\n", filename));
     FILE *fd = fopen (filename, "rb");
     if (fd == NULL) {
-        VERBOSE (WARNING, PRINT ("Can't open file (%s)\n", filename));
+        VERBOSE (WARNING, PRINT ("Can't open file (%s) for reading\n", filename));
         return -1;
     }
 
@@ -32,28 +32,60 @@ int readfile (char **buffer, char *filename)
 
     VERBOSE (DEBUG, PRINT ("Reading %d bytes\n", size));
     *buffer = calloc (size + 1, 1);
-    fread (*buffer, size, 1, fd);
+    int len = fread (*buffer, size, 1, fd);
+    if (len != size) {
+        VERBOSE (WARNING, PRINT ("Can't read full file (%s)\n", filename));
+    }
     fclose (fd);
 
-    (*buffer)[size] = 0;
-    return size;
+    (*buffer)[len] = 0;
+    return len;
 }
 
 /* temp name */
 
-char *tempname (char *tempdir)
+char *tempname (char *tempdir, char *ext)
 {
     char table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_";
 
-    unsigned int len = strlen (tempdir) + 1 + 4 + TLEN + 1;
+    unsigned int len = strlen (tempdir) + 1 + 4 + TLEN + ((ext) ? strlen (ext) : 0) + 1;
     char *name = (char *) calloc (len, 1);
 
     sprintf (name, "%s/tmp-", tempdir);
-    while (strlen (name) + 1 < len) {
+    while (strlen (name) + 1 < len - ((ext) ? strlen (ext) : 0)) {
         name[strlen (name)] = table[rand () % 64];
     }
+    if (ext) {
+        strcat (name, ext);
+    }
 
     return name;
 }
 
+/* write full file */
+
+int writefile (char *filename, char *buffer, int size)
+{
+
+    /* open file */
+
+    VERBOSE (DEBUG, PRINT ("Opening file %s for writing\n", filename));
+    FILE *fd = fopen (filename, "wb");
+    if (fd == NULL) {
+        VERBOSE (WARNING, PRINT ("Can't open file (%s) for writing\n", filename));
+        return -1;
+    }
+
+    /* write full file */
+
+    VERBOSE (DEBUG, PRINT ("Writing %d bytes\n", size));
+    int len = fwrite (buffer, size, 1, fd);
+    if (len != size) {
+        VERBOSE (WARNING, PRINT ("Can't write full file (%s)\n", filename));
+    }
+    fclose (fd);
+
+    return len;
+}
+
 /* vim: set ts=4 sw=4 et: */