diff options
author | Linus Nordberg <linus@nordberg.se> | 2014-10-08 16:18:23 +0200 |
---|---|---|
committer | Linus Nordberg <linus@nordberg.se> | 2014-10-08 16:18:23 +0200 |
commit | 9d2ef27d1427ef1c61c497c272a74506d651771a (patch) | |
tree | 48847b4dd27646a186b52b2040e2597fb179b3d8 /c_src/fsynchelper.c | |
parent | 6bceff8e5d10eff9ca59571e80a017afae347ced (diff) | |
parent | 409ea0e5857acffe36ebc977bdce843f994a00aa (diff) |
Merge remote-tracking branch 'refs/remotes/map/fsync4' into origin-master
Conflicts:
src/db.erl
src/plop.erl
Diffstat (limited to 'c_src/fsynchelper.c')
-rw-r--r-- | c_src/fsynchelper.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/c_src/fsynchelper.c b/c_src/fsynchelper.c new file mode 100644 index 0000000..e6a04be --- /dev/null +++ b/c_src/fsynchelper.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2014 Kungliga Tekniska Högskolan + * (KTH Royal Institute of Technology, Stockholm, Sweden). + */ + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> + +#include <sys/time.h> +#include <sys/select.h> + +#include "erlport.h" + +static int +dosync(int fd) +{ +#ifdef F_FULLFSYNC + int ret = fcntl(fd, F_FULLFSYNC); +#else + int ret = fsync(fd); +#endif + return ret; +} + +int +main() +{ + char buf[100]; + ssize_t len; + + /* XXX: exits when command size is 0 */ + + while ((len = read_command(buf, sizeof(buf)-1)) > 0) { + buf[len] = '\0'; + while (1) { + int fd; + + fd = open(buf, O_RDONLY); + if (fd == -1) { + /* XXX: better errors */ + write_status("openerror"); + break; + } + + if (dosync(fd) == 0) { + write_status("ok"); + } else if (errno == EBADF) { + write_status("ebadf"); + } else if (errno == EINTR) { + close(fd); + continue; + } else { + write_status("fsyncerror"); + } + + close(fd); + break; + } + } + + return 0; +} |