]> git.mdlowis.com Git - proto/aos.git/commitdiff
added Net_Serve to make it easier to write servers
authorMichael D. Lowis <mike.lowis@gentex.com>
Fri, 17 Dec 2021 19:38:56 +0000 (14:38 -0500)
committerMichael D. Lowis <mike.lowis@gentex.com>
Fri, 17 Dec 2021 19:38:56 +0000 (14:38 -0500)
bin/dial.c
bin/listen.c
bin/rules.mk
inc/liba.h
lib/a/Net.c
lib/a/gc.c

index 6b5589df5d424385be5fcc94a0e17b3a27d2ea33..507241b6d95069804708a0b69cb6897d72dc4f94 100644 (file)
@@ -1,5 +1,4 @@
 #include <liba.h>
-#include <libnet.h>
 #include <sys/poll.h>
 
 char* Usage = "dial [OPTIONS] DIALSTR [CMD [ARG...]]";
index 3c8753348923585329fb68371278c5d8f6e29c67..d20587570a6b7af509a2894b4be3fdec9d936797 100644 (file)
@@ -1,11 +1,10 @@
 #include <liba.h>
-#include <libnet.h>
 #include <sys/types.h>
-#include <sys/wait.h>
 
 char* Usage = "listen DIALSTR CMD [ARG...]";
+char** Command = NULL;
 
-void Serve(int cfd, char** argv)
+void OnNewClient(int cfd)
 {
     int pid = fork();
     if (pid < 0)
@@ -17,7 +16,7 @@ void Serve(int cfd, char** argv)
         dup2(cfd, 0);
         dup2(cfd, 1);
         dup2(cfd, 2);
-        exit(execvp(argv[0], argv));
+        exit(execvp(Command[0], Command));
     }
     close(cfd);
 }
@@ -30,23 +29,8 @@ int main(int argc, char** argv)
         return 1;
     }
 
-    int sfd = Net_Announce(argv[0]);
-    if (sfd < 0)
-    {
-        fatal("Net_Announce():");
-    }
-
-    while (!Net_Listen(sfd, 5))
-    {
-        int cfd;
-        if ((cfd = Net_Accept(sfd)) >= 0)
-        {
-            Serve(cfd, argv+1);
-        }
-        while (waitpid(-1, 0, WNOHANG) > 0);
-    }
-    perror("listen");
-    close(sfd);
+    Command = argv+1;
+    Net_Serve(argv[0], OnNewClient);
 
     return 0;
 }
index 7b944d4f54c90c2e7fb5c56c68c08f96da21b2cf..4952daf34fb71aa8204834b5ad237296dc89e93c 100644 (file)
@@ -1,2 +1,2 @@
-$(BINDIR)/screenlock: LIBS += -lnet -lui -lX11 -lXft -lfontconfig
+$(BINDIR)/screenlock: LIBS += -lui -lX11 -lXft -lfontconfig
 $(BINDIR)/winmgr:     LIBS += -lX11 -lXft -lfontconfig -lXinerama
index 705451f24281669ae2200664136bbd0075a913eb..b8e4e73fd11d8380477e6f5c1feaad3fa8a59af1 100644 (file)
@@ -33,9 +33,9 @@
 /*
     Garbage Collector Interface
 */
-void* gc_alloc(size_t sz);
-void gc_addref(void* p);
-void gc_delref(void* p);
+void* GC_Allocate(size_t sz);
+void GC_AddRef(void* p);
+void GC_DelRef(void* p);
 
 /*
     Option Parsing
@@ -74,7 +74,7 @@ int Net_Announce(char* dialstr);
 int Net_Listen(int fd, int backlog);
 int Net_Accept(int fd);
 int Net_Dial(char* dialstr);
-
+void Net_Serve(char* dialstr, void (*on_client)(int cfd));
 
 /*
     Basic Runtime Facilities
index 65baf5e41c3a05d4a79024d60d4643669360f335..0eea143ba79fe8d3138ebefac72a6374f26ae14a 100644 (file)
@@ -4,6 +4,7 @@
 #include <netinet/in.h>
 #include <sys/un.h>
 #include <netdb.h>
+#include <sys/wait.h>
 
 typedef struct {
     char* network;
@@ -62,6 +63,7 @@ int MakeSocket(char* dialstr, struct socket_t* sock)
         sock->addr.in.sin_port = htons(strtol(conn.service, NULL, 0));
         sock->addr.in.sin_addr = ResolveAddress(conn.address);
         sock->fd = socket(AF_INET, SOCK_STREAM, 0);
+        setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
     }
     else if (!strcmp("udp", conn.network))
     {
@@ -69,6 +71,7 @@ int MakeSocket(char* dialstr, struct socket_t* sock)
         sock->addr.in.sin_port = htons(strtol(conn.service, NULL, 0));
         sock->addr.in.sin_addr = ResolveAddress(conn.address);
         sock->fd = socket(AF_INET, SOCK_DGRAM, 0);
+        setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
     }
     else if (!strcmp("unix", conn.network))
     {
@@ -144,3 +147,26 @@ int Net_Dial(char* dialstr)
     }
     return (rv == 0 ? sock.fd : rv);
 }
+
+void Net_Serve(char* dialstr, void (*on_client)(int cfd))
+{
+    int sfd = Net_Announce(dialstr);
+    if (sfd >= 0)
+    {
+        while (!Net_Listen(sfd, 5))
+        {
+            int cfd;
+            if ((cfd = Net_Accept(sfd)) >= 0)
+            {
+                on_client(cfd);
+            }
+            while (waitpid(-1, 0, WNOHANG) > 0);
+        }
+        perror("Net_Listen():");
+        close(sfd);
+    }
+    else
+    {
+        fatal("Net_Announce():");
+    }
+}
index 2a5c644de07c5360d1ee6efa9162d9e5b91f537e..7ca71dae6a49dc1e07da370a10fdba4f91041f14 100644 (file)
@@ -60,7 +60,7 @@ static unsigned int Primes[] = {
 
 /* Public Routines
  ***************************************/
-void* gc_alloc(size_t sz)
+void* GC_Allocate(size_t sz)
 {
     sz = (sz / sizeof(intptr_t)) + ((sz % sizeof(intptr_t)) ? 1 : 0);
     object_t* obj = ecalloc(1, sizeof(object_t) + sz);
@@ -69,12 +69,12 @@ void* gc_alloc(size_t sz)
     return obj->data;
 }
 
-void gc_addref(void* p)
+void GC_AddRef(void* p)
 {
     log_add((object_t*)p-1, INCREMENT);
 }
 
-void gc_delref(void* p)
+void GC_DelRef(void* p)
 {
     log_add((object_t*)p-1, DECREMENT);
 }