From aa628d4eb5134aeb74f06708f19c7dd5e35a331d Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Fri, 2 Jun 2023 15:31:08 +0200 Subject: [PATCH] add temporary directory --- file.c | 20 ++++++++++++++++++++ file.h | 2 ++ http.h | 1 + webserver.c | 45 +++++++++++++++++++++++++++++++++++++++------ 4 files changed, 62 insertions(+), 6 deletions(-) diff --git a/file.c b/file.c index 47f91a7..472ab42 100644 --- a/file.c +++ b/file.c @@ -1,11 +1,14 @@ #include #include #include +#include #include "debug.h" #include "file.h" +#define TLEN 8 + /* read full file */ int readfile (char **buffer, char *filename) @@ -36,4 +39,21 @@ int readfile (char **buffer, char *filename) return size; } +/* temp name */ + +char *tempname (char *tempdir) +{ + char table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_"; + + unsigned int len = strlen (tempdir) + 1 + 4 + TLEN + 1; + char *name = (char *) calloc (len, 1); + + sprintf (name, "%s/tmp-", tempdir); + while (strlen (name) + 1 < len) { + name[strlen (name)] = table[rand () % 64]; + } + + return name; +} + /* vim: set ts=4 sw=4 et: */ diff --git a/file.h b/file.h index c6edd0d..106f881 100644 --- a/file.h +++ b/file.h @@ -3,6 +3,8 @@ int readfile (char **buffer, char *filename); +char *tempname (char *tempdir); + #endif /* __FILE_H__ */ /* vim: set ts=4 sw=4 et: */ diff --git a/http.h b/http.h index d25fa69..193698e 100644 --- a/http.h +++ b/http.h @@ -5,6 +5,7 @@ typedef struct { char *root; + char *temp; char *servername; char *charset; } conf_t; diff --git a/webserver.c b/webserver.c index 2f54227..bca0262 100644 --- a/webserver.c +++ b/webserver.c @@ -6,9 +6,11 @@ #include #include #include +#include #include #include "debug.h" +#include "file.h" #include "http.h" #include "server.h" @@ -18,6 +20,7 @@ #define BUFFER_SIZE 4096 #define ROOT_DIR "webroot" +#define TEMP_DIR "tmp" #define SERVER_NAME "localhost" #define CHARSET "iso-8859-1" @@ -28,6 +31,7 @@ char *progname = NULL; int port = 8080; char *root = ROOT_DIR; +char *temp = TEMP_DIR; char *servername = SERVER_NAME; char *charset = CHARSET; @@ -42,6 +46,7 @@ int usage (int ret) fprintf (fid, " -p : port number (%d)\n", port); fprintf (fid, " -r : web root directory (%s)\n", root); fprintf (fid, " -s : server name (%s)\n", servername); + fprintf (fid, " -t : temporay directory (%s)\n", temp); fprintf (fid, " -v : verbose level (%d)\n", verbose); return ret; @@ -95,6 +100,14 @@ int main (int argc, char *argv[]) return 1; } break; + case 'r': + arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; + if (arg == NULL) { + VERBOSE (ERROR, PERROR ("%s: missing directory name\n", progname); usage (1)); + return 1; + } + root = arg; + break; case 's': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; if (arg == NULL) { @@ -103,13 +116,13 @@ int main (int argc, char *argv[]) } servername = arg; break; - case 'r': + case 't': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; if (arg == NULL) { VERBOSE (ERROR, PERROR ("%s: missing directory name\n", progname); usage (1)); return 1; } - root = arg; + temp = arg; break; case 'v': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; @@ -125,17 +138,37 @@ int main (int argc, char *argv[]) } } + /* init seed */ + srand (time (NULL)); + /* check root directory */ VERBOSE (DEBUG, PRINT ("Check web root\n")); - DIR *pdir = opendir (root); - if (pdir == NULL) { + DIR *prootdir = opendir (root); + if (prootdir == NULL) { VERBOSE (ERROR, PERROR ("Can't read directory (%s)\n", root)); return 1; } - closedir (pdir); + closedir (prootdir); + + /* check temp directory */ + VERBOSE (DEBUG, PRINT ("Check temp dirweb root\n")); + DIR *ptempdir = opendir (temp); + if (ptempdir == NULL) { + VERBOSE (ERROR, PERROR ("Can't read directory (%s)\n", temp)); + return 1; + } + char *ntemp = tempname (temp); + FILE *ftemp = fopen (ntemp, "w"); + if (ftemp == NULL) { + VERBOSE (ERROR, PERROR ("Can't write temporary file (%s)\n", ntemp)); + return 1; + } + fclose (ftemp); + unlink (ntemp); + free (ntemp); /* configuration */ - conf_t conf = {root, servername, charset}; + conf_t conf = {root, temp, servername, charset}; /* init network stack */ VERBOSE (DEBUG, PRINT ("Initializing socket\n")); -- 2.30.2