From: Michael D. Lowis Date: Fri, 17 Dec 2021 19:06:51 +0000 (-0500) Subject: rolled lib net into single C file as part of liba X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=2f3f26f1af89a46619b7242736af34eeddfef080;p=proto%2Faos.git rolled lib net into single C file as part of liba --- diff --git a/Makefile b/Makefile index 20ba034..ca94ebb 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,6 @@ all: libs bins clean: - find build/ -type f -delete rm -r build/ rules.mk bins: libs diff --git a/bin/dial.c b/bin/dial.c index 7e41df8..6b5589d 100644 --- a/bin/dial.c +++ b/bin/dial.c @@ -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 diff --git a/bin/listen.c b/bin/listen.c index fddd673..3c87533 100644 --- a/bin/listen.c +++ b/bin/listen.c @@ -3,7 +3,9 @@ #include #include -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); } diff --git a/bin/rules.mk b/bin/rules.mk index 99f7407..7b944d4 100644 --- a/bin/rules.mk +++ b/bin/rules.mk @@ -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 diff --git a/bin/winmgr/anvil.h b/bin/winmgr/anvil.h index 2e38de5..e7eae01 100644 --- a/bin/winmgr/anvil.h +++ b/bin/winmgr/anvil.h @@ -1,6 +1,8 @@ #ifndef ANVIL_H #define ANVIL_H +#define _XOPEN_SOURCE 700 + #include #include #include diff --git a/bin/winmgr/mons.c b/bin/winmgr/mons.c index 78fa4b9..671b89a 100644 --- a/bin/winmgr/mons.c +++ b/bin/winmgr/mons.c @@ -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) diff --git a/inc/liba.h b/inc/liba.h index 39afaa9..705451f 100644 --- a/inc/liba.h +++ b/inc/liba.h @@ -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 index c46afca..0000000 --- a/inc/libnet.h +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -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 index 0000000..65baf5e --- /dev/null +++ b/lib/a/Net.c @@ -0,0 +1,146 @@ +#include +#include +#include +#include +#include +#include + +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); +} diff --git a/lib/a/Options.c b/lib/a/Options.c index 754927e..dd3c894 100644 --- a/lib/a/Options.c +++ b/lib/a/Options.c @@ -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) diff --git a/lib/a/defaults/options.c b/lib/a/defaults/options.c index e23d738..03c70f0 100644 --- a/lib/a/defaults/options.c +++ b/lib/a/defaults/options.c @@ -1,3 +1,6 @@ #include -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 diff --git a/lib/a/gc.c b/lib/a/gc.c index b4ca0e4..2a5c644 100644 --- a/lib/a/gc.c +++ b/lib/a/gc.c @@ -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 index cc18f58..0000000 --- a/lib/net/netaccept.c +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include -#include - -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 index a266378..0000000 --- a/lib/net/netannounce.c +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include -#include -#include -#include - -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 index 79a94fa..0000000 --- a/lib/net/netdial.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include - -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 index e1e13fd..0000000 --- a/lib/net/netlisten.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include - -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 index b3ed729..0000000 --- a/lib/net/netresolve.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include -#include -#include - -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 index 2999646..0000000 --- a/lib/net/netsocket.c +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include -#include - -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; -}