From d75882bf8b371a38aa02ba42fec8092f2c1ef73c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Tue, 19 Sep 2006 14:31:40 +0000 Subject: [PATCH] finally add a good tmpfile function git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18890 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../libroot/posix/glibc/include/unistd.h | 3 + src/system/libroot/posix/glibc/libio/Jamfile | 1 - .../libroot/posix/glibc/stdio-common/Jamfile | 1 + .../posix/glibc/stdio-common/tmpfile.c | 66 +++++++++++++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/system/libroot/posix/glibc/stdio-common/tmpfile.c diff --git a/src/system/libroot/posix/glibc/include/unistd.h b/src/system/libroot/posix/glibc/include/unistd.h index 1713e59add..b48aa08ea4 100644 --- a/src/system/libroot/posix/glibc/include/unistd.h +++ b/src/system/libroot/posix/glibc/include/unistd.h @@ -19,4 +19,7 @@ #define __lseek(fd, pos, whence) \ lseek(fd, pos, whence) +#define __unlink(buf) \ + unlink(buf) + #endif /* _LIBC_UNISTD_H */ diff --git a/src/system/libroot/posix/glibc/libio/Jamfile b/src/system/libroot/posix/glibc/libio/Jamfile index ef46e3d070..cd82c91285 100644 --- a/src/system/libroot/posix/glibc/libio/Jamfile +++ b/src/system/libroot/posix/glibc/libio/Jamfile @@ -69,7 +69,6 @@ MergeObject posix_gnu_libio.o : iovsprintf.c iovsscanf.c # obprintf.c - oldtmpfile.c pclose.c peekc.c putc.c diff --git a/src/system/libroot/posix/glibc/stdio-common/Jamfile b/src/system/libroot/posix/glibc/stdio-common/Jamfile index d643e2b45e..26c680c1c1 100644 --- a/src/system/libroot/posix/glibc/stdio-common/Jamfile +++ b/src/system/libroot/posix/glibc/stdio-common/Jamfile @@ -39,6 +39,7 @@ MergeObject posix_gnu_stdio.o : #_common.o : sscanf.c tempnam.c tempname.c + tmpfile.c tmpnam.c tmpnam_r.c vfprintf.c diff --git a/src/system/libroot/posix/glibc/stdio-common/tmpfile.c b/src/system/libroot/posix/glibc/stdio-common/tmpfile.c new file mode 100644 index 0000000000..8e465a64fd --- /dev/null +++ b/src/system/libroot/posix/glibc/stdio-common/tmpfile.c @@ -0,0 +1,66 @@ +/* Open a stdio stream on an anonymous temporary file. Generic/POSIX version. + Copyright (C) 1991,93,1996-2000,2002,2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + +#ifdef USE_IN_LIBIO +# include +# define __fdopen INTUSE(_IO_fdopen) +# ifndef tmpfile +# define tmpfile __new_tmpfile +# endif +#endif + +#ifndef GEN_THIS +# define GEN_THIS __GT_FILE +#endif + +/* This returns a new stream opened on a temporary file (generated + by tmpnam). The file is opened with mode "w+b" (binary read/write). + If we couldn't generate a unique filename or the file couldn't + be opened, NULL is returned. */ +FILE * +tmpfile (void) +{ + char buf[FILENAME_MAX]; + int fd; + FILE *f; + + if (__path_search (buf, FILENAME_MAX, NULL, "tmpf", 0)) + return NULL; + fd = __gen_tempname (buf, GEN_THIS); + if (fd < 0) + return NULL; + + /* Note that this relies on the Unix semantics that + a file is not really removed until it is closed. */ + (void) __unlink (buf); + + if ((f = __fdopen (fd, "w+b")) == NULL) + __close (fd); + + return f; +} + +#if defined USE_IN_LIBIO && GEN_THIS == __GT_FILE /* Not for tmpfile64. */ +# undef tmpfile +# include +versioned_symbol (libc, __new_tmpfile, tmpfile, GLIBC_2_1); +#endif