summaryrefslogtreecommitdiffstats
path: root/src/io.c
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2020-02-19 14:55:34 +0200
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2020-02-19 14:55:34 +0200
commit1bcfe887515845678f8f648c6dfecffd01813b0f (patch)
tree8f3fbb04211f5fbb21e8dd48e2c823f29a30f99f /src/io.c
parent790d6dcfc531005a5d7ca2f79460d593d61bb1a0 (diff)
downloadalgos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.tar.gz
algos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.tar.bz2
algos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.zip
now with a special generation mode!
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
Diffstat (limited to 'src/io.c')
-rw-r--r--src/io.c181
1 files changed, 116 insertions, 65 deletions
diff --git a/src/io.c b/src/io.c
index a8dfa2f..f10269c 100644
--- a/src/io.c
+++ b/src/io.c
@@ -10,11 +10,12 @@
#include <libgen.h>
#include "io.h"
-int stream_open(struct stream *in)
+static int stream_open_in(struct stream * const in);
+static int stream_open_out(struct stream * const in);
+static int stream_open_special(struct stream * const in);
+
+int stream_open(struct stream * const in)
{
- struct stat st;
- mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP;
- char *dname = NULL;
int ret = 0;
if (!in || in->fd > 0 || !in->name) {
@@ -22,74 +23,19 @@ int stream_open(struct stream *in)
goto err;
}
- if (in->out) {
- char *tmp[2];
-
- tmp[0] = strdup(in->name);
- tmp[1] = dirname(tmp[0]);
- dname = strdup(tmp[1]);
- free(tmp[0]);
-
- if (stat(dname, &st)) {
- ret = errno;
- /* TODO: error message */
- goto err;
- }
-
- if(!(st.st_mode & S_IFDIR)) {
- ret = EINVAL;
- /* TODO: error message */
- goto err;
- }
-
- if (!stat(in->name, &st)) {
- if (!(st.st_mode & S_IFREG)) {
- ret = EINVAL;
- /* TODO: error message */
- goto err;
- }
- mode = st.st_mode;
- }
- } else if (stat(in->name, &st)) {
- ret = errno;
- /* TODO: error message */
- goto err;
- } else if (!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % in->stride)) {
- ret = EINVAL;
- /* TODO: error message */
- goto err;
+ if (in->out == 1) {
+ ret = stream_open_out(in);
+ } else if (!in->out) {
+ ret = stream_open_in(in);
} else {
- in->n = st.st_size / in->stride;
- }
-
- if (in->out) {
- in->fd = open(dname, O_TMPFILE | O_WRONLY, mode);
- if (in->fd < 0) {
- ret = errno;
- /* TODO: error message */
- goto err;
- }
-
- if (ftruncate(in->fd, in->stride * in->n)) {
- ret = errno;
- /* TODO: error message */
- goto err;
- }
- } else {
- in->fd = open(in->name, O_RDONLY | O_NOATIME);
- if (in->fd < 0) {
- ret = errno;
- /* TODO: error message */
- goto err;
- }
+ ret = stream_open_special(in);
}
err:
- free(dname);
return ret;
}
-int stream_close(struct stream *in)
+int stream_close(struct stream * const in)
{
int ret = 0;
@@ -135,3 +81,108 @@ err:
early_err:
return ret;
}
+
+static int stream_open_out(struct stream * const in)
+{
+ struct stat st;
+ mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP;
+ char *dname = NULL;
+ char *tmp[2];
+ int ret = 0;
+
+ tmp[0] = strdup(in->name);
+ tmp[1] = dirname(tmp[0]);
+ dname = strdup(tmp[1]);
+ free(tmp[0]);
+
+ if (stat(dname, &st)) {
+ ret = errno;
+ /* TODO: error message */
+ goto err;
+ }
+
+ if(!(st.st_mode & S_IFDIR)) {
+ ret = EINVAL;
+ /* TODO: error message */
+ goto err;
+ }
+
+ if (!stat(in->name, &st)) {
+ if (!(st.st_mode & S_IFREG)) {
+ ret = EINVAL;
+ /* TODO: error message */
+ goto err;
+ }
+ mode = st.st_mode;
+ }
+
+ in->fd = open(dname, O_TMPFILE | O_WRONLY, mode);
+
+ if (in->fd < 0) {
+ ret = errno;
+ /* TODO: error message */
+ goto err;
+ }
+
+ if (ftruncate(in->fd, in->stride * in->n)) {
+ ret = errno;
+ /* TODO: error message */
+ goto err;
+ }
+
+err:
+ free(dname);
+ return ret;
+}
+
+static int stream_open_in(struct stream * const in)
+{
+ struct stat st;
+ int ret = 0;
+
+ if (stat(in->name, &st)) {
+ ret = errno;
+ /* TODO: error message */
+ goto err;
+ } else if (!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % in->stride)) {
+ ret = EINVAL;
+ /* TODO: error message */
+ goto err;
+ } else {
+ in->n = st.st_size / in->stride;
+ }
+
+ in->fd = open(in->name, O_RDONLY | O_NOATIME);
+
+ if (in->fd < 0) {
+ ret = errno;
+ /* TODO: error message */
+ goto err;
+ }
+
+err:
+ return ret;
+}
+
+static int stream_open_special(struct stream * const in)
+{
+ struct stat st;
+ int ret = 0;
+
+ if (stat(in->name, &st)) {
+ ret = errno;
+ /* TODO: error message */
+ goto err;
+ }
+
+ in->fd = open(in->name, O_RDONLY | O_NOATIME);
+
+ if (in->fd < 0) {
+ ret = errno;
+ /* TODO: error message */
+ goto err;
+ }
+
+err:
+ return ret;
+}