diff options
author | Lieuwe Rooijakkers <lieuwerooijakkers@gmail.com> | 2024-07-21 21:06:49 +0200 |
---|---|---|
committer | Lieuwe Rooijakkers <lieuwerooijakkers@gmail.com> | 2024-07-21 21:08:20 +0200 |
commit | 665d4c9b6e3ff5e36439e33dc5a0ee2a7c84ccff (patch) | |
tree | 9911d0e68fb7f38e23678b18dab087acfce97144 /src/io | |
parent | 7021e35029dbbd3b7588c5a334daba582805535a (diff) |
read_file: openOptions
Diffstat (limited to 'src/io')
-rw-r--r-- | src/io/read_file.c | 21 | ||||
-rw-r--r-- | src/io/read_file.h | 9 |
2 files changed, 23 insertions, 7 deletions
diff --git a/src/io/read_file.c b/src/io/read_file.c index c344f5b..414a6d8 100644 --- a/src/io/read_file.c +++ b/src/io/read_file.c @@ -13,7 +13,11 @@ return NULL; \ } -struct filebuf *stream_to_filebuf(FILE *restrict stream) { +struct filebuf *stream_to_filebuf(FILE *restrict stream, int openOptions) { + if (openOptions & O_NOALLOWSPONGE) { + return NULL; + } + size_t sz = 0; size_t cap = 4096; char *buf = malloc(cap); @@ -56,12 +60,19 @@ static void *fd_to_mmap(const int fd, struct stat sb) { return addr; } -struct filebuf *file_to_filebuf(char *fname) { +struct filebuf *file_to_filebuf(char *fname, int openOptions) { 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) { - goto stream; + goto sponge; } void *addr; @@ -73,9 +84,9 @@ struct filebuf *file_to_filebuf(char *fname) { return res; } -stream: +sponge: FILE *stream = fdopen(fd, "rb"); - struct filebuf *res = stream_to_filebuf(stream); + struct filebuf *res = stream_to_filebuf(stream, openOptions); fclose(stream); return res; } diff --git a/src/io/read_file.h b/src/io/read_file.h index 201ae5b..89f738b 100644 --- a/src/io/read_file.h +++ b/src/io/read_file.h @@ -3,6 +3,11 @@ #include <stddef.h> #include <stdio.h> +enum allow_flags { + O_NOALLOWMAP = 1 << 0, + O_NOALLOWSPONGE = 1 << 1, +}; + enum mapping_type { MT_MMAP, MT_OWNED, @@ -14,6 +19,6 @@ struct filebuf { enum mapping_type mapping_type; }; -struct filebuf *stream_to_filebuf(FILE *restrict stream); -struct filebuf *file_to_filebuf(char *fname); +struct filebuf *stream_to_filebuf(FILE *restrict stream, int openOptions); +struct filebuf *file_to_filebuf(char *fname, int openOptions); void free_filebuf(struct filebuf *filebuf); |