summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xMakefile80
-rwxr-xr-xsrc/ipc/ipc.c2
-rwxr-xr-xsrc/main.c28
-rwxr-xr-xsrc/net/net.c6
-rwxr-xr-xsrc/worker.c231
5 files changed, 179 insertions, 168 deletions
diff --git a/Makefile b/Makefile
index 07ff46c..ff60ffe 100755
--- a/Makefile
+++ b/Makefile
@@ -1,40 +1,40 @@
-CC = cyg
-CFLAGS = -O0 -Wall -ggdb3
-LDFLAGS = -lssl -lcrypto
-
-SRCDIR = src
-OBJDIR = obj
-ifeq ($(OS),Windows_NT)
- LIBDIR = C:/Users/quique/Documents/Programming/libs
- RUNCMD = server.exe
-else
- LIBDIR = /mnt/c/Users/quique/Documents/Programming/libs
- RUNCMD = ./server.exe
-endif
-
-OBJS = $(addprefix $(OBJDIR)/, bit.o str.o log.o list.o crc64.o dir.o net.o ipc.o)
-
-INCL = -I$(LIBDIR) -I$(SRCDIR)
-
-
-
-all: server.exe worker.exe
-
-server.exe: $(SRCDIR)/main.c $(OBJS)
- $(CC) $< $(OBJS) $(INCL) $(CFLAGS) -o server.exe $(LDFLAGS)
-
-worker.exe: $(SRCDIR)/worker.c $(OBJS)
- $(CC) $< $(OBJS) $(INCL) $(CFLAGS) -o worker.exe $(LDFLAGS)
-
-$(OBJDIR)/%.o: $(SRCDIR)/%/*.c $(SRCDIR)/%/*.h
- $(CC) -c $(SRCDIR)/$*/$*.c $(INCL) $(CFLAGS) -o $(OBJDIR)/$*.o $(LDFLAGS)
-
-$(OBJDIR)/%.o: $(LIBDIR)/%/*.c $(LIBDIR)/%/*.h
- $(CC) -c $(LIBDIR)/$*/$*.c $(INCL) $(CFLAGS) -o $(OBJDIR)/$*.o $(LDFLAGS)
-
-clean:
- rm -f worker.exe server.exe $(OBJDIR)/*.o
-
-memcheck:
- sudo valgrind --show-leak-kinds=all --leak-check=full --track-origins=yes --trace-children=yes -s $(RUNCMD) 443
-
+CC = gcc
+CFLAGS = -O0 -Wall -ggdb3
+LDFLAGS = -lssl -lcrypto
+
+SRCDIR = src
+OBJDIR = obj
+ifeq ($(OS),Windows_NT)
+ LIBDIR = C:/Users/quique/Documents/Programming/libs
+ RUNCMD = server.exe
+else
+ LIBDIR = /mnt/c/Users/quique/Documents/Programming/libs
+ RUNCMD = ./server.exe
+endif
+
+OBJS = $(addprefix $(OBJDIR)/, bit.o str.o log.o list.o crc64.o dir.o net.o ipc.o)
+
+INCL = -I$(LIBDIR) -I$(SRCDIR)
+
+
+
+all: server.exe worker.exe
+
+server.exe: $(SRCDIR)/main.c $(OBJS)
+ $(CC) $< $(OBJS) $(INCL) $(CFLAGS) -o server.exe $(LDFLAGS)
+
+worker.exe: $(SRCDIR)/worker.c $(OBJS)
+ $(CC) $< $(OBJS) $(INCL) $(CFLAGS) -o worker.exe $(LDFLAGS)
+
+$(OBJDIR)/%.o: $(SRCDIR)/%/*.c $(SRCDIR)/%/*.h
+ $(CC) -c $(SRCDIR)/$*/$*.c $(INCL) $(CFLAGS) -o $(OBJDIR)/$*.o $(LDFLAGS)
+
+$(OBJDIR)/%.o: $(LIBDIR)/%/*.c $(LIBDIR)/%/*.h
+ $(CC) -c $(LIBDIR)/$*/$*.c $(INCL) $(CFLAGS) -o $(OBJDIR)/$*.o $(LDFLAGS)
+
+clean:
+ rm -f worker.exe server.exe $(OBJDIR)/*.o
+
+memcheck:
+ sudo valgrind --show-leak-kinds=all --leak-check=full --track-origins=yes --trace-children=yes -s $(RUNCMD) 443
+
diff --git a/src/ipc/ipc.c b/src/ipc/ipc.c
index 73adb32..44b8b1b 100755
--- a/src/ipc/ipc.c
+++ b/src/ipc/ipc.c
@@ -78,6 +78,7 @@ int send_ipc_message(int to, ipc_type type, str msg){
log_error("Can't send message type to socket %d: %s", to, strerror(errno));
return 1;
}
+ msg.len++;
if(send(to, &msg.len, sizeof(msg.len), 0) == -1){
log_error("Can't send message length to socket %d: %s", to, strerror(errno));
return 1;
@@ -86,6 +87,7 @@ int send_ipc_message(int to, ipc_type type, str msg){
log_error("Can't send message to socket %d: %s", to, strerror(errno));
return 1;
}
+ send(to, 0, 1, 0);
char ack[3];
if(recv(to, ack, 3, 0) == -1){
log_error("Receiving ACK from listener");
diff --git a/src/main.c b/src/main.c
index 7140256..ead5573 100755
--- a/src/main.c
+++ b/src/main.c
@@ -132,16 +132,26 @@ int main(int argc, char *argv[]){
}
struct worker w = { .pid = nw, .wsocket = accept(sender->ssocket, NULL, NULL) };
list_push(workers, w);
- log_debug("erm");
- log_debug("1st send returned %d",
- send_ipc_message(w.wsocket, SOCKET, utostr(server->ssocket, 10))
- );
- log_debug("2nd send returned %d",
- send_ipc_message(w.wsocket, REWRITES, sstr("urirewrites"))
- );
+ 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));
+ send_ipc_message(w.wsocket, REWRITES, sstr("urirewrites"));
+ //send_ipc_message(w.wsocket, HTTPS, sstr(""));
break;
- case 's': case 'S':
- kill(0, SIGUSR1);
+ case 's':
+ for(int i = 0; i < list_size(workers); i++){
+ send_ipc_message(workers[i].wsocket, HTTPS, sstr(""));
+ }
+ break;
+ case 'S':
+ for(int i = 0; i < list_size(workers); i++){
+ send_ipc_message(workers[i].wsocket, HTTP, sstr(""));
+ }
+ break;
+ case 'R':
+ for(int i = 0; i < list_size(workers); i++){
+ send_ipc_message(workers[i].wsocket, RESTART, sstr(""));
+ }
break;
case 'l': case 'L':
printf("|-%3d workers working for us rn-|\n", list_size(workers));
diff --git a/src/net/net.c b/src/net/net.c
index 6379c2d..d0bf233 100755
--- a/src/net/net.c
+++ b/src/net/net.c
@@ -181,10 +181,10 @@ int setup_https(http_worker *hw, str certfile, str keyfile){
return 1;
}
//SSL_CTX_set_verify(hw->ssl_ctx, SSL_VERIFY_PEER, NULL);
- if(SSL_CTX_load_verify_locations(hw->ssl_ctx, "ssl/mkarchive.net/ca_bundle.crt", NULL) <= 0){
+ /*if(SSL_CTX_load_verify_locations(hw->ssl_ctx, "ssl/mkarchive.net/ca_bundle.crt", NULL) <= 0){
log_error("Verifying certificate locations");
return 1;
- }
+ }*/
if(SSL_CTX_use_certificate_file(hw->ssl_ctx, certfile.ptr, SSL_FILETYPE_PEM) <= 0){
log_error("Using certificate file");
return 1;
@@ -199,6 +199,7 @@ int setup_https(http_worker *hw, str certfile, str keyfile){
return 1;
}
SSL_set_accept_state(hw->ssl);
+ hw->secure = 1;
return 0;
}
@@ -216,6 +217,7 @@ void reset_https(http_worker *hw){
void terminate_https(http_worker *hw){
if(hw != NULL){
+ hw->secure = 0;
if(hw->ssl != NULL){
SSL_free(hw->ssl);
hw->ssl = NULL;
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;
}