]> git.mdlowis.com Git - proto/aos.git/commitdiff
rolled lib net into single C file as part of liba
authorMichael D. Lowis <mike.lowis@gentex.com>
Fri, 17 Dec 2021 19:06:51 +0000 (14:06 -0500)
committerMichael D. Lowis <mike.lowis@gentex.com>
Fri, 17 Dec 2021 19:06:51 +0000 (14:06 -0500)
18 files changed:
Makefile
bin/dial.c
bin/listen.c
bin/rules.mk
bin/winmgr/anvil.h
bin/winmgr/mons.c
inc/liba.h
inc/libnet.h [deleted file]
lib/a/Net.c [new file with mode: 0644]
lib/a/Options.c
lib/a/defaults/options.c
lib/a/gc.c
lib/net/netaccept.c [deleted file]
lib/net/netannounce.c [deleted file]
lib/net/netdial.c [deleted file]
lib/net/netlisten.c [deleted file]
lib/net/netresolve.c [deleted file]
lib/net/netsocket.c [deleted file]

index 20ba0343d1c928b7cc6a1c79291e0561e11016ba..ca94ebba72c671cc9318b50c3bcfa43c97f9e500 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,6 @@
 all: libs bins
 
 clean:
-       find build/ -type f -delete
        rm -r build/ rules.mk
 
 bins: libs
index 7e41df8285d477ac4c9157405ec86f01e7d6dd84..6b5589df5d424385be5fcc94a0e17b3a27d2ea33 100644 (file)
@@ -4,11 +4,10 @@
 
 char* Usage = "dial [OPTIONS] DIALSTR [CMD [ARG...]]";
 
