From 1d952df45c10434451c20f2773ef5325cec439fe Mon Sep 17 00:00:00 2001 From: hellerve Date: Mon, 18 Sep 2017 10:15:34 +0200 Subject: [PATCH] make it so --- .gitignore | 1 + Makefile | 15 ++++++++++++++ README.md | 8 ++++++++ main.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e660fd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..88ab539 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +TARGET=868 +BUILDDIR=bin/ +PREFIX=/usr/local/bin/ +MAIN=main.c +override CFLAGS+=-Werror -Wall -g -fPIC -O2 -DNDEBUG -ftrapv -Wfloat-equal -Wundef -Wwrite-strings -Wuninitialized -pedantic -std=gnu11 + +all: main.c + mkdir -p $(BUILDDIR) + $(CC) $(MAIN) -o $(BUILDDIR)$(TARGET) $(CFLAGS) + +install: all + install $(BUILDDIR)$(TARGET) $(PREFIX)$(TARGET) + +uninstall: + rm -rf $(PREFIX)$(TARGET) diff --git a/README.md b/README.md new file mode 100644 index 0000000..d0acc07 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# 868 + +An implementation of [RFC 868](https://tools.ietf.org/html/rfc862), the “time” +service, for the heck of it. + +## Limitations + +I’m not sure this is actually correct. diff --git a/main.c b/main.c new file mode 100644 index 0000000..a5b9221 --- /dev/null +++ b/main.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include +#include + +void die(const char *msg) { + perror(msg); + exit(1); +} + +int32_t get_date() { + int32_t res; + + res = time(NULL); + res += 2208988800; // epoch to braindead format + + return res; +} + +int main(int argc, char *argv[]) { + int sockfd; + int newsockfd; + int port = 37; + socklen_t clilen; + struct sockaddr_in serv_addr, cli_addr; + int n; + int32_t date; + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) die("error opening socket."); + + bzero((char *) &serv_addr, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(port); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) < 0) die("error binding socket."); + + clilen = sizeof(cli_addr); + + while (1) { + listen(sockfd, 5); + + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); + if (newsockfd < 0) die("error accepting"); + + date = get_date(); + n = write(newsockfd, &date, 4); + if (n < 0) die("error writing"); + close(newsockfd); + } + + close(sockfd); + return 0; +}