Back to index

php5  5.3.10
Defines | Functions | Variables
php_open_temporary_file.c File Reference
#include "php.h"
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

Go to the source code of this file.

Defines

#define P_tmpdir   ""

Functions

static int php_do_open_temporary_file (const char *path, const char *pfx, char **opened_path_p TSRMLS_DC)
PHPAPI void php_shutdown_temporary_directory (void)
PHPAPI const char * php_get_temporary_directory (void)
PHPAPI int php_open_temporary_fd_ex (const char *dir, const char *pfx, char **opened_path_p, zend_bool open_basedir_check TSRMLS_DC)
PHPAPI int php_open_temporary_fd (const char *dir, const char *pfx, char **opened_path_p TSRMLS_DC)
PHPAPI FILE * php_open_temporary_file (const char *dir, const char *pfx, char **opened_path_p TSRMLS_DC)

Variables

static char * temporary_directory

Define Documentation

#define P_tmpdir   ""

Definition at line 57 of file php_open_temporary_file.c.


Function Documentation

static int php_do_open_temporary_file ( const char *  path,
const char *  pfx,
char **opened_path_p  TSRMLS_DC 
) [static]

Definition at line 97 of file php_open_temporary_file.c.

{
       char *trailing_slash;
       char *opened_path;
       char cwd[MAXPATHLEN];
       cwd_state new_state;
       int fd = -1;
#ifndef HAVE_MKSTEMP
       int open_flags = O_CREAT | O_TRUNC | O_RDWR
#ifdef PHP_WIN32
              | _O_BINARY
#endif
              ;
#endif

       if (!path || !path[0]) {
              return -1;
       }

#ifdef PHP_WIN32
       if (!php_win32_check_trailing_space(pfx, (const int)strlen(pfx))) {
              SetLastError(ERROR_INVALID_NAME);
              return -1;
       }
#endif

       if (!VCWD_GETCWD(cwd, MAXPATHLEN)) {
              cwd[0] = '\0';
       }

       new_state.cwd = strdup(cwd);
       new_state.cwd_length = strlen(cwd);

       if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH)) {
              free(new_state.cwd);
              return -1;
       }

       if (IS_SLASH(new_state.cwd[new_state.cwd_length - 1])) {
              trailing_slash = "";
       } else {
              trailing_slash = "/";
       }

       if (spprintf(&opened_path, 0, "%s%s%sXXXXXX", new_state.cwd, trailing_slash, pfx) >= MAXPATHLEN) {
              efree(opened_path);
              free(new_state.cwd);
              return -1;
       }

#ifdef PHP_WIN32

       if (GetTempFileName(new_state.cwd, pfx, 0, opened_path)) {
              /* Some versions of windows set the temp file to be read-only,
               * which means that opening it will fail... */
              if (VCWD_CHMOD(opened_path, 0600)) {
                     efree(opened_path);
                     free(new_state.cwd);
                     return -1;
              }
              fd = VCWD_OPEN_MODE(opened_path, open_flags, 0600);
       }

#elif defined(HAVE_MKSTEMP)
       fd = mkstemp(opened_path);
#else
       if (mktemp(opened_path)) {
              fd = VCWD_OPEN(opened_path, open_flags);
       }
#endif

       if (fd == -1 || !opened_path_p) {
              efree(opened_path);
       } else {
              *opened_path_p = opened_path;
       }
       free(new_state.cwd);
       return fd;
}

Here is the call graph for this function:

Here is the caller graph for this function:

PHPAPI const char* php_get_temporary_directory ( void  )

Definition at line 192 of file php_open_temporary_file.c.

{
       /* Did we determine the temporary directory already? */
       if (temporary_directory) {
              return temporary_directory;
       }

#ifdef PHP_WIN32
       /* We can't count on the environment variables TEMP or TMP,
        * and so must make the Win32 API call to get the default
        * directory for temporary files.  Note this call checks
        * the environment values TMP and TEMP (in order) first.
        */
       {
              char sTemp[MAX_PATH];
              DWORD len = GetTempPath(sizeof(sTemp),sTemp);
              assert(0 < len);  /* should *never* fail! */
              if (sTemp[len - 1] == DEFAULT_SLASH) {
                     temporary_directory = zend_strndup(sTemp, len - 1);
              } else {
                     temporary_directory = zend_strndup(sTemp, len);
              }
              return temporary_directory;
       }
#else
       /* On Unix use the (usual) TMPDIR environment variable. */
       {
              char* s = getenv("TMPDIR");
              if (s && *s) {
                     int len = strlen(s);

                     if (s[len - 1] == DEFAULT_SLASH) {
                            temporary_directory = zend_strndup(s, len - 1);
                     } else {
                            temporary_directory = zend_strndup(s, len);
                     }

                     return temporary_directory;
              }
       }
#ifdef P_tmpdir
       /* Use the standard default temporary directory. */
       if (P_tmpdir) {
              temporary_directory = strdup(P_tmpdir);
              return temporary_directory;
       }
#endif
       /* Shouldn't ever(!) end up here ... last ditch default. */
       temporary_directory = strdup("/tmp");
       return temporary_directory;
#endif
}

Here is the call graph for this function:

Here is the caller graph for this function:

PHPAPI int php_open_temporary_fd ( const char *  dir,
const char *  pfx,
char **opened_path_p  TSRMLS_DC 
)

Definition at line 284 of file php_open_temporary_file.c.

{
       return php_open_temporary_fd_ex(dir, pfx, opened_path_p, 0 TSRMLS_CC);
}

Here is the call graph for this function:

Here is the caller graph for this function:

PHPAPI int php_open_temporary_fd_ex ( const char *  dir,
const char *  pfx,
char **  opened_path_p,
zend_bool open_basedir_check  TSRMLS_DC 
)

Definition at line 252 of file php_open_temporary_file.c.

{
       int fd;
       const char *temp_dir;

       if (!pfx) {
              pfx = "tmp.";
       }
       if (opened_path_p) {
              *opened_path_p = NULL;
       }

       if (!dir || *dir == '\0') {
def_tmp:
              temp_dir = php_get_temporary_directory();

              if (temp_dir && *temp_dir != '\0' && (!open_basedir_check || !php_check_open_basedir(temp_dir TSRMLS_CC))) {
                     return php_do_open_temporary_file(temp_dir, pfx, opened_path_p TSRMLS_CC);
              } else {
                     return -1;
              }
       }

       /* Try the directory given as parameter. */
       fd = php_do_open_temporary_file(dir, pfx, opened_path_p TSRMLS_CC);
       if (fd == -1) {
              /* Use default temporary directory. */
              goto def_tmp;
       }
       return fd;
}

Here is the call graph for this function:

Here is the caller graph for this function:

PHPAPI FILE* php_open_temporary_file ( const char *  dir,
const char *  pfx,
char **opened_path_p  TSRMLS_DC 
)

Definition at line 289 of file php_open_temporary_file.c.

{
       FILE *fp;
       int fd = php_open_temporary_fd(dir, pfx, opened_path_p TSRMLS_CC);

       if (fd == -1) {
              return NULL;
       }
       
       fp = fdopen(fd, "r+b");
       if (fp == NULL) {
              close(fd);
       }
       
       return fp;
}

Here is the call graph for this function:

Definition at line 181 of file php_open_temporary_file.c.

Here is the caller graph for this function:


Variable Documentation

char* temporary_directory [static]

Definition at line 179 of file php_open_temporary_file.c.