From f18a45b76e7c0e5a6ce2c35124e3b1c90ab00a96 Mon Sep 17 00:00:00 2001 From: hellerve Date: Sun, 17 Sep 2017 21:41:36 +0200 Subject: [PATCH] make it so. --- .gitignore | 1 + Makefile | 15 +++++++++++++ README.md | 4 ++++ main.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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..57f7ea5 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +TARGET=867 +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..c332700 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# 867 + +An implementation of [RFC 867](https://tools.ietf.org/html/rfc867), the “time +of the day” service, for the heck of it. diff --git a/main.c b/main.c new file mode 100644 index 0000000..20cc617 --- /dev/null +++ b/main.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +void die(const char *msg) { + perror(msg); + exit(1); +} + +char* get_tod() { + time_t t = time(NULL); + struct tm *tm = localtime(&t); + char* res = malloc(64); + + int len = strftime(res, 64, "%c\n", tm); + + res[len] = '\0'; + + return res; +} + +int main(int argc, char *argv[]) { + int sockfd; + int newsockfd; + int port = 13; + socklen_t clilen; + struct sockaddr_in serv_addr, cli_addr; + int n; + char* tod; + + 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"); + + tod = get_tod(); + n = write(newsockfd, tod, 64); + if (n < 0) die("error writing to socket"); + free(tod); + close(newsockfd); + } + + close(sockfd); + return 0; +}