#include "ucw/fastbuf.h"
#include "ucw/lfs.h"
#include "ucw/conf.h"
+#include "ucw/trans.h"
#include <string.h>
#include <fcntl.h>
ASSERT(af->record_len < 0 || !(size % af->record_len));
int res = write(af->fd, f->buffer, size);
if (res < 0)
- die("Error writing %s: %m", f->name);
+ bthrow(f, "fb.write", "Error writing %s: %m", f->name);
if (res != size)
- die("Unexpected partial write to %s: written only %d bytes of %d", f->name, res, size);
+ bthrow(f, "fb.write", "Unexpected partial write to %s: written only %d bytes of %d", f->name, res, size);
f->bptr = f->buffer;
}
}
fbatomic_close(struct fastbuf *f)
{
struct fb_atomic_file *af = FB_ATOMIC(f)->af;
- fbatomic_internal_write(f); /* Need to flush explicitly, because the file can be locked */
+ if (!(f->flags & FB_DEAD))
+ fbatomic_internal_write(f); /* Need to flush explicitly, because the file can be locked */
if (!--af->use_count)
{
close(af->fd);
}
else
{
+ int fd = ucw_open(name, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0666);
+ if (fd < 0)
+ trans_throw("fb.open", NULL, "Cannot create %s: %m", name);
af = xmalloc_zero(sizeof(*af) + strlen(name));
- if ((af->fd = ucw_open(name, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0666)) < 0)
- die("Cannot create %s: %m", name);
+ af->fd = fd;
af->use_count = 1;
af->record_len = record_len;
af->locked = (record_len < 0);