]> mj.ucw.cz Git - libucw.git/commitdiff
Libucw: Split ucw/fb-temp.c.
authorMartin Mares <mj@ucw.cz>
Sat, 19 Jul 2008 22:23:36 +0000 (00:23 +0200)
committerMartin Mares <mj@ucw.cz>
Sat, 19 Jul 2008 22:23:36 +0000 (00:23 +0200)
Moved the low-level temporary file functions that do not depend on fastbufs
to ucw/tempfile.c.

ucw/Makefile
ucw/fb-temp.c
ucw/tempfile.c [new file with mode: 0644]

index 68094263eb9e31976054ce8761d8fe6fe9adae08..8cd63745ea971f244e249a75be0e5ce8e6b9c0bd 100644 (file)
@@ -15,7 +15,7 @@ LIBUCW_MODS= \
        ipaccess \
        profile \
        fastbuf ff-binary ff-string ff-printf ff-unicode \
-       fb-file carefulio fb-mem fb-temp fb-mmap fb-limfd fb-buffer fb-grow fb-pool fb-atomic fb-param fb-socket \
+       fb-file carefulio fb-mem fb-temp tempfile fb-mmap fb-limfd fb-buffer fb-grow fb-pool fb-atomic fb-param fb-socket \
        char-cat char-upper char-lower unicode stkstring \
        wildmatch regex \
        prime primetable random timer randomkey \
index c9b34ba5dc5a995575ac87e317c2afeb8a3b31b6..f3c574b6bb047d57851e26747dc2dac11722bd85 100644 (file)
@@ -9,67 +9,10 @@
  */
 
 #include "ucw/lib.h"
-#include "ucw/conf.h"
 #include "ucw/fastbuf.h"
-#include "ucw/threads.h"
-#include "ucw/lfs.h"
 
 #include <stdio.h>
-#include <unistd.h>
-#include <sys/fcntl.h>
-#include <stdlib.h>
-#include <sys/time.h>
-#include <errno.h>
-
-static char *temp_prefix = "temp";
-static char *temp_dir;
-static int public_dir = 1;
-
-static struct cf_section temp_config = {
-  CF_ITEMS {
-    CF_STRING("Dir", &temp_dir),
-    CF_STRING("Prefix", &temp_prefix),
-    CF_INT("PublicDir", &public_dir),
-    CF_END
-  }
-};
-
-static void CONSTRUCTOR temp_global_init(void)
-{
-  cf_declare_section("Tempfiles", &temp_config, 0);
-}
-
-void
-temp_file_name(char *name_buf, int *open_flags)
-{
-  char *dir = temp_dir;
-  if (!dir && !(dir = getenv("TMPDIR")))
-    dir = "/tmp";
-
-  int len;
-  if (public_dir)
-    {
-      struct timeval tv;
-      if (gettimeofday(&tv, NULL))
-       die("gettimeofday() failed: %m");
-      len = snprintf(name_buf, TEMP_FILE_NAME_LEN, "%s/%s%u", dir, temp_prefix, (uns) tv.tv_usec);
-      if (open_flags)
-       *open_flags = O_EXCL;
-    }
-  else
-    {
-      struct ucwlib_context *ctx = ucwlib_thread_context();
-      int cnt = ++ctx->temp_counter;
-      int pid = getpid();
-      if (ctx->thread_id == pid)
-       len = snprintf(name_buf, TEMP_FILE_NAME_LEN, "%s/%s%d-%d", dir, temp_prefix, pid, cnt);
-      else
-       len = snprintf(name_buf, TEMP_FILE_NAME_LEN, "%s/%s%d-%d-%d", dir, temp_prefix, pid, ctx->thread_id, cnt);
-      if (open_flags)
-       *open_flags = 0;
-    }
-  ASSERT(len < TEMP_FILE_NAME_LEN);
-}
+#include <fcntl.h>
 
 struct fastbuf *
 bopen_tmp_file(struct fb_params *params)
@@ -81,21 +24,6 @@ bopen_tmp_file(struct fb_params *params)
   return fb;
 }
 
