diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/ipc/ipc.c | 131 | ||||
| -rwxr-xr-x | src/ipc/ipc.h | 55 | ||||
| -rwxr-xr-x | src/main.c | 41 | ||||
| -rwxr-xr-x | src/worker.c | 99 |
4 files changed, 2 insertions, 324 deletions
diff --git a/src/ipc/ipc.c b/src/ipc/ipc.c deleted file mode 100755 index db33329..0000000 --- a/src/ipc/ipc.c +++ /dev/null @@ -1,131 +0,0 @@ -#include "ipc.h" - - -ipc_sender *setup_ipc_sender(str addr, int backlog){ - ipc_sender *is = calloc(1, sizeof(ipc_sender)); - is->addr = dup_str(addr); - is->ssocket = socket(AF_UNIX, SOCK_STREAM, 0); - if(is->ssocket == -1){ - log_error("%s: socket: %s", __FUNCTION__, strerror(errno)); - goto error; - } - struct sockaddr_un sockaddr = { .sun_family = AF_UNIX }; - memcpy(sockaddr.sun_path, is->addr.ptr, is->addr.len); - sockaddr.sun_path[is->addr.len] = '\0'; - unlink(is->addr.ptr); - if(bind(is->ssocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == -1){ - log_error("%s: bind: %s", __FUNCTION__, strerror(errno)); - goto error; - } - if(listen(is->ssocket, backlog) == -1){ - log_error("%s: listen: %s", __FUNCTION__, strerror(errno)); - goto error; - } - - if(0){ -error: - destroy_ipc_sender(&is); - } - return is; -} - -void destroy_ipc_sender(ipc_sender **is){ - if(*is != NULL){ - close((*is)->ssocket); - (*is)->ssocket = -1; - unlink((*is)->addr.ptr); - free_str(&(*is)->addr); - free(*is); - *is = NULL; - } -} - -ipc_listener *setup_ipc_listener(str saddr){ - ipc_listener *il = calloc(1, sizeof(ipc_listener)); - il->saddr = dup_str(saddr); - il->csocket = socket(AF_UNIX, SOCK_STREAM, 0); - if(il->csocket == -1){ - log_error("%s: socket: %s", __FUNCTION__, strerror(errno)); - goto error; - } - struct sockaddr_un socksaddr = { .sun_family = AF_UNIX }; - memcpy(socksaddr.sun_path, il->saddr.ptr, il->saddr.len); - socksaddr.sun_path[il->saddr.len] = '\0'; - if(connect(il->csocket, (struct sockaddr *)&socksaddr, sizeof(socksaddr)) == -1){ - log_error("%s: connect: %s", __FUNCTION__, strerror(errno)); - goto error; - } - - if(0){ -error: - destroy_ipc_listener(&il); - } - return il; -} - -void destroy_ipc_listener(ipc_listener **il){ - if(*il != NULL){ - close((*il)->csocket); - (*il)->csocket = -1; - free_str(&(*il)->saddr); - free(*il); - *il = NULL; - } -} - -int send_ipc_message(int to, ipc_type type, str msg){ - if(send(to, &type, sizeof(uint8_t), 0) -1){ - 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; - } - if(send(to, msg.ptr, msg.len, 0) == -1){ - 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"); - return 1; - } - if(strncmp(ack, "ACK", 3) != 0){ - log_error("Received '%.3s' from listener instead of 'ACK'", ack); - return 1; - } - return 0; -} - -ipc_msg receive_ipc_message(ipc_listener *il){ - ipc_msg msg = {0}; - if(recv(il->csocket, &msg.type, sizeof(uint8_t), 0) == -1){ - log_error("Can't receive message type from socket %d: %s", il->csocket, strerror(errno)); - goto end; - } - if(recv(il->csocket, &msg.msg.len, sizeof(msg.msg.len), 0) == -1){ - log_error("Can't receive message length from socket %d: %s", il->csocket, strerror(errno)); - goto end; - } - msg.msg.cap = msg.msg.len; - msg.msg.ptr = calloc(msg.msg.len, sizeof(char)); - if(recv(il->csocket, msg.msg.ptr, msg.msg.len, 0) == -1){ - log_error("Can't receive message from socket %d: %s", il->csocket, strerror(errno)); - free_ipc_message(&msg); - goto end; - } -end: - if(send(il->csocket, "ACK", slen("ACK"), 0) == -1){ - log_error("Sending 'ACK' to sender"); - } - return msg; -} - -void free_ipc_message(ipc_msg *msg){ - msg->type = NONE; - free_str(&msg->msg); -} - diff --git a/src/ipc/ipc.h b/src/ipc/ipc.h deleted file mode 100755 index 652e62d..0000000 --- a/src/ipc/ipc.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef IPC_H -#define IPC_H - -#include <stdio.h> -#include <stdlib.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include "str/str.h" -#include "log/log.h" -#include "types/types.h" - - -typedef struct ipc_sender { - str addr; - int ssocket; -} ipc_sender; - -typedef struct ipc_listener { - str saddr; - int csocket; -} ipc_listener; - -typedef enum ipc_type { - NONE, - SOCKET, - REWRITES, // do away with this? - BUNDLE, CERT, KEY, - RESTART, - RELOAD, - HTTP, - HTTPS, - LOG, - UNLOG, -} ipc_type; - -#define MAX_IPC_MSG_LEN 1024 -typedef struct ipc_msg { - ipc_type type; - str msg; -} ipc_msg; - -ipc_sender *setup_ipc_sender(str addr, int backlog); -void destroy_ipc_sender(ipc_sender **is); - -ipc_listener *setup_ipc_listener(str saddr); -void destroy_ipc_listener(ipc_listener **il); - -int send_ipc_message(int to, ipc_type type, str msg); -ipc_msg receive_ipc_message(ipc_listener *il); -void free_ipc_message(ipc_msg *im); - -#endif
\ No newline at end of file @@ -1,32 +1,26 @@ #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> -//#include <time.h> #include <libgen.h> #include "str/str.h" #include "list/list.h" #include "net/net.h" #include "log/log.h" -#include "ipc/ipc.h" #include "config/config.h" -#define IPC_BACKLOG 15 str name; str orig_config_file; struct { str path; str socket_file; - str ipc_addr; str config_file; str workers; } dir; config_m config; http_server *server; -ipc_sender *sender; struct worker { pid_t pid; - int wsocket; } *workers; @@ -107,13 +101,6 @@ static int create_server_dir(str name){ } dir.socket_file = dup_strs(dir.path, sstr("socket")); dir.config_file = dup_strs(dir.path, sstr("configfile")); - 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; - } - } dir.workers = dup_strs(dir.path, sstr("workers/")); if(!dir_exists(dir.workers.ptr)){ if(mkdir(dir.workers.ptr, 0777) != 0){ @@ -215,11 +202,6 @@ int init(char *configfile){ log_error("Unable to write socket to socket file"); return 1; } - sender = setup_ipc_sender(dir.ipc_addr, IPC_BACKLOG); - if(sender == NULL){ - log_error("Unable to set up IPC sender"); - return 1; - } init_list(workers); struct sigaction rnit = { .sa_sigaction = reinit, .sa_flags = SA_SIGINFO }; if(sigaction(SIGUSR1, &rnit, NULL) == -1){ @@ -253,12 +235,6 @@ static void remove_server_dir(void){ } } free_str(&dir.workers); - if(file_exists(dir.ipc_addr.ptr)){ - 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(file_exists(dir.config_file.ptr)){ if(remove(dir.config_file.ptr) != 0){ log_error("Error removing config file in '%.*s': %s", dir.config_file.len, dir.config_file.ptr, strerror(errno)); @@ -283,7 +259,6 @@ void deinit(void){ free_master_config(&config); remove_server_dir(); destroy_http_server(&server); - destroy_ipc_sender(&sender); list_free(workers); } @@ -355,24 +330,11 @@ int main(int argc, char *argv[]){ log_error("Cannot exec worker: %s", strerror(errno)); return 1; } - struct worker w = { .pid = nw, .wsocket = accept(sender->ssocket, NULL, NULL) }; + struct worker w = { .pid = nw }; list_push(workers, w); break; - // 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': case 'R': kill(getpid(), SIGUSR1); - //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)); @@ -393,7 +355,6 @@ int main(int argc, char *argv[]){ break; case 'q': case 'Q': while(list_size(workers) > 0){ - shutdown(workers[0].wsocket, SHUT_RDWR); kill(workers[0].pid, SIGTERM); // redo this PLEASE waitpid(workers[0].pid, NULL, 0); } diff --git a/src/worker.c b/src/worker.c index 87824cf..b919b64 100755 --- a/src/worker.c +++ b/src/worker.c @@ -2,7 +2,6 @@ #include <stdlib.h> #include <sys/mman.h> #include "str/str.h" -#include "ipc/ipc.h" #include "net/net.h" #include "config/config.h" @@ -11,97 +10,14 @@ config_w config; struct { str path; str socket_path; - str ipc_addr; str config_file; str self; } dir; -ipc_listener *listener; http_worker *worker; // remove these or something int secure = 0; -str rewritesfile; - - -// TODO: remove? -// 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: - // if(worker != NULL){ - // destroy_http_worker(&worker); - // } - // 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 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 - // free_str(&keyfile); - // keyfile = dup_str(im.msg); - // break; - case RESTART: - char *args[] = {"./worker.exe", listener->saddr.ptr, NULL}; - execv("./worker.exe", args); - log_error("Cannot restart worker: %s", strerror(errno)); - return; - break; - case RELOAD: - // re-reads config - // re-requests entire config; - break; - case HTTP: - // TODO: revise this - // log_info("received http signal"); - // if(secure != 0){ - // secure = 0; - // terminate_https(worker); - // } - break; - case HTTPS: - // TODO: revise this - // log_info("received https signal"); - // if(secure == 0){ - // secure = 1; - // setup_https(worker, certfile, keyfile); - // } - break; - case LOG: - break; - case UNLOG: - break; - default: - break; - } -} + void deinit(void); @@ -168,11 +84,6 @@ int read_server_dir(str name){ log_error("No socket file in '%.*s'", dir.socket_path.len, dir.socket_path.ptr); return 1; } - dir.ipc_addr = dup_strs(dir.path, sstr("ipcserver")); - if(!file_exists(dir.ipc_addr.ptr)){ - log_error("No IPC socket in '%.*s'", dir.ipc_addr.len, dir.ipc_addr.ptr); - return 1; - } dir.config_file = dup_strs(dir.path, sstr("configfile")); if(!file_exists(dir.config_file.ptr)){ log_error("No config file in '%.*s'", dir.config_file.len, dir.config_file.ptr); @@ -215,11 +126,6 @@ int init(str name){ log_error("Error setting up worker server"); return 1; } - listener = setup_ipc_listener(dir.ipc_addr); - if(listener == NULL){ - log_error("Can't set up ipc listener on self"); - return 1; - } struct sigaction rnit = { .sa_sigaction = reinit, .sa_flags = SA_SIGINFO }; if(sigaction(SIGUSR1, &rnit, NULL) == -1){ log_error("Error setting up SIGUSR1 signal handler: %s", strerror(errno)); @@ -247,7 +153,6 @@ void remove_server_dir(void){ log_error("Error removing PID record for self in '%.*s': %s", dir.self.len, dir.self.ptr, strerror(errno)); } free_str(&dir.self); - free_str(&dir.ipc_addr); free_str(&dir.path); } @@ -255,7 +160,6 @@ void deinit(void){ free_worker_config(&config); remove_server_dir(); destroy_http_worker(&worker); - destroy_ipc_listener(&listener); } void print_usage(void){ @@ -351,7 +255,6 @@ finish_request: DEINIT: deinit(); - free_str(&rewritesfile); log_info("dieing :("); return return_value; |
