LTP GCOV extension - code coverage report
Current view: directory - ext/standard - link.c
Test: PHP Code Coverage
Date: 2007-04-10 Instrumented lines: 69
Code covered: 0.0 % Executed lines: 0
Legend: not executed executed

       1                 : /*
       2                 :    +----------------------------------------------------------------------+
       3                 :    | PHP Version 5                                                        |
       4                 :    +----------------------------------------------------------------------+
       5                 :    | Copyright (c) 1997-2007 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:                                                              |
      16                 :    +----------------------------------------------------------------------+
      17                 :  */
      18                 : 
      19                 : /* $Id: link.c,v 1.52.2.1.2.2 2007/01/01 09:36:08 sebastian Exp $ */
      20                 : 
      21                 : #include "php.h"
      22                 : #include "php_filestat.h"
      23                 : #include "php_globals.h"
      24                 : 
      25                 : #ifdef HAVE_SYMLINK
      26                 : 
      27                 : #include <stdlib.h>
      28                 : #if HAVE_UNISTD_H
      29                 : #include <unistd.h>
      30                 : #endif
      31                 : #include <sys/stat.h>
      32                 : #include <string.h>
      33                 : #if HAVE_PWD_H
      34                 : #ifdef PHP_WIN32
      35                 : #include "win32/pwd.h"
      36                 : #else
      37                 : #include <pwd.h>
      38                 : #endif
      39                 : #endif
      40                 : #if HAVE_GRP_H
      41                 : #ifdef PHP_WIN32
      42                 : #include "win32/grp.h"
      43                 : #else
      44                 : #include <grp.h>
      45                 : #endif
      46                 : #endif
      47                 : #include <errno.h>
      48                 : #include <ctype.h>
      49                 : 
      50                 : #include "safe_mode.h"
      51                 : #include "php_link.h"
      52                 : 
      53                 : /* {{{ proto string readlink(string filename)
      54                 :    Return the target of a symbolic link */
      55                 : PHP_FUNCTION(readlink)
      56               0 : {
      57                 :         zval **filename;
      58                 :         char buff[MAXPATHLEN];
      59                 :         int ret;
      60                 : 
      61               0 :         if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &filename) == FAILURE) {
      62               0 :                 WRONG_PARAM_COUNT;
      63                 :         }
      64               0 :         convert_to_string_ex(filename);
      65                 : 
      66               0 :         if (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(filename), NULL, CHECKUID_CHECK_FILE_AND_DIR)) {
      67               0 :                 RETURN_FALSE;
      68                 :         }
      69                 : 
      70               0 :         if (php_check_open_basedir(Z_STRVAL_PP(filename) TSRMLS_CC)) {
      71               0 :                 RETURN_FALSE;
      72                 :         }
      73                 : 
      74               0 :         ret = readlink(Z_STRVAL_PP(filename), buff, MAXPATHLEN-1);
      75                 : 
      76               0 :         if (ret == -1) {
      77               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
      78               0 :                 RETURN_FALSE;
      79                 :         }
      80                 :         /* Append NULL to the end of the string */
      81               0 :         buff[ret] = '\0';
      82                 : 
      83               0 :         RETURN_STRING(buff, 1);
      84                 : }
      85                 : /* }}} */
      86                 : 
      87                 : /* {{{ proto int linkinfo(string filename)
      88                 :    Returns the st_dev field of the UNIX C stat structure describing the link */
      89                 : PHP_FUNCTION(linkinfo)
      90               0 : {
      91                 :         zval **filename;
      92                 :         struct stat sb;
      93                 :         int ret;
      94                 : 
      95               0 :         if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &filename) == FAILURE) {
      96               0 :                 WRONG_PARAM_COUNT;
      97                 :         }
      98               0 :         convert_to_string_ex(filename);
      99                 : 
     100               0 :         ret = VCWD_LSTAT(Z_STRVAL_PP(filename), &sb);
     101               0 :         if (ret == -1) {
     102               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
     103               0 :                 RETURN_LONG(-1L);
     104                 :         }
     105                 : 
     106               0 :         RETURN_LONG((long) sb.st_dev);
     107                 : }
     108                 : /* }}} */
     109                 : 
     110                 : /* {{{ proto int symlink(string target, string link)
     111                 :    Create a symbolic link */
     112                 : PHP_FUNCTION(symlink)
     113               0 : {
     114                 :         zval **topath, **frompath;
     115                 :         int ret;
     116                 :         char source_p[MAXPATHLEN];
     117                 :         char dest_p[MAXPATHLEN];
     118                 : 
     119               0 :         if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &topath, &frompath) == FAILURE) {
     120               0 :                 WRONG_PARAM_COUNT;
     121                 :         }
     122               0 :         convert_to_string_ex(topath);
     123               0 :         convert_to_string_ex(frompath);
     124                 : 
     125               0 :         if (!expand_filepath(Z_STRVAL_PP(frompath), source_p TSRMLS_CC) || !expand_filepath(Z_STRVAL_PP(topath), dest_p TSRMLS_CC)) {
     126               0 :                 RETURN_FALSE;
     127                 :         }
     128                 : 
     129               0 :         if (php_stream_locate_url_wrapper(source_p, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) ||
     130                 :                 php_stream_locate_url_wrapper(dest_p, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) ) 
     131                 :         {
     132               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to symlink to a URL");
     133               0 :                 RETURN_FALSE;
     134                 :         }
     135                 : 
     136               0 :         if (PG(safe_mode) && !php_checkuid(dest_p, NULL, CHECKUID_CHECK_FILE_AND_DIR)) {
     137               0 :                 RETURN_FALSE;
     138                 :         }
     139                 : 
     140               0 :         if (PG(safe_mode) && !php_checkuid(source_p, NULL, CHECKUID_CHECK_FILE_AND_DIR)) {
     141               0 :                 RETURN_FALSE;
     142                 :         }
     143                 : 
     144               0 :         if (php_check_open_basedir(dest_p TSRMLS_CC)) {
     145               0 :                 RETURN_FALSE;
     146                 :         }
     147                 : 
     148               0 :         if (php_check_open_basedir(source_p TSRMLS_CC)) {
     149               0 :                 RETURN_FALSE;
     150                 :         }
     151                 : 
     152                 : #ifndef ZTS
     153               0 :         ret = symlink(Z_STRVAL_PP(topath), Z_STRVAL_PP(frompath));
     154                 : #else 
     155                 :         ret = symlink(dest_p, source_p);
     156                 : #endif  
     157               0 :         if (ret == -1) {
     158               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
     159               0 :                 RETURN_FALSE;
     160                 :         }
     161                 : 
     162               0 :         RETURN_TRUE;
     163                 : }
     164                 : /* }}} */
     165                 : 
     166                 : /* {{{ proto int link(string target, string link)
     167                 :    Create a hard link */
     168                 : PHP_FUNCTION(link)
     169               0 : {
     170                 :         zval **topath, **frompath;
     171                 :         int ret;
     172                 :         char source_p[MAXPATHLEN];
     173                 :         char dest_p[MAXPATHLEN];
     174                 : 
     175               0 :         if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &topath, &frompath) == FAILURE) {
     176               0 :                 WRONG_PARAM_COUNT;
     177                 :         }
     178               0 :         convert_to_string_ex(topath);
     179               0 :         convert_to_string_ex(frompath);
     180                 : 
     181               0 :         if (!expand_filepath(Z_STRVAL_PP(frompath), source_p TSRMLS_CC) || !expand_filepath(Z_STRVAL_PP(topath), dest_p TSRMLS_CC)) {
     182               0 :                 RETURN_FALSE;
     183                 :         }
     184                 : 
     185               0 :         if (php_stream_locate_url_wrapper(source_p, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) ||
     186                 :                 php_stream_locate_url_wrapper(dest_p, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) ) 
     187                 :         {
     188               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to link to a URL");
     189               0 :                 RETURN_FALSE;
     190                 :         }
     191                 : 
     192               0 :         if (PG(safe_mode) && !php_checkuid(dest_p, NULL, CHECKUID_CHECK_FILE_AND_DIR)) {
     193               0 :                 RETURN_FALSE;
     194                 :         }
     195                 : 
     196               0 :         if (PG(safe_mode) && !php_checkuid(source_p, NULL, CHECKUID_CHECK_FILE_AND_DIR)) {
     197               0 :                 RETURN_FALSE;
     198                 :         }
     199                 : 
     200               0 :         if (php_check_open_basedir(dest_p TSRMLS_CC)) {
     201               0 :                 RETURN_FALSE;
     202                 :         }
     203                 : 
     204               0 :         if (php_check_open_basedir(source_p TSRMLS_CC)) {
     205               0 :                 RETURN_FALSE;
     206                 :         }
     207                 : 
     208                 : #ifndef ZTS
     209               0 :         ret = link(Z_STRVAL_PP(topath), Z_STRVAL_PP(frompath));
     210                 : #else 
     211                 :         ret = link(dest_p, source_p);   
     212                 : #endif  
     213               0 :         if (ret == -1) {
     214               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
     215               0 :                 RETURN_FALSE;
     216                 :         }
     217                 : 
     218               0 :         RETURN_TRUE;
     219                 : }
     220                 : /* }}} */
     221                 : 
     222                 : #endif
     223                 : 
     224                 : /*
     225                 :  * Local variables:
     226                 :  * tab-width: 4
     227                 :  * c-basic-offset: 4
     228                 :  * End:
     229                 :  * vim600: noet sw=4 ts=4 fdm=marker
     230                 :  * vim<600: noet sw=4 ts=4
     231                 :  */

Generated by: LTP GCOV extension version 1.5