]> mj.ucw.cz Git - libucw.git/blobdiff - lib/fb-direct.c
Let bconfig() return the original value.
[libucw.git] / lib / fb-direct.c
index 9eca31fdae34357f09a303c918734b57486a735a..2fa6ec7f7e16e12037f6a98d017d3c48fcced9e3 100644 (file)
 #include <unistd.h>
 #include <stdio.h>
 
 #include <unistd.h>
 #include <stdio.h>
 
-static uns fbdir_cheat;
-static uns fbdir_buffer_size = 65536;
-static uns fbdir_read_ahead = 1;
-static uns fbdir_write_back = 1;
+uns fbdir_cheat;
 
 static struct cf_section fbdir_cf = {
   CF_ITEMS {
     CF_UNS("Cheat", &fbdir_cheat),
 
 static struct cf_section fbdir_cf = {
   CF_ITEMS {
     CF_UNS("Cheat", &fbdir_cheat),
-    CF_UNS("BufferSize", &fbdir_buffer_size),
-    CF_UNS("ReadAhead", &fbdir_read_ahead),
-    CF_UNS("WriteBack", &fbdir_write_back),
     CF_END
   }
 };
     CF_END
   }
 };
@@ -227,15 +221,15 @@ fbdir_seek(struct fastbuf *f, sh_off_t pos, int whence)
 }
 
 static struct asio_queue *
 }
 
 static struct asio_queue *
-fbdir_get_io_queue(void)
+fbdir_get_io_queue(uns buffer_size, uns write_back)
 {
   struct ucwlib_context *ctx = ucwlib_thread_context();
   struct asio_queue *q = ctx->io_queue;
   if (!q)
     {
       q = xmalloc_zero(sizeof(struct asio_queue));
 {
   struct ucwlib_context *ctx = ucwlib_thread_context();
   struct asio_queue *q = ctx->io_queue;
   if (!q)
     {
       q = xmalloc_zero(sizeof(struct asio_queue));
-      q->buffer_size = fbdir_buffer_size;
-      q->max_writebacks = fbdir_write_back;
+      q->buffer_size = buffer_size;
+      q->max_writebacks = write_back;
       asio_init_queue(q);
       ctx->io_queue = q;
     }
       asio_init_queue(q);
       ctx->io_queue = q;
     }
@@ -274,7 +268,7 @@ fbdir_close(struct fastbuf *f)
     {
     case 1:
       if (unlink(f->name) < 0)
     {
     case 1:
       if (unlink(f->name) < 0)
-       log(L_ERROR, "unlink(%s): %m", f->name);
+       msg(L_ERROR, "unlink(%s): %m", f->name);
     case 0:
       close(F->fd);
     }
     case 0:
       close(F->fd);
     }
@@ -285,18 +279,21 @@ fbdir_close(struct fastbuf *f)
 static int
 fbdir_config(struct fastbuf *f, uns item, int value)
 {
 static int
 fbdir_config(struct fastbuf *f, uns item, int value)
 {
+  int orig;
+
   switch (item)
     {
     case BCONFIG_IS_TEMP_FILE:
   switch (item)
     {
     case BCONFIG_IS_TEMP_FILE:
+      orig = FB_DIRECT(f)->is_temp_file;
       FB_DIRECT(f)->is_temp_file = value;
       FB_DIRECT(f)->is_temp_file = value;
-      return 0;
+      return orig;
     default:
       return -1;
     }
 }
 
     default:
       return -1;
     }
 }
 
-static struct fastbuf *
-fbdir_open_internal(byte *name, int fd, struct asio_queue *q)
+struct fastbuf *
+fbdir_open_fd_internal(int fd, const char *name, struct asio_queue *q, uns buffer_size, uns read_ahead UNUSED, uns write_back)
 {
   int namelen = strlen(name) + 1;
   struct fb_direct *F = xmalloc(sizeof(struct fb_direct) + namelen);
 {
   int namelen = strlen(name) + 1;
   struct fb_direct *F = xmalloc(sizeof(struct fb_direct) + namelen);
@@ -310,7 +307,7 @@ fbdir_open_internal(byte *name, int fd, struct asio_queue *q)
   if (q)
     F->io_queue = F->user_queue = q;
   else
   if (q)
     F->io_queue = F->user_queue = q;
   else
-    F->io_queue = fbdir_get_io_queue();
+    F->io_queue = fbdir_get_io_queue(buffer_size, write_back);
   f->refill = fbdir_refill;
   f->spout = fbdir_spout;
   f->seek = fbdir_seek;
   f->refill = fbdir_refill;
   f->spout = fbdir_spout;
   f->seek = fbdir_seek;
@@ -320,53 +317,6 @@ fbdir_open_internal(byte *name, int fd, struct asio_queue *q)
   return f;
 }
 
   return f;
 }
 
-struct fastbuf *
-fbdir_open_try(byte *name, uns mode, struct asio_queue *q)
-{
-  if (!fbdir_cheat)
-    mode |= O_DIRECT;
-  int fd = sh_open(name, mode, 0666);
-  if (fd < 0)
-    return NULL;
-  struct fastbuf *b = fbdir_open_internal(name, fd, q);
-  if (mode & O_APPEND)
-    fbdir_seek(b, 0, SEEK_END);
-  return b;
-}
-
-struct fastbuf *
-fbdir_open(byte *name, uns mode, struct asio_queue *q)
-{
-  struct fastbuf *b = fbdir_open_try(name, mode, q);
-  if (!b)
-    die("Unable to %s file %s: %m",
-       (mode & O_CREAT) ? "create" : "open", name);
-  return b;
-}
-
-struct fastbuf *
-fbdir_open_fd(int fd, struct asio_queue *q)
-{
-  byte x[32];
-
-  sprintf(x, "fd%d", fd);
-  if (!fbdir_cheat && fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_DIRECT) < 0)
-    log(L_WARN, "Cannot set O_DIRECT on fd %d: %m", fd);
-  return fbdir_open_internal(x, fd, q);
-}
-
-struct fastbuf *
-fbdir_open_tmp(struct asio_queue *q)
-{
-  byte buf[TEMP_FILE_NAME_LEN];
-  struct fastbuf *f;
-
-  temp_file_name(buf);
-  f = fbdir_open(buf, O_RDWR | O_CREAT | O_TRUNC, q);
-  bconfig(f, BCONFIG_IS_TEMP_FILE, 1);
-  return f;
-}
-
 #ifdef TEST
 
 #include "lib/getopt.h"
 #ifdef TEST
 
 #include "lib/getopt.h"