PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LTP GCOV extension - code coverage report
Current view: directory - var/php_gcov/PHP_5_2/main - php_open_temporary_file.c
Test: PHP Code Coverage
Date: 2009-11-19 Instrumented lines: 66
Code covered: 78.8 % Executed lines: 52
Legend: not executed executed

       1                 : /*
       2                 :    +----------------------------------------------------------------------+
       3                 :    | PHP Version 5                                                        |
       4                 :    +----------------------------------------------------------------------+
       5                 :    | Copyright (c) 1997-2009 The PHP Group                                |
       6                 :    +----------------------------------------------------------------------+
       7                 :    | This source file is subject to version 3.01 of the PHP license,      |
       8                 :    | that is bundled with this package in the file LICENSE, and is        |
       9                 :    | available through the world-wide-web at the following url:           |
      10                 :    | http://www.php.net/license/3_01.txt                                  |
      11                 :    | If you did not receive a copy of the PHP license and are unable to   |
      12                 :    | obtain it through the world-wide-web, please send a note to          |
      13                 :    | license@php.net so we can mail you a copy immediately.               |
      14                 :    +----------------------------------------------------------------------+
      15                 :    | Author: Zeev Suraski <zeev@zend.com>                                 |
      16                 :    +----------------------------------------------------------------------+
      17                 :  */
      18                 : 
      19                 : /* $Id: php_open_temporary_file.c 282742 2009-06-25 01:35:05Z iliaa $ */
      20                 : 
      21                 : #include "php.h"
      22                 : 
      23                 : #include <errno.h>
      24                 : #include <sys/types.h>
      25                 : #include <sys/stat.h>
      26                 : #include <fcntl.h>
      27                 : 
      28                 : #ifdef PHP_WIN32
      29                 : #define O_RDONLY _O_RDONLY
      30                 : #include "win32/param.h"
      31                 : #include "win32/winutil.h"
      32                 : #elif defined(NETWARE)
      33                 : #ifdef USE_WINSOCK
      34                 : #include <novsock2.h>
      35                 : #else
      36                 : #include <sys/socket.h>
      37                 : #endif
      38                 : #include <sys/param.h>
      39                 : #else
      40                 : #include <sys/param.h>
      41                 : #include <sys/socket.h>
      42                 : #include <netinet/in.h>
      43                 : #include <netdb.h>
      44                 : #if HAVE_ARPA_INET_H
      45                 : #include <arpa/inet.h>
      46                 : #endif
      47                 : #endif
      48                 : #ifdef HAVE_SYS_TIME_H
      49                 : #include <sys/time.h>
      50                 : #endif
      51                 : 
      52                 : #ifdef HAVE_SYS_FILE_H
      53                 : #include <sys/file.h>
      54                 : #endif
      55                 : 
      56                 : #if !defined(P_tmpdir)
      57                 : #define P_tmpdir ""
      58                 : #endif
      59                 : 
      60                 : /* {{{ php_do_open_temporary_file */
      61                 : 
      62                 : /* Loosely based on a tempnam() implementation by UCLA */
      63                 : 
      64                 : /*
      65                 :  * Copyright (c) 1988, 1993
      66                 :  *      The Regents of the University of California.  All rights reserved.
      67                 :  *
      68                 :  * Redistribution and use in source and binary forms, with or without
      69                 :  * modification, are permitted provided that the following conditions
      70                 :  * are met:
      71                 :  * 1. Redistributions of source code must retain the above copyright
      72                 :  *    notice, this list of conditions and the following disclaimer.
      73                 :  * 2. Redistributions in binary form must reproduce the above copyright
      74                 :  *    notice, this list of conditions and the following disclaimer in the
      75                 :  *    documentation and/or other materials provided with the distribution.
      76                 :  * 3. All advertising materials mentioning features or use of this software
      77                 :  *    must display the following acknowledgement:
      78                 :  *      This product includes software developed by the University of
      79                 :  *      California, Berkeley and its contributors.
      80                 :  * 4. Neither the name of the University nor the names of its contributors
      81                 :  *    may be used to endorse or promote products derived from this software
      82                 :  *    without specific prior written permission.
      83                 :  *
      84                 :  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      85                 :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      86                 :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      87                 :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      88                 :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      89                 :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      90                 :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      91                 :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      92                 :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      93                 :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      94                 :  * SUCH DAMAGE.
      95                 :  */
      96                 : 
      97                 : static int php_do_open_temporary_file(const char *path, const char *pfx, char **opened_path_p TSRMLS_DC)
      98            1147 : {
      99                 :         char *trailing_slash;
     100                 :         char *opened_path;
     101                 :         char cwd[MAXPATHLEN];
     102                 :         cwd_state new_state;
     103            1147 :         int fd = -1;
     104                 : #ifndef HAVE_MKSTEMP
     105                 :         int open_flags = O_CREAT | O_TRUNC | O_RDWR
     106                 : #ifdef PHP_WIN32
     107                 :                 | _O_BINARY
     108                 : #endif
     109                 :                 ;
     110                 : #endif
     111                 : 
     112            1147 :         if (!path || !path[0]) {
     113               0 :                 return -1;
     114                 :         }
     115                 : 
     116            1147 :         if (!VCWD_GETCWD(cwd, MAXPATHLEN)) {
     117               0 :                 cwd[0] = '\0';
     118                 :         }
     119                 : 
     120            1147 :         new_state.cwd = strdup(cwd);
     121            1147 :         new_state.cwd_length = strlen(cwd);
     122                 : 
     123            1147 :         if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH)) {
     124              10 :                 free(new_state.cwd);
     125              10 :                 return -1;
     126                 :         }
     127                 : 
     128            1137 :         if (IS_SLASH(new_state.cwd[new_state.cwd_length - 1])) {
     129               0 :                 trailing_slash = "";
     130                 :         } else {
     131            1137 :                 trailing_slash = "/";
     132                 :         }
     133                 : 
     134            1137 :         if (spprintf(&opened_path, 0, "%s%s%sXXXXXX", new_state.cwd, trailing_slash, pfx) >= MAXPATHLEN) {
     135               0 :                 efree(opened_path);
     136               0 :                 free(new_state.cwd);
     137               0 :                 return -1;
     138                 :         }
     139                 : 
     140                 : #ifdef PHP_WIN32
     141                 :         if (GetTempFileName(new_state.cwd, pfx, 0, opened_path)) {
     142                 :                 /* Some versions of windows set the temp file to be read-only,
     143                 :                  * which means that opening it will fail... */
     144                 :                 VCWD_CHMOD(opened_path, 0600);
     145                 :                 fd = VCWD_OPEN_MODE(opened_path, open_flags, 0600);
     146                 :         }
     147                 : #elif defined(HAVE_MKSTEMP)
     148            1137 :         fd = mkstemp(opened_path);
     149                 : #else
     150                 :         if (mktemp(opened_path)) {
     151                 :                 fd = VCWD_OPEN(opened_path, open_flags);
     152                 :         }
     153                 : #endif
     154            1521 :         if (fd == -1 || !opened_path_p) {
     155             384 :                 efree(opened_path);
     156                 :         } else {
     157             753 :                 *opened_path_p = opened_path;
     158                 :         }
     159            1137 :         free(new_state.cwd);
     160            1137 :         return fd;
     161                 : }
     162                 : /* }}} */
     163                 : 
     164                 : /* Cache the chosen temporary directory. */
     165                 : static char* temporary_directory;
     166                 : 
     167                 : PHPAPI void php_shutdown_temporary_directory(void)
     168           13597 : {
     169           13597 :         if (temporary_directory) {
     170             199 :                 free(temporary_directory);
     171             199 :                 temporary_directory = NULL;
     172                 :         }
     173           13597 : }
     174                 : 
     175                 : /*
     176                 :  *  Determine where to place temporary files.
     177                 :  */
     178                 : PHPAPI const char* php_get_temporary_directory(void)
     179            1328 : {
     180                 :         /* Did we determine the temporary directory already? */
     181            1328 :         if (temporary_directory) {
     182            1129 :                 return temporary_directory;
     183                 :         }
     184                 : 
     185                 : #ifdef PHP_WIN32
     186                 :         /* We can't count on the environment variables TEMP or TMP,
     187                 :          * and so must make the Win32 API call to get the default
     188                 :          * directory for temporary files.  Note this call checks
     189                 :          * the environment values TMP and TEMP (in order) first.
     190                 :          */
     191                 :         {
     192                 :                 char sTemp[MAX_PATH];
     193                 :                 DWORD n = GetTempPath(sizeof(sTemp),sTemp);
     194                 :                 assert(0 < n);  /* should *never* fail! */
     195                 :                 temporary_directory = strdup(sTemp);
     196                 :                 return temporary_directory;
     197                 :         }
     198                 : #else
     199                 :         /* On Unix use the (usual) TMPDIR environment variable. */
     200                 :         {
     201             199 :                 char* s = getenv("TMPDIR");
     202             199 :                 if (s && *s) {
     203               0 :                         int len = strlen(s);
     204                 : 
     205               0 :                         if (s[len - 1] == DEFAULT_SLASH) {
     206               0 :                                 temporary_directory = zend_strndup(s, len - 1);
     207                 :                         } else {
     208               0 :                                 temporary_directory = zend_strndup(s, len);
     209                 :                         }
     210                 : 
     211               0 :                         return temporary_directory;
     212                 :                 }
     213                 :         }
     214                 : #ifdef P_tmpdir
     215                 :         /* Use the standard default temporary directory. */
     216                 :         if (P_tmpdir) {
     217             199 :                 temporary_directory = strdup(P_tmpdir);
     218             199 :                 return temporary_directory;
     219                 :         }
     220                 : #endif
     221                 :         /* Shouldn't ever(!) end up here ... last ditch default. */
     222                 :         temporary_directory = strdup("/tmp");
     223                 :         return temporary_directory;
     224                 : #endif
     225                 : }
     226                 : 
     227                 : /* {{{ php_open_temporary_file
     228                 :  *
     229                 :  * Unlike tempnam(), the supplied dir argument takes precedence
     230                 :  * over the TMPDIR environment variable
     231                 :  * This function should do its best to return a file pointer to a newly created
     232                 :  * unique file, on every platform.
     233                 :  */
     234                 : PHPAPI int php_open_temporary_fd_ex(const char *dir, const char *pfx, char **opened_path_p, zend_bool open_basedir_check TSRMLS_DC)
     235             753 : {
     236                 :         int fd;
     237                 :         const char *temp_dir;
     238                 : 
     239             753 :         if (!pfx) {
     240               1 :                 pfx = "tmp.";
     241                 :         }
     242             753 :         if (opened_path_p) {
     243             753 :                 *opened_path_p = NULL;
     244                 :         }
     245                 : 
     246             753 :         if (!dir || *dir == '\0') {
     247             478 : def_tmp:
     248             478 :                 temp_dir = php_get_temporary_directory();
     249                 : 
     250             478 :                 if (temp_dir && *temp_dir != '\0' && (!open_basedir_check || !php_check_open_basedir(temp_dir TSRMLS_CC))) {
     251             478 :                         return php_do_open_temporary_file(temp_dir, pfx, opened_path_p TSRMLS_CC);
     252                 :                 } else {
     253               0 :                         return -1;
     254                 :                 }
     255                 :         }
     256                 : 
     257                 :         /* Try the directory given as parameter. */
     258             669 :         fd = php_do_open_temporary_file(dir, pfx, opened_path_p TSRMLS_CC);
     259             669 :         if (fd == -1) {
     260                 :                 /* Use default temporary directory. */
     261             394 :                 goto def_tmp;
     262                 :         }
     263             275 :         return fd;
     264                 : }
     265                 : 
     266                 : PHPAPI int php_open_temporary_fd(const char *dir, const char *pfx, char **opened_path_p TSRMLS_DC)
     267             747 : {
     268             747 :         return php_open_temporary_fd_ex(dir, pfx, opened_path_p, 0 TSRMLS_CC);
     269                 : }
     270                 : 
     271                 : PHPAPI FILE *php_open_temporary_file(const char *dir, const char *pfx, char **opened_path_p TSRMLS_DC)
     272               1 : {
     273                 :         FILE *fp;
     274               1 :         int fd = php_open_temporary_fd(dir, pfx, opened_path_p TSRMLS_CC);
     275                 : 
     276               1 :         if (fd == -1) {
     277               0 :                 return NULL;
     278                 :         }
     279                 :         
     280               1 :         fp = fdopen(fd, "r+b");
     281               1 :         if (fp == NULL) {
     282               0 :                 close(fd);
     283                 :         }
     284                 :         
     285               1 :         return fp;
     286                 : }
     287                 : /* }}} */
     288                 : 
     289                 : /*
     290                 :  * Local variables:
     291                 :  * tab-width: 4
     292                 :  * c-basic-offset: 4
     293                 :  * End:
     294                 :  * vim600: sw=4 ts=4 fdm=marker
     295                 :  * vim<600: sw=4 ts=4
     296                 :  */

Generated by: LTP GCOV extension version 1.5

Generated at Thu, 19 Nov 2009 08:20:28 +0000 (5 days ago)

Copyright © 2005-2009 The PHP Group
All rights reserved.