]> mj.ucw.cz Git - libucw.git/commitdiff
Introduced bfdopen_shared() which behaves like bfdopen(), but on
authorMartin Mares <mj@ucw.cz>
Mon, 23 Sep 2002 21:20:02 +0000 (21:20 +0000)
committerMartin Mares <mj@ucw.cz>
Mon, 23 Sep 2002 21:20:02 +0000 (21:20 +0000)
bclose() the fd is left open. Especially useful for buffering stdin/out.

lib/buckettool.c
lib/fastbuf.h
lib/fb-file.c

index b2f51715828e702e0c5eb013dc67abea1dbb8f0f..ae55b3ca4d4f92c784c25bae194ac3c0fae308fd 100644 (file)
@@ -108,7 +108,7 @@ insert(void)
   struct obuck_header h;
   byte *e;
 
-  in = bfdopen(0, 4096);
+  in = bfdopen_shared(0, 4096);
   obuck_init(1);
   do
     {
@@ -123,7 +123,7 @@ insert(void)
     }
   while (e);
   obuck_cleanup();
-  /* bclose(in) not done, we don't want fd 0 closed */
+  bclose(in);
 }
 
 static void
index f3a05952c9db60a16021f66da5e1eaf2d9e2badd..7baa5013b77355546c7b8e5a4db1dc59f4cc7f85 100644 (file)
@@ -69,13 +69,14 @@ struct fastbuf {
 struct fb_file {
   struct fastbuf fb;
   int fd;                              /* File descriptor, -1 if not a real file */
-  int is_temp_file;                    /* Is a temporary file, delete on close */
+  int is_temp_file;                    /* 0=normal file, 1=temporary file, delete on close, -1=shared FD */
 };
 #define FB_FILE(f) ((struct fb_file *)(f)->is_fastbuf)
 
 struct fastbuf *bopen(byte *name, uns mode, uns buffer);
 struct fastbuf *bopen_tmp(uns buffer);
 struct fastbuf *bfdopen(int fd, uns buffer);
+struct fastbuf *bfdopen_shared(int fd, uns buffer);
 void bbcopy(struct fastbuf *f, struct fastbuf *t, uns l);
 #define FB_IS_TEMP_FILE(f) FB_FILE(f)->is_temp_file
 
index 1fc85de5ed500445ec178a237961ce9bdd63a974..73a2f14337a856f3034b3cca9e04276b7adec297 100644 (file)
@@ -63,9 +63,14 @@ bfd_seek(struct fastbuf *f, sh_off_t pos, int whence)
 static void
 bfd_close(struct fastbuf *f)
 {
-  close(FB_FILE(f)->fd);
-  if (FB_FILE(f)->is_temp_file && unlink(f->name) < 0)
-    die("unlink(%s): %m", f->name);
+  switch (FB_FILE(f)->is_temp_file)
+    {
+    case 1:
+      if (unlink(f->name) < 0)
+       log(L_ERROR, "unlink(%s): %m", f->name);
+    case 0:
+      close(FB_FILE(f)->fd);
+    }
   xfree(f);
 }
 
@@ -113,6 +118,14 @@ bfdopen(int fd, uns buffer)
   return bfdopen_internal(fd, buffer, x);
 }
 
+struct fastbuf *
+bfdopen_shared(int fd, uns buffer)
+{
+  struct fastbuf *f = bfdopen(fd, buffer);
+  FB_FILE(f)->is_temp_file = -1;
+  return f;
+}
+
 void bbcopy(struct fastbuf *f, struct fastbuf *t, uns l)
 {
   uns rf = f->bstop - f->bptr;