diff options
author | Andreas Gruenbacher <agruen@suse.de> | 2010-09-14 13:49:30 +0200 |
---|---|---|
committer | Andreas Gruenbacher <agruen@suse.de> | 2010-09-17 01:36:53 +0200 |
commit | 4b6267d62f56161d0242bef85a7d72d1e16c1d0f (patch) | |
tree | 6c69186173ffb5fd6ac36b89c91ea104b2db94ce | |
parent | 0eef74e98122c0fdc29769d1179bba4520231239 (diff) | |
download | patch-4b6267d62f56161d0242bef85a7d72d1e16c1d0f.tar.gz |
Add function make_tempfile()
* bootstrap.conf: Use the gnulib tempname module.
* src/util.c (make_tempfile): New function.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | bootstrap.conf | 1 | ||||
-rw-r--r-- | src/util.c | 56 | ||||
-rw-r--r-- | src/util.h | 2 |
4 files changed, 62 insertions, 0 deletions
@@ -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 @@ -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; + } +} @@ -80,3 +80,5 @@ skip_spaces (char const *str) str++; return str; } + +int make_tempfile(char const **, char, char const *, int, mode_t); |