summaryrefslogtreecommitdiff
path: root/src/worker.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/worker.c')
-rwxr-xr-xsrc/worker.c231
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;
}