From c4ccd4e0798a7ed9af6f86d9819b309575d418a0 Mon Sep 17 00:00:00 2001
From: Lieuwe Rooijakkers <lieuwerooijakkers@gmail.com>
Date: Tue, 23 Jul 2024 00:23:06 +0200
Subject: file_to_filebuf: isdir output parameter

---
 src/io/read_file.c | 12 +++++++-----
 src/io/read_file.h |  3 ++-
 src/tak.c          | 12 +++++++++---
 3 files changed, 18 insertions(+), 9 deletions(-)

(limited to 'src')

diff --git a/src/io/read_file.c b/src/io/read_file.c
index 219a395..22e0286 100644
--- a/src/io/read_file.c
+++ b/src/io/read_file.c
@@ -60,18 +60,20 @@ static void *fd_to_mmap(const int fd, struct stat sb) {
   return addr;
 }
 
-struct filebuf *file_to_filebuf(char *fname, int openOptions) {
+struct filebuf *file_to_filebuf(char *fname, int openOptions, bool *isdir) {
   const int fd = open(fname, O_RDONLY);
   if (fd == -1) {
     return NULL;
   }
 
-  if (openOptions & O_NOALLOWMAP) {
-    goto sponge;
-  }
-
   struct stat sb;
   if (fstat(fd, &sb) == -1) {
+    return NULL;
+  }
+
+  if (isdir != NULL) *isdir = S_ISDIR(sb.st_mode);
+
+  if (openOptions & O_NOALLOWMAP) {
     goto sponge;
   }
 
diff --git a/src/io/read_file.h b/src/io/read_file.h
index 89f738b..d097c05 100644
--- a/src/io/read_file.h
+++ b/src/io/read_file.h
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <stdbool.h>
 #include <stddef.h>
 #include <stdio.h>
 
@@ -20,5 +21,5 @@ struct filebuf {
 };
 
 struct filebuf *stream_to_filebuf(FILE *restrict stream, int openOptions);
-struct filebuf *file_to_filebuf(char *fname, int openOptions);
+struct filebuf *file_to_filebuf(char *fname, int openOptions, bool *isdir);
 void free_filebuf(struct filebuf *filebuf);
diff --git a/src/tak.c b/src/tak.c
index 8ae6ca5..e0c501f 100644
--- a/src/tak.c
+++ b/src/tak.c
@@ -82,11 +82,13 @@ int entry_tak(int argc, char **argv) {
     if (!strcmp(*args, "-")) {
       fb = stream_to_filebuf(stdin, 0);
       if (fb == NULL) goto err_stdin;
+    } else {
+      bool isdir = false;
+      fb = file_to_filebuf(*args, 0, &isdir);
+      if (isdir) goto err_isdir;
+      else if (fb == NULL) goto err_file;
     }
 
-    if (fb == NULL) fb = file_to_filebuf(*args, 0);
-
-    if (fb == NULL) goto err_file;
     process(fb);
 
     args++;
@@ -101,4 +103,8 @@ err_stdin:
 err_file:
   fprintf(stderr, "tak: fout bij lezen van bestand\n");
   return 1;
+
+err_isdir:
+  fprintf(stderr, "tak: bestand '%s' is een mapje\n", *args);
+  return 1;
 }
-- 
cgit v1.2.3-70-g09d2