-int
-open_tmp(char *name_buf, int open_flags, int mode)
-{
-  int create_flags, fd, retry = 10;
-  do
-    {
-      temp_file_name(name_buf, &create_flags);
-      fd = ucw_open(name_buf, open_flags | create_flags, mode);
-    }
-  while (fd < 0 && errno == EEXIST && retry --);
-  if (fd < 0)
-    die("Unable to create temp file %s: %m", name_buf);
-  return fd;
-}
-
 struct fastbuf *
 bopen_tmp(uns buflen)
 {
diff --git a/ucw/tempfile.c b/ucw/tempfile.c
new file mode 100644 (file)
index 0000000..f8b0294
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ *     UCW Library -- Temporary Files
+ *
+ *     (c) 2002--2008 Martin Mares <mj@ucw.cz>
+ *     (c) 2008 Michal Vaner <vorner@ucw.cz>
+ *
+ *     This software may be freely distributed and used according to the terms
+ *     of the GNU Lesser General Public License.
+ */
+
+#include "ucw/lib.h"
+#include "ucw/conf.h"
+#include "ucw/threads.h"
+#include "ucw/lfs.h"
+#include "ucw/fastbuf.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/fcntl.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <errno.h>
+
+static char *temp_prefix = "temp";
+static char *temp_dir;
+static int public_dir = 1;
+
+static struct cf_section temp_config = {
+  CF_ITEMS {
+    CF_STRING("Dir", &temp_dir),
+    CF_STRING("Prefix", &temp_prefix),
+    CF_INT("PublicDir", &public_dir),
+    CF_END
+  }
+};
+
+static void CONSTRUCTOR temp_global_init(void)
+{
+  cf_declare_section("Tempfiles", &temp_config, 0);
+}
+
+void
+temp_file_name(char *name_buf, int *open_flags)
+{
+  char *dir = temp_dir;
+  if (!dir && !(dir = getenv("TMPDIR")))
+    dir = "/tmp";
+
+  int len;
+  if (public_dir)
+    {
+      struct timeval tv;
+      if (gettimeofday(&tv, NULL))
+       die("gettimeofday() failed: %m");
+      len = snprintf(name_buf, TEMP_FILE_NAME_LEN, "%s/%s%u", dir, temp_prefix, (uns) tv.tv_usec);
+      if (open_flags)
+       *open_flags = O_EXCL;
+    }
+  else
+    {
+      struct ucwlib_context *ctx = ucwlib_thread_context();
+      int cnt = ++ctx->temp_counter;
+      int pid = getpid();
+      if (ctx->thread_id == pid)
+       len = snprintf(name_buf, TEMP_FILE_NAME_LEN, "%s/%s%d-%d", dir, temp_prefix, pid, cnt);
+      else
+       len = snprintf(name_buf, TEMP_FILE_NAME_LEN, "%s/%s%d-%d-%d", dir, temp_prefix, pid, ctx->thread_id, cnt);
+      if (open_flags)
+       *open_flags = 0;
+    }
+  ASSERT(len < TEMP_FILE_NAME_LEN);
+}
+
+int
+open_tmp(char *name_buf, int open_flags, int mode)
+{
+  int create_flags, fd, retry = 10;
+  do
+    {
+      temp_file_name(name_buf, &create_flags);
+      fd = ucw_open(name_buf, open_flags | create_flags, mode);
+    }
+  while (fd < 0 && errno == EEXIST && retry --);
+  if (fd < 0)
+    die("Unable to create temp file %s: %m", name_buf);
+  return fd;
+}
+
+#ifdef TEST
+
+#include "ucw/getopt.h"
+
+int main(int argc, char **argv)
+{
+  log_init(NULL);
+  if (cf_getopt(argc, argv, CF_SHORT_OPTS, CF_NO_LONG_OPTS, NULL) >= 0)
+    die("Hey, whaddya want?");
+
+  char buf[TEMP_FILE_NAME_LEN];
+  int fd = open_tmp(buf, O_RDWR | O_CREAT | O_TRUNC, 0666);
+  close(fd);
+  unlink(buf);
+  return 0;
+}
+
+#endif