-//void set_option(int sname, char* lname, char* arg)
-//{
-//
-//}
-
+Option_T Options[] = {
+    { .s = 'h', .l = "help",    .a = 0, .d = "print this help message" },
+    {0}
+};
 
 int copy_data(int fromfd, int tofd, int events)
 {
@@ -31,7 +30,6 @@ int copy_data(int fromfd, int tofd, int events)
 
     if (!open || (events & (POLLHUP|POLLERR)))
     {
-        perror("close():");
         close(fromfd);
         open = 0;
     }
@@ -41,42 +39,40 @@ int copy_data(int fromfd, int tofd, int events)
 
 int main(int argc, char** argv)
 {
-    (void)argc, (void)argv;
+    if (argc < 1)
+    {
+        Options_PrintHelp();
+        return 1;
+    }
+
+    int running  = 1;
+    int sockfd   = Net_Dial(argv[0]);
+    int cmdinfd  = STDIN_FILENO;
+    int cmdoutfd = STDOUT_FILENO;
+    if (argc > 1)
+    {
+        cmdinfd  = forkexec(&argv[1]);
+        cmdoutfd = cmdinfd;
+        if (cmdinfd < 0)
+        {
+            fatal("forkexec():");
+        }
+    }
 
-//    if (argc < 2)
-//    {
-//        fprintf(stderr, "usage: dial DIALSTR [CMD [ARG...]]\n");
-//        return 1;
-//    }
-//
-//    int running  = 1;
-//    int sockfd   = netdial(argv[1]);
-//    int cmdinfd  = STDIN_FILENO;
-//    int cmdoutfd = STDOUT_FILENO;
-//    if (argc > 2)
-//    {
-//        cmdinfd  = forkexec(&argv[2]);
-//        cmdoutfd = cmdinfd;
-//        if (cmdinfd < 0)
-//        {
-//            fatal("forkexec():");
-//        }
-//    }
-//
-//    while (running)
-//    {
-//        struct pollfd fds[] = {
-//            { .fd = sockfd,  .events = POLLIN },
-//            { .fd = cmdinfd, .events = POLLIN },
-//        };
-//        if (poll(fds, nelem(fds), -1) < 0)
-//        {
-//            fatal("poll():");
-//        }
-//        running = running && copy_data(sockfd, cmdoutfd, fds[0].revents);
-//        running = running && copy_data(cmdinfd, sockfd, fds[1].revents);
-//    }
-//    close(sockfd);
+    while (running)
+    {
+        struct pollfd fds[] = {
+            { .fd = sockfd,  .events = POLLIN },
+            { .fd = cmdinfd, .events = POLLIN },
+        };
+        if (poll(fds, nelem(fds), -1) < 0)
+        {
+            fatal("poll():");
+        }
+        running = running && copy_data(sockfd, cmdoutfd, fds[0].revents);
+        running = running && copy_data(cmdinfd, sockfd, fds[1].revents);
+    }
+    close(sockfd);
 
     return 0;
 }
\ No newline at end of file
index fddd67381bd0c7ff7e7877446bed30febd000eb1..3c8753348923585329fb68371278c5d8f6e29c67 100644 (file)
@@ -3,7 +3,9 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
-void serve(int cfd, char** argv)
+char* Usage = "listen DIALSTR CMD [ARG...]";
+
+void Serve(int cfd, char** argv)
 {
     int pid = fork();
     if (pid < 0)
@@ -22,24 +24,24 @@ void serve(int cfd, char** argv)
 
 int main(int argc, char** argv)
 {
-    if (argc < 3)
+    if (argc < 2)
     {
-        fprintf(stderr, "usage: listen DIALSTR CMD [ARG...]\n");
+        Options_PrintHelp();
         return 1;
     }
 
-    int sfd = netannounce(argv[1]);
+    int sfd = Net_Announce(argv[0]);
     if (sfd < 0)
     {
-        fatal("netanounce():");
+        fatal("Net_Announce():");
     }
 
-    while (!netlisten(sfd, 5))
+    while (!Net_Listen(sfd, 5))
     {
         int cfd;
-        if ((cfd = netaccept(sfd)) >= 0)
+        if ((cfd = Net_Accept(sfd)) >= 0)
         {
-            serve(cfd, argv+2);
+            Serve(cfd, argv+1);
         }
         while (waitpid(-1, 0, WNOHANG) > 0);
     }
index 99f74074e9870ed5361aa2ba4988dba8915c13cc..7b944d4f54c90c2e7fb5c56c68c08f96da21b2cf 100644 (file)
@@ -1,4 +1,2 @@
-$(BINDIR)/dial:       LIBS += -lnet
-$(BINDIR)/listen:     LIBS += -lnet
 $(BINDIR)/screenlock: LIBS += -lnet -lui -lX11 -lXft -lfontconfig
 $(BINDIR)/winmgr:     LIBS += -lX11 -lXft -lfontconfig -lXinerama
index 2e38de50e78605ed442e93521d4cb717d5d90d1e..e7eae01df3812322c113e2536439773ae76c7d24 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef ANVIL_H
 #define ANVIL_H
 
+#define _XOPEN_SOURCE 700
+
 #include <X11/X.h>
 #include <X11/Xlib.h>
 #include <X11/keysym.h>
index 78fa4b902d075a5db58a4afd022f58f0b9118036..671b89a7185418a6549d0b16c3ad62b328959c39 100644 (file)
@@ -405,10 +405,10 @@ static Column* pickcol(Column* cols, int relx)
 {
     Column* col;
     int left = 0, right = 0;
-    printf("cols %p\n", cols);
+    printf("cols %p\n", (void*)cols);
     LIST_FOR_EACH(col, cols)
     {
-       printf("curr = %p\n", col);
+       printf("curr = %p\n", (void*)col);
         left = right, right += col->width;
        printf("%d <= %d < %d\n", left, relx, right);
         if (left <= relx && relx < right)
index 39afaa909fbbaf0fa72ad9b11bc0b1aca6c37ff4..705451f24281669ae2200664136bbd0075a913eb 100644 (file)
@@ -44,10 +44,10 @@ typedef struct {
     char* l;
     char* d;
     char s;
-    int a : 1;
+    unsigned int a : 1;
 } Option_T;
 
-void Options_Parse(int argc, char** argv);
+int Options_Parse(int argc, char** argv);
 void Options_PrintHelp(void);
 
 /*
@@ -67,6 +67,15 @@ char* estrdup(const char *s);
 int forkexec(char** cmd);
 char* strmcat(char* first, ...);
 
+/*
+    Networking
+*/
+int Net_Announce(char* dialstr);
+int Net_Listen(int fd, int backlog);
+int Net_Accept(int fd);
+int Net_Dial(char* dialstr);
+
+
 /*
     Basic Runtime Facilities
 */
diff --git a/inc/libnet.h b/inc/libnet.h
deleted file mode 100644 (file)
index c46afca..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/un.h>
-
-struct socket_t {
-    int fd;
-    union {
-        struct sockaddr_in in;
-        struct sockaddr_un un;
-    } addr;
-};
-
-int netsocket(char* dialstr, struct socket_t* sock);
-struct in_addr netresolve(char *hostname);
-int netannounce(char* dialstr);
-int netlisten(int fd, int backlog);
-int netaccept(int fd);
-int netdial(char* dialstr);
-int enetdial(char* dialstr);
diff --git a/lib/a/Net.c b/lib/a/Net.c
new file mode 100644 (file)
index 0000000..65baf5e
--- /dev/null
@@ -0,0 +1,146 @@
+#include <liba.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/un.h>
+#include <netdb.h>
+
+typedef struct {
+    char* network;
+    char* address;
+    char* service;
+} conn_t;
+
+struct socket_t {
+    int fd;
+    union {
+        struct sockaddr_in in;
+        struct sockaddr_un un;
+    } addr;
+};
+
+struct in_addr ResolveAddress(char *hostname)
+{
+    struct in_addr addr = {0};
+    struct addrinfo *servinfo, hints = {
+        .ai_family   = AF_UNSPEC,
+        .ai_socktype = SOCK_STREAM
+    };
+    if (getaddrinfo(hostname , NULL , &hints , &servinfo) == 0)
+    {
+        for (struct addrinfo* p = servinfo; p != NULL; p = p->ai_next)
+        {
+            addr = ((struct sockaddr_in *)p->ai_addr)->sin_addr;
+        }
+        freeaddrinfo(servinfo);
+    }
+    return addr;
+}
+
+int MakeSocket(char* dialstr, struct socket_t* sock)
+{
+    size_t i;
+    /* make a local copy of dial string */
+    char dstr[8192];
+    for (i = 0; i < sizeof(dstr)-1 && dialstr[i]; i++)
+    {
+        dstr[i] = dialstr[i];
+    }
+    dstr[i] = '\0';
+
+    /* parse the dial string */
+    conn_t conn;
+    conn.network = strtok(dstr, ":"); if (!conn.network) conn.network = "";
+    conn.address = strtok(NULL, ":"); if (!conn.address) conn.address = "";
+    conn.service = strtok(NULL, ":"); if (!conn.service) conn.service = "";
+
+    /* try and make the connection with the appropriate handler */
+    memset(&sock->addr, 0, sizeof(sock->addr));
+    if (!strcmp("tcp", conn.network))
+    {
+        sock->addr.in.sin_family = AF_INET;
+        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);
+    }
+    else if (!strcmp("udp", conn.network))
+    {
+        sock->addr.in.sin_family = AF_INET;
+        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);
+    }
+    else if (!strcmp("unix", conn.network))
+    {
+        sock->addr.un.sun_family = AF_UNIX;
+        sock->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+        strncpy(sock->addr.un.sun_path, conn.address, sizeof(sock->addr.un.sun_path)-1);
+    }
+    else
+    {
+        errno = EINVAL, sock->fd = -1;
+    }
+    return sock->fd;
+}
+
+int Net_Announce(char* dialstr)
+{
+    struct socket_t sock = { .fd = -1 };
+    if (MakeSocket(dialstr, &sock))
+    {
+        int rv = -1;
+        switch (sock.addr.in.sin_family)
+        {
+            case AF_INET:
+                rv = bind(sock.fd, (struct sockaddr*)&sock.addr.in, sizeof(sock.addr.in));
+                break;
+
+            case AF_UNIX:
+                if ((rv = bind(sock.fd, (struct sockaddr*)&sock.addr.un, sizeof(sock.addr.un))) < 0)
+                {
+                    if (connect(sock.fd, (struct sockaddr*)&sock.addr.un, sizeof(sock.addr.un)) < 0)
+                    {
+                        unlink(sock.addr.un.sun_path);
+                        rv = bind(sock.fd, (struct sockaddr*)&sock.addr.un, sizeof(sock.addr.un));
+                    }
+                }
+                break;
+        }
+        if (rv < 0)
+        {
+            close(sock.fd);
+            sock.fd = -1;
+        }
+    }
+    return sock.fd;
+}
+
+int Net_Listen(int fd, int backlog)
+{
+    return listen(fd, backlog);
+}
+
+int Net_Accept(int fd)
+{
+    return accept(fd, 0, 0);
+}
+
+int Net_Dial(char* dialstr)
+{
+    int rv = -1;
+    struct socket_t sock = { .fd = -1 };
+    if (MakeSocket(dialstr, &sock))
+    {
+        switch (sock.addr.in.sin_family)
+        {
+            case AF_INET:
+                rv = connect(sock.fd, (struct sockaddr*)&sock.addr.in, sizeof(sock.addr.in));
+                break;
+
+            case AF_UNIX:
+                rv = connect(sock.fd, (struct sockaddr*)&sock.addr.un, sizeof(sock.addr.un));
+                break;
+        }
+    }
+    return (rv == 0 ? sock.fd : rv);
+}
index 754927e8904d6674e177d51135fd625c290e20bc..dd3c894ccda0dd274cd843d8e50b9054be1de6d3 100644 (file)
@@ -123,7 +123,7 @@ static inline void ParseShortOption(int* currp, char** argv)
     *currp += 1;
 }
 
-void Options_Parse(int argc, char** argv)
+int Options_Parse(int argc, char** argv)
 {
     /* Record the program name */
     ARGV0 = argv[0];
@@ -142,12 +142,12 @@ void Options_Parse(int argc, char** argv)
         }
         else
         {
-            new_argc++;
-            argv[new_argc] = argv[i];
+            argv[new_argc++] = argv[i];
             i++;
         }
     }
-    // return new_argc;
+
+    return new_argc;
 }
 
 void Options_PrintHelp(void)
