hermes

HTTP GET/HEAD-only web server for static content.
git clone git://git.francescosaccone.com/hermes
Log | Files | Refs | README | LICENSE

commit ca50a393a3c32b286a1f323ff85247941819ea9c
parent cc28872545635bfae01e9afbb1efb5370e8fa300
Author: Francesco Saccone <francesco@francescosaccone.com>
Date:   Mon, 31 Mar 2025 15:49:22 +0200

feat: add -d flag for directory to server and chroot in

Signed-off-by: Francesco Saccone <francesco@francescosaccone.com>

Diffstat:
Mmain.c | 18+++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/main.c b/main.c @@ -8,19 +8,22 @@ #include "socket.h" #include "utils.h" +#define DIRECTORY_MAX_LENGTH 1024 #define DIRECTORY_INDEX_MAX_LENGTH 32 #define USER_NAME_MAX_LENGTH 32 #define GROUP_NAME_MAX_LENGTH 32 void print_usage(char *program_name) { - print_error("usage: %s [-p port] [-i file] [-u user] [-g group]", + print_error("usage: %s -d directory [-p port] [-i file] [-u user] " + "[-g group]", program_name); } int main(int argc, char *argv[]) { char *program_name = argv[0], + directory[DIRECTORY_MAX_LENGTH], user_name[USER_NAME_MAX_LENGTH] = "nobody", group_name[GROUP_NAME_MAX_LENGTH] = "nogroup", directory_index[DIRECTORY_INDEX_MAX_LENGTH] = "index.html"; @@ -41,6 +44,19 @@ main(int argc, char *argv[]) { } switch (argument[1]) { + case 'd': + if (strlen(argv[i + 1]) >= DIRECTORY_MAX_LENGTH) { + print_error("error: directory length must be less than " + "%u characters", + DIRECTORY_MAX_LENGTH); + } + snprintf(directory, + sizeof(directory), + "%s", + argv[i + 1]); + directory[sizeof(directory) - 1] = '\0'; + i++; + break; case 'p': port = atoi(argv[i + 1]); if (port < 1 || port > 65535) {