summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xMakefile2
-rwxr-xr-xsrc/ipc/ipc.c131
-rwxr-xr-xsrc/ipc/ipc.h55
-rwxr-xr-xsrc/main.c41
-rwxr-xr-xsrc/worker.c99
5 files changed, 3 insertions, 325 deletions
diff --git a/Makefile b/Makefile
index 32613f4..86ec8f4 100755
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ else
RUNCMD = ./server.exe
endif
-OBJS = $(addprefix $(OBJDIR)/, bit.o files.o str.o log.o list.o crc64.o net.o ipc.o mime.o rewrites.o config.o)
+OBJS = $(addprefix $(OBJDIR)/, bit.o files.o str.o log.o list.o crc64.o net.o mime.o rewrites.o config.o)
INCL = -I$(LIBDIR) -I$(SRCDIR)
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
diff --git a/src/main.c b/src/main.c
index 9f388bc..ddc8e35 100755
--- a/src/main.c
+++ b/src/main.c
@@ -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;