From 23dc8e12d896764952c8b0166017980f3d6efee7 Mon Sep 17 00:00:00 2001 From: Soikk Date: Thu, 16 Oct 2025 19:31:35 +0200 Subject: idek config changes --- src/main.c | 77 +++++++++++++++++++++++++++++++++++++++------------- src/worker.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 135 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index 3752321..d2e48fe 100755 --- a/src/main.c +++ b/src/main.c @@ -12,8 +12,11 @@ #define BACKLOG 15 config_m config; -str server_dir; -str ipc_addr; +struct { + str path; + str ipc_addr; + str workers; +} dir; http_server *server; ipc_sender *sender; struct worker { @@ -29,22 +32,40 @@ void worker_undertaker(int sig, siginfo_t *info, void *ucontext){ } } -int init(char *configfile){ - config = master_config(configfile); - server_dir = dup_strs(sstr("/var/run/"), config.name, sstr("/")); - if(!dir_exists(server_dir.ptr)){ - if(mkdir(server_dir.ptr, 0770) != 0){ - log_error("Error creating server directory in '%.*s': %s", server_dir.len, server_dir.ptr, strerror(errno)); +int create_server_dir(str name){ + dir.path = dup_strs(sstr("/var/run/"), name, sstr("/")); + if(!dir_exists(dir.path.ptr)){ + if(mkdir(dir.path.ptr, 0777) != 0){ + log_error("Error creating server directory in '%.*s': %s", dir.path.len, dir.path.ptr, strerror(errno)); + return 1; + } + } + dir.ipc_addr = dup_strs(dir.path, sstr("ipcserver")); + if(path_exists(dir.ipc_addr.ptr)){ + if(remove(dir.ipc_addr.ptr) != 0){ + log_error("Error removing existing IPC socket '%.*s': %s", dir.ipc_addr.len, dir.ipc_addr.ptr, strerror(errno)); return 1; } } - ipc_addr = dup_strs(server_dir, sstr("ipcserver")); - if(path_exists(ipc_addr.ptr)){ - if(remove(ipc_addr.ptr) != 0){ - log_error("Error removing existing IPC socket '%.*s': %s", ipc_addr.len, ipc_addr.ptr, strerror(errno)); + dir.workers = dup_strs(dir.path, sstr("workers/")); + if(!dir_exists(dir.workers.ptr)){ + if(mkdir(dir.workers.ptr, 0777) != 0){ + log_error("Error creating workers directory in '%.*s': %s", dir.workers.len, dir.workers.ptr, strerror(errno)); return 1; } } + return 0; +} + +int init(char *configfile){ + config = master_config(configfile); + if(config.name.len == 0){ + log_error("Error: no name for server provided in config"); + return 1; + } + if(create_server_dir(config.name) != 0){ + return 1; + } // decouple so the whole net.c doesnt get linked? str port = utostr(config.port, 10); server = setup_http_server(port, BACKLOG); @@ -54,7 +75,7 @@ int init(char *configfile){ return 1; } // configurable name? - sender = setup_ipc_sender(ipc_addr, BACKLOG); + sender = setup_ipc_sender(dir.ipc_addr, BACKLOG); if(sender == NULL){ log_error("Error setting up ipc sender"); return 1; @@ -68,11 +89,25 @@ int init(char *configfile){ return 0; } +void remove_server_dir(void){ + // remove workers entries first + if(remove(dir.workers.ptr) != 0){ + log_error("Error removing workers directory in '%.*s': %s", dir.workers.len, dir.workers.ptr, strerror(errno)); + } + free_str(&dir.workers); + if(remove(dir.ipc_addr.ptr) != 0){ + log_error("Error removing IPC socket '%.*s': %s", dir.ipc_addr.len, dir.ipc_addr.ptr, strerror(errno)); + } + free_str(&dir.ipc_addr); + if(remove(dir.path.ptr) != 0){ + log_error("Error removing server directory in '%.*s': %s", dir.path.len, dir.path.ptr, strerror(errno)); + } + free_str(&dir.path); +} + void deinit(void){ free_master_config(&config); - // clean up server dir - free_str(&server_dir); - free_str(&ipc_addr); + remove_server_dir(); destroy_http_server(&server); destroy_ipc_sender(&sender); list_free(workers); @@ -143,7 +178,7 @@ int main(int argc, char *argv[]){ case 'f': case 'F': pid_t nw = fork(); if(nw == 0){ - char *args[] = {"./worker.exe", ipc_addr.ptr, NULL}; + char *args[] = {"./worker.exe", dir.ipc_addr.ptr, NULL}; execv("./worker.exe", args); log_error("Cannot exec worker: %s", strerror(errno)); return 1; @@ -152,7 +187,9 @@ int main(int argc, char *argv[]){ list_push(workers, w); send_ipc_message(w.wsocket, CERT, sstr("ssl/cert.pem")); send_ipc_message(w.wsocket, KEY, sstr("ssl/key.pem")); - send_ipc_message(w.wsocket, SOCKET, utostr(server->ssocket, 10)); + str ss = utostr(server->ssocket, 10); + send_ipc_message(w.wsocket, SOCKET, ss); + free_str(&ss); send_ipc_message(w.wsocket, REWRITES, sstr("urirewrites")); //send_ipc_message(w.wsocket, HTTPS, sstr("")); break; @@ -190,7 +227,8 @@ int main(int argc, char *argv[]){ break; case 'q': case 'Q': while(list_size(workers) > 0){ - kill(workers[0].pid, SIGKILL); // redo this PLEASE + shutdown(workers[0].wsocket, SHUT_RDWR); + //kill(workers[0].pid, SIGQUIT); // redo this PLEASE waitpid(workers[0].pid, NULL, 0); } while(wait(NULL) > 0); @@ -210,6 +248,7 @@ int main(int argc, char *argv[]){ DEINIT: deinit(); + log_info("Finished cleaning up"); return return_value; } diff --git a/src/worker.c b/src/worker.c index cfdb59c..5050887 100755 --- a/src/worker.c +++ b/src/worker.c @@ -4,12 +4,23 @@ #include "str/str.h" #include "ipc/ipc.h" #include "net/net.h" +#include "config/config.h" +config_w config; +struct { + str path; + str ipc_addr; + str self; +} dir; ipc_listener *listener; http_worker *worker; + +// remove these or something int secure; str rewritesfile; +str rootdir; +str bundlefile; str certfile; str keyfile; struct pollfd fds[2] = {0}; @@ -43,13 +54,19 @@ void handle_message(ipc_msg im){ munmap(rewritesfile.ptr, fsize); close(fd); break; - case CERT: - // look into reinitializing the worker when receiving this + //case ROOT: + // free_str(&rootdir); + // rootdir = dup_str(im.msg); + // break; + case BUNDLE: // look into reinitializing the worker when receiving this + free_str(&bundlefile); + bundlefile = dup_str(im.msg); + break; + case CERT: // look into reinitializing the worker when receiving this free_str(&certfile); certfile = dup_str(im.msg); break; - case KEY: - // look into reinitializing the worker when receiving this + case KEY: // look into reinitializing the worker when receiving this free_str(&keyfile); keyfile = dup_str(im.msg); break; @@ -61,6 +78,7 @@ void handle_message(ipc_msg im){ break; case RELOAD: // re-reads config + // re-requests entire config; break; case HTTP: log_info("received http signal"); @@ -85,11 +103,57 @@ void handle_message(ipc_msg im){ } } +// possibly change name + +int create_server_dir(str name){ + dir.path = dup_strs(sstr("/var/run/"), name, sstr("/")); + dir.ipc_addr = dup_strs(dir.path, sstr("ipcserver")); + str pid = utostr(getpid(), 10); + dir.self = dup_strs(dir.path, sstr("workers/"), pid); + printf("WE'RE GONNA CREATE THE FILE %s\n", dir.self.ptr); + free_str(&pid); + if(file_exists(dir.self.ptr)){ + log_error("Error creating PID record for self in '%.*s': it already exists", dir.self.len, dir.self.ptr); + return 1; + } + if(creat(dir.self.ptr, 0777) == -1){ + log_error("Error creating PID record for self in '%.*s': %s", dir.self.len, dir.self.ptr, strerror(errno)); + return 1; + } + return 0; +} + +int init(char *configfile){ + config = worker_config(configfile); + if(create_server_dir(config.name) != 0){ + return 1; + } + return 0; +} + +// possibly change name +void remove_server_dir(void){ + if(remove(dir.self.ptr) != 0){ + log_error("Error removing PID record for self in '%.*s': %s", dir.self.len, dir.self.ptr, strerror(errno)); + } + printf("%s IS NO MORE!", dir.self.ptr); + free_str(&dir.self); + free_str(&dir.ipc_addr); + free_str(&dir.path); +} + +void deinit(void){ + free_worker_config(&config); + remove_server_dir(); +} + int main(int argc, char **argv){ int return_value = 0; + init("config"); + listener = setup_ipc_listener((str){.cap = 0, .len = len(argv[1]), .ptr = argv[1]}); if(listener == NULL){ log_error("Can't set up ipc listener on worker %d", getpid()); @@ -98,7 +162,7 @@ int main(int argc, char **argv){ } log_info("init'd"); - bool end = false; + //bool end = false; log_debug("erm"); str request = {.cap = 8192, .len = 0, .ptr = alloca(8192)}; @@ -109,13 +173,14 @@ int main(int argc, char **argv){ if(r > 0){ log_info("[%d] %d\t-\t%d", fds[1].fd, fds[1].events & POLLIN, fds[1].revents & POLLIN); } - if(fds[0].revents & POLLIN){ + if(fds[0].revents & POLLHUP){ + log_info("RECEIVED POLLHUP!!!!!!"); + // end? or something idk + }else if(fds[0].revents & POLLIN){ ipc_msg msg = receive_ipc_message(listener); handle_message(msg); free_ipc_message(&msg); continue; - }else if(fds[0].revents & POLLHUP){ - // end? or something idk }else if(fds[1].revents & POLLIN){ log_info("ermmm"); char cip[INET_ADDRSTRLEN] = {0}; @@ -150,10 +215,10 @@ int main(int argc, char **argv){ switch(method){ case GET: - struct file resource = generate_resource(suri, hm.uri); - send_file(worker, resource.name); + str resource = generate_resource(suri, hm.uri); + send_file(worker, resource); //if(resource.temp == true) remove(resource.name.ptr); - free_str(&resource.name); + free_str(&resource); break; case POST: //handlePOST(request); @@ -185,6 +250,7 @@ int main(int argc, char **argv){ } DEINIT: + deinit(); log_info("dieing :("); destroy_ipc_listener(&listener); destroy_http_worker(&worker); -- cgit v1.2.3