]> mj.ucw.cz Git - libucw.git/blobdiff - lib/fb-file.c
Cleanup of file fastbufs.
[libucw.git] / lib / fb-file.c
index 87791c978a388886f12c3197632e1915fc6be823..30f8eac52e9fcff0751a14326ba024cdfba90e2c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     UCW Library -- Fast Buffered I/O on Files
  *
- *     (c) 1997--2004 Martin Mares <mj@ucw.cz>
+ *     (c) 1997--2007 Martin Mares <mj@ucw.cz>
  *     (c) 2007 Pavel Charvat <pchar@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
@@ -20,7 +20,7 @@
 struct fb_file {
   struct fastbuf fb;
   int fd;                              /* File descriptor */
-  int is_temp_file;                    /* 0=normal file, 1=temporary file, delete on close, -1=shared FD */
+  int is_temp_file;
   int keep_back_buf;                   /* Optimize for backwards reading */
   sh_off_t wpos;                       /* Real file position */
   uns wlen;                            /* Window size */
@@ -102,16 +102,14 @@ long_seek:
       if ((sh_off_t)back > f->pos)
        back = f->pos;
       f->bptr = f->buffer + back;
-      read_len = back + diff - F->wlen;
+      read_len = blen;
+      f->bstop = f->buffer + read_len;
       /* Reuse part of previous window */
-      if (F->wlen && read_len < blen)
+      if (F->wlen && read_len <= back + diff && read_len > back + diff - F->wlen)
         {
-         uns keep = MIN(F->wlen, blen - read_len);
-         memmove(f->buffer + read_len, f->buffer, keep);
-         f->bstop = f->buffer + read_len + keep;
+         uns keep = read_len + F->wlen - back - diff;
+         memmove(f->buffer + read_len - keep, f->buffer, keep);
        }
-      else
-       f->bstop = f->buffer + (read_len = blen);
 seek:
       /* Do lseek() */
       F->wpos = f->pos + (f->buffer - f->bptr);
@@ -201,36 +199,32 @@ bfd_seek(struct fastbuf *f, sh_off_t pos, int whence)
 static void
 bfd_close(struct fastbuf *f)
 {
-  switch (FB_FILE(f)->is_temp_file)
-    {
-    case 1:
-      if (unlink(f->name) < 0)
-       log(L_ERROR, "unlink(%s): %m", f->name);
-    case 0:
-      if (close(FB_FILE(f)->fd))
-       die("close(%s): %m", f->name);
-    }
+  bclose_file_helper(f, FB_FILE(f)->fd, FB_FILE(f)->is_temp_file);
   xfree(f);
 }
 
 static int
 bfd_config(struct fastbuf *f, uns item, int value)
 {
+  int orig;
+
   switch (item)
     {
       case BCONFIG_IS_TEMP_FILE:
+       orig = FB_FILE(f)->is_temp_file;
        FB_FILE(f)->is_temp_file = value;
-       return 0;
+       return orig;
       case BCONFIG_KEEP_BACK_BUF:
+        orig = FB_FILE(f)->keep_back_buf;
        FB_FILE(f)->keep_back_buf = value;
-       return 0;
+       return orig;
       default:
        return -1;
     }
 }
 
 struct fastbuf *
-bfdopen_internal(int fd, byte *name, uns buflen)
+bfdopen_internal(int fd, const char *name, uns buflen)
 {
   ASSERT(buflen);
   int namelen = strlen(name) + 1;
@@ -253,38 +247,12 @@ bfdopen_internal(int fd, byte *name, uns buflen)
   return f;
 }
 
-struct fastbuf *
-bopen_try(byte *name, uns mode, uns buflen)
-{
-  return bopen_file_try(name, mode, &(struct fb_params){ .type = FB_STD, .buffer_size = buflen });
-}
-
-struct fastbuf *
-bopen(byte *name, uns mode, uns buflen)
-{
-  return bopen_file(name, mode, &(struct fb_params){ .type = FB_STD, .buffer_size = buflen });
-}
-
-struct fastbuf *
-bfdopen(int fd, uns buflen)
-{
-  return bopen_fd(fd, &(struct fb_params){ .type = FB_STD, .buffer_size = buflen });
-}
-
-struct fastbuf *
-bfdopen_shared(int fd, uns buflen)
-{
-  struct fastbuf *f = bfdopen(fd, buflen);
-  FB_FILE(f)->is_temp_file = -1;
-  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);
+    msg(L_ERROR, "fsync(%s) failed: %m", b->name);
 }
 
 #ifdef TEST
@@ -293,7 +261,7 @@ int main(void)
 {
   struct fastbuf *f, *t;
   f = bopen_tmp(16);
-  t = bfdopen(1, 13);
+  t = bfdopen_shared(1, 13);
   for (uns i = 0; i < 16; i++)
     bwrite(f, "<hello>", 7);
   bprintf(t, "%d\n", (int)btell(f));