src/network.c

changeset 94
864f59271974
parent 93
9b64437262a2
child 95
2624e7ebb525
--- a/src/network.c	Sun Mar 29 13:26:00 2026 +0200
+++ b/src/network.c	Sun Mar 29 15:17:28 2026 +0200
@@ -29,24 +29,22 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/un.h>
 #include "network.h"
 
-#include <stdio.h>
-
-#define new_socket() socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-
-int net_create(Server *server, short port) {
-    server->info = NULL;
-    
-    struct sockaddr_in addr;
-    addr.sin_family = AF_INET;
-    addr.sin_addr.s_addr = INADDR_ANY;
-    addr.sin_port = htons(port);
-
-    server->fd = new_socket();
+int net_create_tcp(Server *server, short port) {
+    memset(server, 0, sizeof(Server));
+    server->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     if (server->fd > -1) {
         int one = 1;
         setsockopt(server->fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));
+
+        struct sockaddr_in addr;
+        addr.sin_family = AF_INET;
+        addr.sin_addr.s_addr = INADDR_ANY;
+        addr.sin_port = htons(port);
         if (bind(server->fd, (struct sockaddr*)&addr, sizeof(addr))) {
             server->fd = -1;
             return 1;
@@ -58,21 +56,52 @@
     }
 }
 
-static int getaddrinfo_intrnl(char *host, char *port, struct addrinfo **info) {
+int net_find_tcp(Server *server, char *host, short port) {
+    memset(server, 0, sizeof(Server));
+    server->fd = -1;
+
     struct addrinfo hints = {0};
     hints.ai_socktype = SOCK_STREAM;
     hints.ai_protocol = IPPROTO_TCP;
     hints.ai_family = AF_INET;
-    
-    return getaddrinfo(host, port, &hints, info);
+    char portstr[6];
+    sprintf(portstr, "%hd", port);
+    return getaddrinfo(host, portstr, &hints, &server->info);
 }
 
-int net_find(Server *server, char *host, short port) {
+int net_create_sock(Server *server, char * path) {
+    memset(server, 0, sizeof(Server));
+    server->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+    if (server->fd > -1) {
+        struct sockaddr_un addr;
+        addr.sun_family = AF_UNIX;
+        addr.sun_family = AF_UNIX;
+        strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
+        if (bind(server->fd, (struct sockaddr*)&addr, sizeof(addr))) {
+            server->fd = -1;
+            return 1;
+        } else {
+            return 0;
+        }
+    } else {
+        return 1;
+    }
+}
+
+int net_find_sock(Server *server, char *path) {
     memset(server, 0, sizeof(Server));
     server->fd = -1;
-    char portstr[6];
-    sprintf(portstr, "%hd", port);
-    return getaddrinfo_intrnl(host, portstr, &(server->info));
+
+    server->info = calloc(1, sizeof(struct addrinfo));
+    server->info->ai_family = AF_UNIX;
+    server->info->ai_socktype = SOCK_STREAM;
+    server->info->ai_protocol = 0;
+    struct sockaddr_un *addr = malloc(sizeof(struct sockaddr_un));
+    addr->sun_family = AF_UNIX;
+    strncpy(addr->sun_path, path, sizeof(addr->sun_path) - 1);
+    server->info->ai_addr = (struct sockaddr*) addr;
+    server->info->ai_addrlen = sizeof(struct sockaddr_un);
+    return 0;
 }
 
 int net_listen(Server *server) {
@@ -92,7 +121,11 @@
     
     Client* client = calloc(1, sizeof(Client));
     client->fd = -1;
-    server->fd = new_socket();
+    server->fd = socket(
+        server->info->ai_family,
+        server->info->ai_socktype,
+        server->info->ai_protocol
+    );
     server->client = client;
     
     if (server->fd == -1) {
@@ -102,19 +135,21 @@
     return connect(server->fd, server->info->ai_addr, server->info->ai_addrlen);
 }
 
-int net_destroy(Server *server) {
+void net_destroy(Server *server) {
     if (server->info) {
         freeaddrinfo(server->info);
     }
     if (server->client) {
         shutdown(server->client->fd, SHUT_RDWR);
+        close(server->client->fd);
         free(server->client);
+        server->client = NULL;
     }
     if (server->fd > -1) {
-        return shutdown(server->fd, SHUT_RDWR);
+        shutdown(server->fd, SHUT_RDWR);
+        close(server->fd);
+        server->fd = -1;
     }
-    
-    return 0;
 }
 
 void net_send_code(int socket, uint8_t code) {

mercurial