From: Andi Gutmans Date: Mon, 11 Sep 2000 18:56:47 +0000 (+0000) Subject: - Move php_open_temporary_file() out of file.c X-Git-Tag: php-4.0.3RC1~180 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=824fc6a084923ec8f5569eb1d8f7ed8a9d9c93fd;p=php - Move php_open_temporary_file() out of file.c --- diff --git a/ext/standard/file.c b/ext/standard/file.c index 436f9534df..ecd9c59414 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -31,6 +31,7 @@ #include "ext/standard/flock_compat.h" #include "ext/standard/exec.h" #include "ext/standard/php_filestat.h" +#include "php_open_temporary_file.h" #include #include @@ -115,158 +116,6 @@ static void _file_socket_dtor(int *sock); static int le_fopen, le_popen, le_socket; -/* }}} */ -/* {{{ php_open_temporary_file */ - -/* Loosely based on a tempnam() implementation by UCLA */ - -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_UNISTD_H -# include -#endif - -#ifndef MAXPATHLEN -# ifdef PATH_MAX -# define MAXPATHLEN PATH_MAX -# else -# define MAXPATHLEN 255 -# endif -#endif - -static FILE *php_do_open_temporary_file(char *path, const char *pfx, char **opened_path_p) -{ - char *trailing_slash; - FILE *fp; - char *opened_path; - int fd; - - if (!path) { - return NULL; - } - - if (!(opened_path = emalloc(MAXPATHLEN))) { - return NULL; - } - - if (*path+strlen(path)-1 == '/') { - trailing_slash = ""; - } else { - trailing_slash = "/"; - } - - (void)snprintf(opened_path, MAXPATHLEN, "%s%s%sXXXXXX", path, trailing_slash, pfx); - -#ifdef PHP_WIN32 - if (GetTempFileName(path, pfx, 0, opened_path)) { - fp = V_FOPEN(opened_path, "wb"); - } else { - fp = NULL; - } -#elif defined(HAVE_MKSTEMP) - fd = mkstemp(opened_path); - if (fd==-1) { - fp = NULL; - } else { - fp = fdopen(fd, "wb"); - } -#else - if (mktemp(opened_path)) { - fp = V_FOPEN(opened_path, "wb"); - } else { - fp = NULL; - } -#endif - if (!fp || !opened_path_p) { - efree(opened_path); - } else { - *opened_path_p = opened_path; - } - return fp; -} - -/* Unlike tempnam(), the supplied dir argument takes precedence - * over the TMPDIR environment variable - * This function should do its best to return a file pointer to a newly created - * unique file, on every platform. - */ -FILE *php_open_temporary_file(const char *dir, const char *pfx, char **opened_path_p) -{ - static char path_tmp[] = "/tmp"; - FILE *fp; - - - if (!pfx) { - pfx = "tmp."; - } - - if (opened_path_p) { - *opened_path_p = NULL; - } - - if ((fp=php_do_open_temporary_file((char *) dir, pfx, opened_path_p))) { - return fp; - } - - if ((fp=php_do_open_temporary_file(getenv("TMPDIR"), pfx, opened_path_p))) { - return fp; - } -#if PHP_WIN32 - { - char *TempPath; - - TempPath = (char *) emalloc(MAXPATHLEN); - if (GetTempPath(MAXPATHLEN, TempPath)) { - fp = php_do_open_temporary_file(TempPath, pfx, opened_path_p); - } - efree(TempPath); - return fp; - } -#else - if ((fp=php_do_open_temporary_file(P_tmpdir, pfx, opened_path_p))) { - return fp; - } - - if ((fp=php_do_open_temporary_file(path_tmp, pfx, opened_path_p))) { - return fp; - } -#endif - - return NULL; -} - - /* }}} */ /* {{{ Module-Stuff */ diff --git a/ext/standard/file.h b/ext/standard/file.h index a7e6201569..bf1d3fe8d4 100644 --- a/ext/standard/file.h +++ b/ext/standard/file.h @@ -71,6 +71,8 @@ PHPAPI int php_file_le_fopen(void); PHPAPI int php_file_le_popen(void); PHPAPI int php_file_le_socket(void); PHPAPI int php_copy_file(char *src, char *dest); +#if 0 PHPAPI FILE *php_open_temporary_file(const char *dir, const char *pfx, char **opened_path_p); +#endif #endif /* FILE_H */ diff --git a/ext/swf/swf.c b/ext/swf/swf.c index 797b6e56ff..6e61fdef77 100644 --- a/ext/swf/swf.c +++ b/ext/swf/swf.c @@ -25,7 +25,7 @@ #include #include #include "ext/standard/info.h" -#include "ext/standard/file.h" +#include "php_open_temporary_file.h" #include "php_swf.h" #ifdef ZTS diff --git a/main/Makefile.in b/main/Makefile.in index f1ea53a7eb..0ed91265c5 100644 --- a/main/Makefile.in +++ b/main/Makefile.in @@ -6,7 +6,7 @@ LTLIBRARY_SOURCES = \ safe_mode.c fopen-wrappers.c alloca.c \ php_ini.c SAPI.c rfc1867.c fdfdata.c php_content_types.c strlcpy.c \ strlcat.c mergesort.c reentrancy.c php_variables.c php_ticks.c \ - network.c + network.c php_open_temporary_file.c include $(top_srcdir)/build/ltlib.mk diff --git a/main/php_open_temporary_file.c b/main/php_open_temporary_file.c new file mode 100644 index 0000000000..6eee405aa4 --- /dev/null +++ b/main/php_open_temporary_file.c @@ -0,0 +1,202 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Zeev Suraski | + +----------------------------------------------------------------------+ + */ + +#include "php.h" + +#include +#include +#include +#include +#include +#ifdef PHP_WIN32 +#include +#include +#define O_RDONLY _O_RDONLY +#include "win32/param.h" +#include "win32/winutil.h" +#else +#include +#include +#include +#include +#include +#endif +#if HAVE_PWD_H +#ifdef PHP_WIN32 +#include "win32/pwd.h" +#else +#include +#endif +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#ifdef HAVE_SYS_FILE_H +#include +#endif + +/* {{{ php_open_temporary_file */ + +/* Loosely based on a tempnam() implementation by UCLA */ + +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifndef MAXPATHLEN +# ifdef PATH_MAX +# define MAXPATHLEN PATH_MAX +# else +# define MAXPATHLEN 255 +# endif +#endif + +static FILE *php_do_open_temporary_file(char *path, const char *pfx, char **opened_path_p) +{ + char *trailing_slash; + FILE *fp; + char *opened_path; + int fd; + + if (!path) { + return NULL; + } + + if (!(opened_path = emalloc(MAXPATHLEN))) { + return NULL; + } + + if (*path+strlen(path)-1 == '/') { + trailing_slash = ""; + } else { + trailing_slash = "/"; + } + + (void)snprintf(opened_path, MAXPATHLEN, "%s%s%sXXXXXX", path, trailing_slash, pfx); + +#ifdef PHP_WIN32 + if (GetTempFileName(path, pfx, 0, opened_path)) { + fp = V_FOPEN(opened_path, "wb"); + } else { + fp = NULL; + } +#elif defined(HAVE_MKSTEMP) + fd = mkstemp(opened_path); + if (fd==-1) { + fp = NULL; + } else { + fp = fdopen(fd, "wb"); + } +#else + if (mktemp(opened_path)) { + fp = V_FOPEN(opened_path, "wb"); + } else { + fp = NULL; + } +#endif + if (!fp || !opened_path_p) { + efree(opened_path); + } else { + *opened_path_p = opened_path; + } + return fp; +} + +/* Unlike tempnam(), the supplied dir argument takes precedence + * over the TMPDIR environment variable + * This function should do its best to return a file pointer to a newly created + * unique file, on every platform. + */ +FILE *php_open_temporary_file(const char *dir, const char *pfx, char **opened_path_p) +{ + static char path_tmp[] = "/tmp"; + FILE *fp; + + + if (!pfx) { + pfx = "tmp."; + } + + if (opened_path_p) { + *opened_path_p = NULL; + } + + if ((fp=php_do_open_temporary_file((char *) dir, pfx, opened_path_p))) { + return fp; + } + + if ((fp=php_do_open_temporary_file(getenv("TMPDIR"), pfx, opened_path_p))) { + return fp; + } +#if PHP_WIN32 + { + char *TempPath; + + TempPath = (char *) emalloc(MAXPATHLEN); + if (GetTempPath(MAXPATHLEN, TempPath)) { + fp = php_do_open_temporary_file(TempPath, pfx, opened_path_p); + } + efree(TempPath); + return fp; + } +#else + if ((fp=php_do_open_temporary_file(P_tmpdir, pfx, opened_path_p))) { + return fp; + } + + if ((fp=php_do_open_temporary_file(path_tmp, pfx, opened_path_p))) { + return fp; + } +#endif + + return NULL; +} diff --git a/main/php_open_temporary_file.h b/main/php_open_temporary_file.h new file mode 100644 index 0000000000..b050e5c16e --- /dev/null +++ b/main/php_open_temporary_file.h @@ -0,0 +1,24 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Zeev Suraski | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHP_OPEN_TEMPORARY_FILE_H +#define PHP_OPEN_TEMPORARY_FILE_H + +PHPAPI FILE *php_open_temporary_file(const char *dir, const char *pfx, char **opened_path_p); + +#endif /* PHP_OPEN_TEMPORARY_FILE_H */ diff --git a/main/rfc1867.c b/main/rfc1867.c index d4d4de59c1..b56aedbc44 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -19,7 +19,7 @@ #include #include "php.h" -#include "ext/standard/php_standard.h" +#include "php_open_temporary_file.h" #include "zend_globals.h" #include "php_globals.h" #include "php_variables.h"