index e23d73810e8ba60dc7dc990837d677a7049746ae..03c70f0f1e80725d73d98c24221d23b498a99100 100644 (file)
@@ -1,3 +1,6 @@
 #include <liba.h>
 
-Option_T Options[] = { {0} };
\ No newline at end of file
+Option_T Options[] = {
+    { .s = 'h', .l = "help", .a = 0, .d = "print this help message" },
+    {0}
+};
\ No newline at end of file
index b4ca0e4594449db8d46ece9bfe6dd3528548a87c..2a5c644de07c5360d1ee6efa9162d9e5b91f537e 100644 (file)
@@ -83,7 +83,7 @@ int main(int argc, char** argv)
 {
     Stack_Bot = &(intptr_t){0};
     Log.index = 0;
-    Options_Parse(argc, argv);
+    argc = Options_Parse(argc, argv);
     return usermain(argc, argv);
 }
 
diff --git a/lib/net/netaccept.c b/lib/net/netaccept.c
deleted file mode 100644 (file)
index cc18f58..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <libnet.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-int netaccept(int fd)
-{
-    return accept(fd, 0, 0);
-}
diff --git a/lib/net/netannounce.c b/lib/net/netannounce.c
deleted file mode 100644 (file)
index a266378..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <liba.h>
-#include <libnet.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-
-int netannounce(char* dialstr)
-{
-    struct socket_t sock = { .fd = -1 };
-    if (netsocket(dialstr, &sock))
-    {
-        int rv = -1;
-        switch (sock.addr.in.sin_family)
-        {
-            case AF_INET:
-                rv = bind(sock.fd, (struct sockaddr*)&sock.addr.in, sizeof(sock.addr.in));
-                break;
-
-            case AF_UNIX:
-                if ((rv = bind(sock.fd, (struct sockaddr*)&sock.addr.un, sizeof(sock.addr.un))) < 0)
-                {
-                    if (connect(sock.fd, (struct sockaddr*)&sock.addr.un, sizeof(sock.addr.un)) < 0)
-                    {
-                        unlink(sock.addr.un.sun_path);
-                        rv = bind(sock.fd, (struct sockaddr*)&sock.addr.un, sizeof(sock.addr.un));
-                    }
-                }
-                break;
-        }
-        if (rv < 0)
-        {
-            close(sock.fd);
-            sock.fd = -1;
-        }
-    }
-    return sock.fd;
-}
diff --git a/lib/net/netdial.c b/lib/net/netdial.c
deleted file mode 100644 (file)
index 79a94fa..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <liba.h>
-#include <libnet.h>
-
-int netdial(char* dialstr)
-{
-    int rv = -1;
-    struct socket_t sock = { .fd = -1 };
-    if (netsocket(dialstr, &sock))
-    {
-        switch (sock.addr.in.sin_family)
-        {
-            case AF_INET:
-                rv = connect(sock.fd, (struct sockaddr*)&sock.addr.in, sizeof(sock.addr.in));
-                break;
-
-            case AF_UNIX:
-                rv = connect(sock.fd, (struct sockaddr*)&sock.addr.un, sizeof(sock.addr.un));
-                break;
-        }
-    }
-    return (rv == 0 ? sock.fd : rv);
-}
-
-int enetdial(char* dialstr)
-{
-    int fd = -1;
-    if (netdial(dialstr) < 0)
-    {
-        fatal("netdial():");
-    }
-    return fd;
-}
diff --git a/lib/net/netlisten.c b/lib/net/netlisten.c
deleted file mode 100644 (file)
index e1e13fd..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <libnet.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-int netlisten(int fd, int backlog)
-{
-    return listen(fd, backlog);
-}
-
diff --git a/lib/net/netresolve.c b/lib/net/netresolve.c
deleted file mode 100644 (file)
index b3ed729..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <liba.h>
-#include <libnet.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h>
-
-struct in_addr netresolve(char *hostname)
-{
-    struct in_addr addr = {0};
-    struct addrinfo *servinfo, hints = {
-        .ai_family   = AF_UNSPEC,
-        .ai_socktype = SOCK_STREAM
-    };
-    if (getaddrinfo(hostname , NULL , &hints , &servinfo) == 0)
-    {
-        for (struct addrinfo* p = servinfo; p != NULL; p = p->ai_next)
-        {
-            addr = ((struct sockaddr_in *)p->ai_addr)->sin_addr;
-        }
-        freeaddrinfo(servinfo);
-    }
-    return addr;
-}
diff --git a/lib/net/netsocket.c b/lib/net/netsocket.c
deleted file mode 100644 (file)
index 2999646..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <liba.h>
-#include <libnet.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-
-typedef struct {
-    char* network;
-    char* address;
-    char* service;
-} conn_t;
-
-int netsocket(char* dialstr, struct socket_t* sock)
-{
-    size_t i;
-    /* make a local copy of dial string */
-    char dstr[8192];
-    for (i = 0; i < sizeof(dstr)-1 && dialstr[i]; i++)
-    {
-        dstr[i] = dialstr[i];
-    }
-    dstr[i] = '\0';
-
-    /* parse the dial string */
-    conn_t conn;
-    conn.network = strtok(dstr, ":"); if (!conn.network) conn.network = "";
-    conn.address = strtok(NULL, ":"); if (!conn.address) conn.address = "";
-    conn.service = strtok(NULL, ":"); if (!conn.service) conn.service = "";
-
-    /* try and make the connection with the appropriate handler */
-    memset(&sock->addr, 0, sizeof(sock->addr));
-    if (!strcmp("tcp", conn.network))
-    {
-        sock->addr.in.sin_family = AF_INET;
-        sock->addr.in.sin_port = htons(strtol(conn.service, NULL, 0));
-        sock->addr.in.sin_addr = netresolve(conn.address);
-        sock->fd = socket(AF_INET, SOCK_STREAM, 0);
-    }
-    else if (!strcmp("udp", conn.network))
-    {
-        sock->addr.in.sin_family = AF_INET;
-        sock->addr.in.sin_port = htons(strtol(conn.service, NULL, 0));
-        sock->addr.in.sin_addr = netresolve(conn.address);
-        sock->fd = socket(AF_INET, SOCK_DGRAM, 0);
-    }
-    else if (!strcmp("unix", conn.network))
-    {
-        sock->addr.un.sun_family = AF_UNIX;
-        sock->fd = socket(AF_UNIX, SOCK_STREAM, 0);
-        strncpy(sock->addr.un.sun_path, conn.address, sizeof(sock->addr.un.sun_path)-1);
-    }
-    else
-    {
-        errno = EINVAL, sock->fd = -1;
-    }
-    return sock->fd;
-}