summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/main.c77
-rwxr-xr-xsrc/worker.c88
2 files changed, 135 insertions, 30 deletions
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);