diff options
| author | Soikk | 2025-04-20 20:38:45 +0200 |
|---|---|---|
| committer | Soikk | 2025-04-20 20:38:45 +0200 |
| commit | da313c80664183885fb3a3ce9c01700ee8bc38bf (patch) | |
| tree | 2deb23473cad95a16b7c9ec9bd28e7b25b93141d /src/worker.c | |
| parent | d2ba110a8cc15ab4b967296cc02715f9c6e3cf21 (diff) | |
| download | soikk-server-da313c80664183885fb3a3ce9c01700ee8bc38bf.tar.xz soikk-server-da313c80664183885fb3a3ce9c01700ee8bc38bf.tar.zst | |
Changed Makefile line endings, upgraded IPC
Diffstat (limited to 'src/worker.c')
| -rwxr-xr-x | src/worker.c | 231 |
1 files changed, 114 insertions, 117 deletions
diff --git a/src/worker.c b/src/worker.c index c6384d0..cfdb59c 100755 --- a/src/worker.c +++ b/src/worker.c @@ -12,10 +12,12 @@ int secure; str rewritesfile; str certfile; str keyfile; +struct pollfd fds[2] = {0}; // make int for errors? void handle_message(ipc_msg im){ + log_debug("received message: [%d] (%d) %s", im.type, im.msg.len, im.msg.ptr); switch(im.type){ case NONE: break; case SOCKET: @@ -24,14 +26,30 @@ void handle_message(ipc_msg im){ } int ssocket = strtou(im.msg); worker = setup_http_worker(ssocket, secure, certfile, keyfile); + fds[1] = (struct pollfd){ .fd = worker->ssocket, .events = POLLIN }; break; case REWRITES: + int fsize = get_file_size(im.msg.ptr); + int fd = open(im.msg.ptr, O_RDONLY | O_NONBLOCK); + char *rewrites = mmap(NULL, fsize, PROT_READ, MAP_SHARED, fd, 0); + if(rewrites == (void*)-1){ + log_error("cant mmap rewrites: %s", strerror(errno)); + return; + } + if(read_uri_rewrites(rewrites, fsize) != 0){ + log_error("init: read_uri_rewrites: %s", strerror(errno)); + return; + } + munmap(rewritesfile.ptr, fsize); + close(fd); 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 free_str(&keyfile); keyfile = dup_str(im.msg); break; @@ -45,12 +63,19 @@ void handle_message(ipc_msg im){ // re-reads config break; case HTTP: - secure = 0; - terminate_https(worker); + log_info("received http signal"); + if(secure != 0){ + secure = 0; + terminate_https(worker); + } break; case HTTPS: - secure = 1; - setup_https(worker, certfile, keyfile); + log_info("received https signal"); + if(secure == 0){ + secure = 1; + setup_https(worker, certfile, keyfile); + } + break; case LOG: break; case UNLOG: @@ -59,140 +84,112 @@ void handle_message(ipc_msg im){ break; } } -int init(char *argv[]){ - // replace signals with unix sockets - // reinit - // finish - // toggle ssl - - str saddr = dstr(argv[1]); - listener = setup_ipc_listener(saddr); - free_str(&saddr); - if(listener == NULL){ - log_error("cant set up ipc listener on worker %d", getpid()); - return 1; - } - - // check key for value maybe idk - ipc_msg msg = receive_ipc_message(listener); - if(msg.type != SOCKET){ - log_error("uh oh"); - return 1; - } - int ssocket = strtou(msg.msg); - free_ipc_message(&msg); // v configurable certificate locations? - worker = setup_http_worker(ssocket, 1, sstr("ssl/mkarchive.net/certificate.crt"), sstr("ssl/mkarchive.net/private.key")); - if(worker == NULL){ - log_error("setting up http worker"); - return 1; - } - // this is disgusting and should be done elsewhere - msg = receive_ipc_message(listener); // check for value - if(msg.type != REWRITES){ - log_error("uh oh 2"); - return 1; - } - rewritesfile = dup_str(msg.msg); - free_ipc_message(&msg); - int fsize = get_file_size(rewritesfile.ptr); - int fd = open(rewritesfile.ptr, O_RDONLY | O_NONBLOCK); - char *rewrites = mmap(NULL, fsize, PROT_READ, MAP_SHARED, fd, 0); - if(rewrites == (void*)-1){ - log_error("cant mmap rewrites: %s", strerror(errno)); - return 1; - } - if(read_uri_rewrites(rewrites, fsize) != 0){ - log_error("init: read_uri_rewrites: %s", strerror(errno)); - return 1; - } - munmap(rewritesfile.ptr, fsize); - close(fd); - - return 0; -} - -void deinit(void){ - destroy_ipc_listener(&listener); - destroy_http_worker(&worker); - free_str(&rewritesfile); - free_uri_rewrites(); -} int main(int argc, char **argv){ int return_value = 0; - if(init(argv) != 0){ + 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()); return_value = 1; goto DEINIT; } log_info("init'd"); bool end = false; + log_debug("erm"); str request = {.cap = 8192, .len = 0, .ptr = alloca(8192)}; - while(!end){ - char cip[INET_ADDRSTRLEN] = {0}; - return_value = accept_connection(worker, cip); - switch(return_value){ - case -1: // couldnt accept, do something ig - continue; - case SSL_ERROR_SSL: - reset_https(worker); - log_info("continuing\n"); - continue; - } - log_info("socket %d accepted with ip %s", worker->csocket, cip); - return_value = receive_request(worker, &request); - switch(return_value){ - case -1: // couldnt accept, do something ig - continue; - case SSL_ERROR_SSL: - reset_https(worker); - log_info("continuing\n"); - continue; - } - printf("'%.*s'\n", request.len, request.ptr); - - struct http_message hm = {0}; - build_http_message(request.ptr, request.len, &hm); - log_info("uri before: %.*s", hm.uri.len, hm.uri.ptr); - struct uri suri = sanitize_uri(hm.uri); - log_info("uri after: %.*s", suri.path.len, suri.path.ptr); - enum http_method method = get_http_method(hm.method); - - switch(method){ - case GET: - struct file resource = generate_resource(suri, hm.uri); - send_file(worker, resource.name); - //if(resource.temp == true) remove(resource.name.ptr); - free_str(&resource.name); - break; - case POST: - //handlePOST(request); - send(worker->csocket, "HTTP/1.1 201 Created\r\n\r\n", len("HTTP/1.1 201 Created\r\n\r\n"), 0); - break; - case PUT: - break; - case DELETE: - break; - default: - break; + fds[0] = (struct pollfd){ .fd = listener->csocket, .events = POLLIN }; + + int r; + while((r = poll(fds, 2, 0)) != -1){ + if(r > 0){ + log_info("[%d] %d\t-\t%d", fds[1].fd, fds[1].events & POLLIN, fds[1].revents & POLLIN); } - free_str(&suri.path); - free_str(&suri.query); - request.len = 0; + 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}; + return_value = accept_connection(worker, cip); + switch(return_value){ + case -1: // couldnt accept, do something ig + continue; + case SSL_ERROR_SSL: + reset_https(worker); + log_info("continuing\n"); + continue; + } + log_info("socket %d accepted with ip %s", worker->csocket, cip); + return_value = receive_request(worker, &request); + switch(return_value){ + case -1: // couldnt accept, do something ig + continue; + case SSL_ERROR_SSL: + reset_https(worker); + log_info("continuing\n"); + continue; + } - SSL_clear(worker->ssl); - close(worker->csocket); + printf("'%.*s'\n", request.len, request.ptr); + + struct http_message hm = {0}; + build_http_message(request.ptr, request.len, &hm); + log_info("uri before: %.*s", hm.uri.len, hm.uri.ptr); + struct uri suri = sanitize_uri(hm.uri); + log_info("uri after: %.*s", suri.path.len, suri.path.ptr); + enum http_method method = get_http_method(hm.method); + + switch(method){ + case GET: + struct file resource = generate_resource(suri, hm.uri); + send_file(worker, resource.name); + //if(resource.temp == true) remove(resource.name.ptr); + free_str(&resource.name); + break; + case POST: + //handlePOST(request); + send(worker->csocket, "HTTP/1.1 201 Created\r\n\r\n", len("HTTP/1.1 201 Created\r\n\r\n"), 0); + break; + case PUT: + break; + case DELETE: + break; + default: + break; + } + free_str(&suri.path); + free_str(&suri.query); + log_debug("query freed"); + request.len = 0; + + if(worker->secure){ + SSL_clear(worker->ssl); + } + close(worker->csocket); - //SSL_shutdown(config.ssl); // look into SSL_clear() + //SSL_shutdown(config.ssl); // look into SSL_clear() + + log_debug("end of loop"); + }else if(fds[1].revents & POLLHUP){ + // like restart the worker + } } DEINIT: log_info("dieing :("); - deinit(); + destroy_ipc_listener(&listener); + destroy_http_worker(&worker); + free_str(&rewritesfile); + free_uri_rewrites(); return return_value; } |
