/*
- * Sherlock Library -- Fast Buffered I/O on Files
+ * UCW Library -- Fast Buffered I/O on Files
*
* (c) 1997--2004 Martin Mares <mj@ucw.cz>
*
#include "lib/fastbuf.h"
#include "lib/lfs.h"
-#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
}
struct fastbuf *
-bopen(byte *name, uns mode, uns buflen)
+bopen_try(byte *name, uns mode, uns buflen)
{
- struct fastbuf *b;
- int fd;
+ int fd = sh_open(name, mode, 0666);
+ if (fd < 0)
+ return NULL;
+ struct fastbuf *b = bfdopen_internal(fd, buflen, name);
+ if (mode & O_APPEND)
+ bfd_seek(b, 0, SEEK_END);
+ return b;
+}
+struct fastbuf *
+bopen(byte *name, uns mode, uns buflen)
+{
if (!buflen)
return bopen_mm(name, mode);
- fd = sh_open(name, mode, 0666);
- if (fd < 0)
+ struct fastbuf *b = bopen_try(name, mode, buflen);
+ if (!b)
die("Unable to %s file %s: %m",
(mode & O_CREAT) ? "create" : "open", name);
- b = bfdopen_internal(fd, buflen, name);
- if (mode & O_APPEND)
- bfd_seek(b, 0, SEEK_END);
return b;
}
return f;
}
+void
+bfilesync(struct fastbuf *b)
+{
+ bflush(b);
+ if (fsync(FB_FILE(b)->fd) < 0)
+ log(L_ERROR, "fsync(%s) failed: %m", b->name);
+}
+
#ifdef TEST
int main(int argc, char **argv)