aboutsummaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2020-12-13 13:49:38 +0000
committerrodri <rgl@antares-labs.eu>2020-12-13 13:49:38 +0000
commit47b8a9471fe006cef74d1ba8f8a2839fd8164041 (patch)
tree9c06df600c7b690d0ede965f7d589ef8c4aab629 /util.c
downloadechod-47b8a9471fe006cef74d1ba8f8a2839fd8164041.tar.gz
echod-47b8a9471fe006cef74d1ba8f8a2839fd8164041.tar.bz2
echod-47b8a9471fe006cef74d1ba8f8a2839fd8164041.zip
initial commit. basic udp echo support.
Diffstat (limited to 'util.c')
-rw-r--r--util.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..26acbc3
--- /dev/null
+++ b/util.c
@@ -0,0 +1,113 @@
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <utf.h>
+#include <fmt.h>
+#include "dat.h"
+#include "fns.h"
+
+extern int debug;
+
+void
+sysfatal(char *fmt, ...)
+{
+ va_list arg;
+ char buf[2048];
+
+ va_start(arg, fmt);
+ vseprint(buf, buf+sizeof(buf), fmt, arg);
+ va_end(arg);
+ fprint(2, "%s\n", buf);
+ exit(1);
+}
+
+void *
+emalloc(ulong n)
+{
+ void *p;
+
+ p = malloc(n);
+ if(p == nil)
+ sysfatal("malloc: %r");
+ memset(p, 0, n);
+ return p;
+}
+
+sockaddr_in*
+mkinetsa(char *ipaddr, int port)
+{
+ sockaddr_in *sa;
+
+ sa = emalloc(sizeof(sockaddr_in));
+ sa->sin_family = AF_INET;
+ if(inet_pton(AF_INET, ipaddr, &sa->sin_addr.s_addr) <= 0)
+ sysfatal("inet_pton: %r");
+ sa->sin_port = htons(port);
+ return sa;
+}
+
+int
+listentcp(int port)
+{
+ sockaddr_in *addr;
+ int fd;
+
+ addr = mkinetsa("0.0.0.0", port);
+ if((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
+ return -1;
+ if(bind(fd, (sockaddr*)addr, sizeof(sockaddr_in)) < 0){
+ close(fd);
+ return -1;
+ }
+ if(listen(fd, 128) < 0){
+ close(fd);
+ return -1;
+ }
+ if(debug)
+ fprint(2, "listening on tcp!%s!%d\n", inet_ntoa(addr->sin_addr), port);
+ free(addr);
+ return fd;
+}
+
+int
+bindudp(int port)
+{
+ sockaddr_in *addr;
+ int fd;
+
+ addr = mkinetsa("0.0.0.0", port);
+ if((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
+ return -1;
+ if(bind(fd, (sockaddr*)addr, sizeof(sockaddr_in)) < 0){
+ close(fd);
+ return -1;
+ }
+ if(debug)
+ fprint(2, "listening on udp!%s!%d\n", inet_ntoa(addr->sin_addr), port);
+ free(addr);
+ return fd;
+}
+
+int
+acceptcall(int lfd, char *caddr, int caddrlen)
+{
+ sockaddr_in addr;
+ uint addrlen;
+ int fd, port;
+ char *cs;
+
+ memset(&addr, 0, sizeof(sockaddr_in));
+ addrlen = sizeof(sockaddr_in);
+ if((fd = accept(lfd, (sockaddr*)&addr, &addrlen)) < 0)
+ return -1;
+ cs = inet_ntoa(addr.sin_addr);
+ port = ntohs(addr.sin_port);
+ snprint(caddr, caddrlen, "tcp!%s!%d", cs, port);
+ return fd;
+}