summaryrefslogtreecommitdiff
path: root/userland
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-07-03 18:32:04 +0200
committerAnton Kling <anton@kling.gg>2024-07-03 18:32:04 +0200
commit6ec139d3ef7c1d2a52bb786779dd1914f125eda4 (patch)
tree30c75cd402e0c3ca6bcb5ac3d9226cf394b6721a /userland
parent4e7918753175dbd8fc38bc7c5b176517e1dbef2f (diff)
rdate: Add a very basic implementation rdate
Also adds sha1sum.c file which I forgot in a previous commit
Diffstat (limited to 'userland')
-rw-r--r--userland/minibox/Makefile2
-rw-r--r--userland/minibox/minibox.c2
-rw-r--r--userland/minibox/utilities/include.h1
-rw-r--r--userland/minibox/utilities/rdate.c50
-rw-r--r--userland/minibox/utilities/sha1sum.c62
5 files changed, 115 insertions, 2 deletions
diff --git a/userland/minibox/Makefile b/userland/minibox/Makefile
index 5192b17..a3a7a77 100644
--- a/userland/minibox/Makefile
+++ b/userland/minibox/Makefile
@@ -1,6 +1,6 @@
CC="i686-sb-gcc"
CFLAGS=-Wall -Wextra -pedantic -Wimplicit-fallthrough -g -O0
-OBJ=minibox.o utilities/cat.o utilities/echo.o utilities/yes.o utilities/minibox.o utilities/ascii.o utilities/wc.o utilities/init.o utilities/ls.o utilities/touch.o utilities/ed.o utilities/sh/sh.o utilities/sh/lexer.o utilities/sh/ast.o utilities/kill.o utilities/sha1sum.o
+OBJ=minibox.o utilities/cat.o utilities/echo.o utilities/yes.o utilities/minibox.o utilities/ascii.o utilities/wc.o utilities/init.o utilities/ls.o utilities/touch.o utilities/ed.o utilities/sh/sh.o utilities/sh/lexer.o utilities/sh/ast.o utilities/kill.o utilities/sha1sum.o utilities/rdate.o
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDE) $(LIBS) -c $< -o $@
diff --git a/userland/minibox/minibox.c b/userland/minibox/minibox.c
index a23c6b2..f8492cc 100644
--- a/userland/minibox/minibox.c
+++ b/userland/minibox/minibox.c
@@ -22,7 +22,7 @@ Command utilities[] = {COMMAND(minibox), COMMAND(ascii), COMMAND(echo),
COMMAND(cat), COMMAND(yes), COMMAND(wc),
COMMAND(init), COMMAND(ls), COMMAND(touch),
COMMAND(ed), COMMAND(sh), COMMAND(kill),
- COMMAND(sha1sum)};
+ COMMAND(sha1sum), COMMAND(rdate)};
char *parse_filename(char *str) {
char *tmp = NULL, *is = str;
diff --git a/userland/minibox/utilities/include.h b/userland/minibox/utilities/include.h
index 6df6ef0..ba30474 100644
--- a/userland/minibox/utilities/include.h
+++ b/userland/minibox/utilities/include.h
@@ -41,3 +41,4 @@ int sh_main(int argc, char **argv);
int kill_main(int argc, char **argv);
int init_main(void);
int sha1sum_main(int argc, char **argv);
+int rdate_main(int argc, char **argv);
diff --git a/userland/minibox/utilities/rdate.c b/userland/minibox/utilities/rdate.c
new file mode 100644
index 0000000..11398c8
--- /dev/null
+++ b/userland/minibox/utilities/rdate.c
@@ -0,0 +1,50 @@
+#include <arpa/inet.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/socket.h>
+
+int rdate_main(int argc, char **argv) {
+ int fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (fd < 0) {
+ perror("socket");
+ return 1;
+ }
+
+ struct addrinfo *result = NULL;
+ struct addrinfo hints;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = 0;
+ hints.ai_canonname = NULL;
+ hints.ai_addr = NULL;
+ hints.ai_next = NULL;
+
+ int rc = getaddrinfo("time-d-g.nist.gov", "37", &hints, &result);
+ if (-1 == rc) {
+ fprintf(stderr, "Error in getaddrinfo()\n");
+ return 1;
+ }
+
+ if (connect(fd, (struct sockaddr *)result->ai_addr, result->ai_addrlen) < 0) {
+ perror("connect");
+ return 1;
+ }
+
+ uint32_t t;
+ read(fd, &t, sizeof(t));
+ t = ntohl(t);
+
+ close(fd);
+
+ int64_t unix_time = (t - 2208988800) * 1000;
+ int clock_fd = open("/dev/clock", O_RDWR);
+ int64_t current;
+ read(clock_fd, &current, sizeof(int64_t));
+ write(clock_fd, &unix_time, sizeof(int64_t));
+ int64_t delta = (current / 1000) - (unix_time / 1000);
+ printf("delta: %d\n", delta);
+ return 0;
+}
diff --git a/userland/minibox/utilities/sha1sum.c b/userland/minibox/utilities/sha1sum.c
new file mode 100644
index 0000000..9c98cc0
--- /dev/null
+++ b/userland/minibox/utilities/sha1sum.c
@@ -0,0 +1,62 @@
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <tb/sha1.h>
+#include <unistd.h>
+
+static int sha1_hash_file(const char *name, int fd) {
+ SHA1_CTX ctx;
+ SHA1_Init(&ctx);
+
+ for (;;) {
+ char buffer[4096];
+ int rc = read(fd, buffer, 4096);
+ if (-1 == rc) {
+ perror("read");
+ return 0;
+ }
+ if (0 == rc) {
+ break;
+ }
+ SHA1_Update(&ctx, buffer, rc);
+ }
+ unsigned char digest[SHA1_LEN];
+ SHA1_Final(&ctx, digest);
+
+ printf("%s: ", name);
+ for (int i = 0; i < SHA1_LEN; i++) {
+ printf("%02x", digest[i]);
+ }
+ printf("\n");
+ return 1;
+}
+
+int sha1sum_main(int argc, char **argv) {
+ int fd = STDIN_FILENO;
+
+ // If no file operands are specified, the standard input shall be
+ // used.
+ if (argc < 2) {
+ return (sha1_hash_file("-", 0)) ? 0 : 1;
+ }
+
+ argv++;
+ for (; *argv; argv++) {
+ if (0 == strcmp(*argv, "-")) {
+ if (!sha1_hash_file("-", 0)) {
+ return 1;
+ }
+ continue;
+ }
+
+ if (-1 == (fd = open(*argv, O_RDONLY, 0))) {
+ perror(*argv);
+ return 1;
+ }
+ if (!sha1_hash_file(*argv, fd)) {
+ return 1;
+ }
+ close(fd);
+ }
+ return 0;
+}