all: libs bins
clean:
- find build/ -type f -delete
rm -r build/ rules.mk
bins: libs
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)
{
if (!open || (events & (POLLHUP|POLLERR)))
{
- perror("close():");
close(fromfd);
open = 0;
}
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
#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)
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);
}
-$(BINDIR)/dial: LIBS += -lnet
-$(BINDIR)/listen: LIBS += -lnet
$(BINDIR)/screenlock: LIBS += -lnet -lui -lX11 -lXft -lfontconfig
$(BINDIR)/winmgr: LIBS += -lX11 -lXft -lfontconfig -lXinerama
#ifndef ANVIL_H
#define ANVIL_H
+#define _XOPEN_SOURCE 700
+
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
{
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)
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);
/*
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
*/
+++ /dev/null
-#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);
--- /dev/null
+#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);
+}
*currp += 1;
}
-void Options_Parse(int argc, char** argv)
+int Options_Parse(int argc, char** argv)
{
/* Record the program name */
ARGV0 = argv[0];
}
else
{
- new_argc++;
- argv[new_argc] = argv[i];
+ argv[new_argc++] = argv[i];
i++;
}
}
- // return new_argc;
+
+ return new_argc;
}
void Options_PrintHelp(void)
#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
{
Stack_Bot = &(intptr_t){0};
Log.index = 0;
- Options_Parse(argc, argv);
+ argc = Options_Parse(argc, argv);
return usermain(argc, argv);
}
+++ /dev/null
-#include <libnet.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-int netaccept(int fd)
-{
- return accept(fd, 0, 0);
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#include <libnet.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-int netlisten(int fd, int backlog)
-{
- return listen(fd, backlog);
-}
-
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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;
-}