diff options
author | 2020-02-15 21:10:46 +0200 | |
---|---|---|
committer | 2020-02-15 21:10:46 +0200 | |
commit | 8d72ffe268305a823057053f6a172ac7debee3b0 (patch) | |
tree | b2ceb490c89702527c32e467044f4701b67c6a17 | |
parent | 671cef6ab353a6143f88622a86049681ee19e8f4 (diff) | |
download | algos-ld1-8d72ffe268305a823057053f6a172ac7debee3b0.tar.gz algos-ld1-8d72ffe268305a823057053f6a172ac7debee3b0.tar.bz2 algos-ld1-8d72ffe268305a823057053f6a172ac7debee3b0.zip |
add a wrapper for closing files.
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
-rw-r--r-- | src/io.c | 36 | ||||
-rw-r--r-- | src/io.h | 3 | ||||
-rw-r--r-- | src/main.c | 9 |
3 files changed, 38 insertions, 10 deletions
@@ -1,5 +1,6 @@ #include <sys/types.h> #include <sys/stat.h> +#include <linux/limits.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> @@ -9,16 +10,14 @@ #include <libgen.h> #include "io.h" -int openstream(struct stream *in) +int stream_open(struct stream *in) { struct stat st; mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP; char *dname = NULL; int ret = 0; - in->fd = -1; - - if (!in->name) { + if (!in || in->fd > 0 || !in->name) { ret = EINVAL; goto err; } @@ -89,3 +88,32 @@ err: free(dname); return ret; } + +int stream_close(struct stream *in) +{ + char path[PATH_MAX]; + int ret = 0; + + if (!in || in->fd < 0) { + ret = EINVAL; + goto early_err; + } + + if (in->out && in->name) { + snprintf(path, PATH_MAX, "/proc/self/fd/%i", in->fd); + if (linkat(AT_FDCWD, path, AT_FDCWD, in->name, AT_SYMLINK_FOLLOW)) { + ret = errno; + /* TODO: error message */ + goto err; + } + } else { + ret = EINVAL; + goto err; + } + +err: + close(in->fd); + in->fd = -1; +early_err: + return ret; +} @@ -11,6 +11,7 @@ struct stream { char *name; }; -int openstream(struct stream *in); +int stream_open(struct stream *in); +int stream_close(struct stream *in); #endif /* ALGOS_IO_H_INCLUDED */ @@ -1,4 +1,3 @@ -#include <unistd.h> #include <errno.h> #include <stddef.h> #include <stdlib.h> @@ -31,7 +30,7 @@ int main(int argc, char **argv) file_in.name = settings.filein; file_in.stride = 0; /* TODO */ - if ((ret = openstream(&file_in))) { + if ((ret = stream_open(&file_in))) { goto out; } @@ -40,13 +39,13 @@ int main(int argc, char **argv) file_out.n = file_in.n; file_out.stride = 0; /* TODO */ - if ((ret = openstream(&file_out))) { + if ((ret = stream_open(&file_out))) { goto out; } out: - close(file_in.fd); - close(file_out.fd); + stream_close(&file_in); + stream_close(&file_out); return ret; } |