summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@suse.de>2010-09-14 13:49:30 +0200
committerAndreas Gruenbacher <agruen@suse.de>2010-09-17 01:36:53 +0200
commit4b6267d62f56161d0242bef85a7d72d1e16c1d0f (patch)
tree6c69186173ffb5fd6ac36b89c91ea104b2db94ce
parent0eef74e98122c0fdc29769d1179bba4520231239 (diff)
downloadpatch-4b6267d62f56161d0242bef85a7d72d1e16c1d0f.tar.gz
Add function make_tempfile()
* bootstrap.conf: Use the gnulib tempname module. * src/util.c (make_tempfile): New function.
-rw-r--r--ChangeLog3
-rw-r--r--bootstrap.conf1
-rw-r--r--src/util.c56
-rw-r--r--src/util.h2
4 files changed, 62 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index db28f50..95e8688 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,9 @@
TMPOUTNAME_needs_removal to patch.c.
* src/patch.c (main): Update do_ed_script() call.
+ * bootstrap.conf: Use the gnulib tempname module.
+ * src/util.c (make_tempfile): New function.
+
2010-07-27 Tim Waugh <twaugh@redhat.com>
* src/patch.c: Stops "patch --get 1" from segfaulting.
diff --git a/bootstrap.conf b/bootstrap.conf
index 28169cf..260164d 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -51,6 +51,7 @@ stdbool
stdlib
symlink
sys_stat
+tempname
time
unistd
unlink
diff --git a/src/util.c b/src/util.c
index 8796c4e..c9f4801 100644
--- a/src/util.c
+++ b/src/util.c
@@ -40,6 +40,7 @@
#include <stdarg.h>
#include <full-write.h>
+#include <tempname.h>
static void makedirs (char const *);
@@ -1518,3 +1519,58 @@ Fseek (FILE *stream, file_offset offset, int ptrname)
if (file_seek (stream, offset, ptrname) != 0)
pfatal ("fseek");
}
+
+#ifndef TMPDIR
+#define TMPDIR "/tmp"
+#endif
+
+int
+make_tempfile (char const **name, char letter, char const *real_name,
+ int flags, mode_t mode)
+{
+ char *template;
+
+ if (real_name)
+ {
+ char *dirname, *basename;
+
+ dirname = dir_name (real_name);
+ basename = base_name (real_name);
+
+ template = xmalloc (strlen (dirname) + 1 + strlen (basename) + 9);
+ sprintf (template, "%s/%s.%cXXXXXX", dirname, basename, letter);
+ free (dirname);
+ free (basename);
+ }
+ else
+ {
+ char const *tmpdir;
+
+ tmpdir = getenv ("TMPDIR"); /* Unix tradition */
+ if (! tmpdir)
+ tmpdir = getenv ("TMP"); /* DOS tradition */
+ if (! tmpdir)
+ tmpdir = getenv ("TEMP"); /* another DOS tradition */
+ if (! tmpdir)
+ tmpdir = TMPDIR;
+
+ template = xmalloc (strlen (tmpdir) + 10);
+ sprintf (template, "%s/p%cXXXXXX", tmpdir, letter);
+ }
+ for(;;)
+ {
+ int fd;
+
+ if (gen_tempname (template, 0, flags, GT_NOCREATE))
+ pfatal ("Can't create temporary file %s", template);
+ fd = open (template, O_CREAT | O_EXCL | flags, mode);
+ if (fd == -1)
+ {
+ if (errno == EEXIST)
+ continue;
+ pfatal ("Can't create temporary file %s", template);
+ }
+ *name = template;
+ return fd;
+ }
+}
diff --git a/src/util.h b/src/util.h
index a149603..9635351 100644
--- a/src/util.h
+++ b/src/util.h
@@ -80,3 +80,5 @@ skip_spaces (char const *str)
str++;
return str;
}
+
+int make_tempfile(char const **, char, char const *, int, mode_t);