diff options
| author | Enrique | 2025-04-05 01:25:13 +0200 |
|---|---|---|
| committer | Enrique | 2025-04-05 01:25:13 +0200 |
| commit | 944d396ef0bca53f057d6eee49f9305d8d30e910 (patch) | |
| tree | 832af3f24dcf864e4ab7d5f21634deed0c2d7c6a /src/ipc | |
| parent | dee68a18d2f4e3ee6676703452d9bceac3e46269 (diff) | |
| download | soikk-server-944d396ef0bca53f057d6eee49f9305d8d30e910.tar.xz soikk-server-944d396ef0bca53f057d6eee49f9305d8d30e910.tar.zst | |
a lotta changes
Diffstat (limited to 'src/ipc')
| -rwxr-xr-x | src/ipc/ipc.c | 94 | ||||
| -rwxr-xr-x | src/ipc/ipc.h | 26 |
2 files changed, 59 insertions, 61 deletions
diff --git a/src/ipc/ipc.c b/src/ipc/ipc.c index 69def17..c23af9a 100755 --- a/src/ipc/ipc.c +++ b/src/ipc/ipc.c @@ -73,71 +73,57 @@ void destroy_ipc_listener(ipc_listener **il){ } } -void free_ipc_message(ipc_message im){ - free_str(&im.key); - free_str(&im.val); -} - -static inline str ipc_message_to_str(ipc_message msg){ - str smsg = dnstr(msg.key.len + msg.val.len + 2*sizeof(u32)); - memcpy(smsg.ptr+smsg.len, &msg.key.len, sizeof(msg.key.len)); - smsg.len += sizeof(msg.key.len); - copy_str(smsg, msg.key); - memcpy(smsg.ptr+smsg.len, &msg.val.len, sizeof(msg.val.len)); - smsg.len += sizeof(msg.val.len); - copy_str(smsg, msg.val); - return smsg; -} - -int send_ipc_message(int to, ipc_message msg){ - str smsg = ipc_message_to_str(msg); - if(send(to, smsg.ptr, smsg.len, 0) == -1){ - log_error("cant send message to socket %d: %s", to, strerror(errno)); - free_str(&smsg); +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; + } + 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; } - free_str(&smsg); - char buf[2]; - if(recv(to, buf, 2, 0) == -1){ - log_error("receiving OK from listener"); + char ack[3]; + if(recv(to, ack, 3, 0) == -1){ + log_error("Receiving ACK from listener"); return 1; } - if(strncmp(buf, "OK", 2) != 0){ - log_error("received '%s' from listener instead of 'OK'", buf); + if(strncmp(ack, "ACK", 2) != 0){ + log_error("Received '%.3s' from listener instead of 'ACK'", ack); return 1; } return 0; } -static inline ipc_message str_to_ipc_message(str smsg){ - struct ipc_message msg; - u32 l; - memcpy(&l, smsg.ptr, sizeof(l)); - smsg.ptr += sizeof(l); - msg.key = dnstr(l); - msg.key.len = l; - memcpy(msg.key.ptr, smsg.ptr, l); - smsg.ptr += l; - memcpy(&l, smsg.ptr, sizeof(l)); - smsg.ptr += sizeof(l); - msg.val = dnstr(l); - msg.val.len = l; - memcpy(msg.val.ptr, smsg.ptr, l); +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; } -ipc_message receive_ipc_message(ipc_listener *il){ - str smsg = dnstr(MAX_IPC_MSG_LEN); // we are gonna have to poll btw - ipc_message msg = {0}; - smsg.len = recv(il->csocket, smsg.ptr, smsg.cap, 0); - if(smsg.len == -1){ - log_error("cant receive message from socket %d: %s", il->csocket, strerror(errno)); - }else{ - msg = str_to_ipc_message(smsg); - } - if(send(il->csocket, "OK", slen("OK"), 0) == -1){ - log_error("sending 'OK' 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 index a122bc5..b275fbd 100755 --- a/src/ipc/ipc.h +++ b/src/ipc/ipc.h @@ -23,11 +23,23 @@ typedef struct ipc_listener { int csocket; } ipc_listener; +typedef enum ipc_type { + NONE, + SOCKET, REWRITES, // do away with these? + CERT, KEY, + RESTART, + RELOAD, + HTTP, + HTTPS, + LOG, + UNLOG, +} ipc_type; + #define MAX_IPC_MSG_LEN 1024 -typedef struct ipc_message { - str key; - str val; -} ipc_message; +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); @@ -35,8 +47,8 @@ void destroy_ipc_sender(ipc_sender **is); ipc_listener *setup_ipc_listener(str saddr); void destroy_ipc_listener(ipc_listener **il); -void free_ipc_message(ipc_message im); -int send_ipc_message(int to, ipc_message msg); -ipc_message receive_ipc_message(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 |
