about summary refs log tree commit diff
path: root/cptc.c
diff options
context:
space:
mode:
Diffstat (limited to 'cptc.c')
-rw-r--r--cptc.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/cptc.c b/cptc.c
new file mode 100644
index 0000000..60c1954
--- /dev/null
+++ b/cptc.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+
+#include "cptc.h"
+
+
+#define error(text, status) \
+    do                      \
+    {                       \
+        perror(text);       \
+        exit(status);       \
+    } while (0)             \
+
+
+void CPTC(const char *ip, in_port_t port)
+{
+    struct sockaddr_in addr, peer;
+    socklen_t peer_size;
+    int fd, peerfd;
+
+    if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+        error("socket()", 1);
+
+    addr = (struct sockaddr_in)
+    {
+        .sin_addr.s_addr = inet_addr(ip),
+        .sin_port = htons(port),
+        .sin_family = AF_INET,
+    };
+
+    if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
+        error("bind()", 1);
+    if (listen(fd, 128) == -1)
+        error("listen()", 3);
+
+    printf("Started serving at %s:%d\n", ip, port);
+    for (;;)
+    {
+        peer_size = sizeof(peer);
+        if ((peerfd = accept(fd, (struct sockaddr *)&peer, &peer_size)) < 0)
+        {
+            perror("accept()");
+            continue;
+        }
+        printf("Connection from %s:%u!\n", inet_ntoa(peer.sin_addr), peer.sin_port);
+
+        CPTC_requestHandler(peerfd);
+        close(peerfd);
+    }
+}