diff options
Diffstat (limited to 'ext/standard/filestat.c')
-rw-r--r-- | ext/standard/filestat.c | 724 |
1 files changed, 0 insertions, 724 deletions
diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c deleted file mode 100644 index a246c56026..0000000000 --- a/ext/standard/filestat.c +++ /dev/null @@ -1,724 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | 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. | - +----------------------------------------------------------------------+ - | Author: Jim Winstead <jimw@php.net> | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -#include "php.h" -#include "safe_mode.h" -#include "fopen-wrappers.h" -#include "php_globals.h" - -#include <stdlib.h> -#include <sys/stat.h> -#include <string.h> -#include <errno.h> -#include <ctype.h> -#include <time.h> - -#if HAVE_UNISTD_H -# include <unistd.h> -#endif - -#ifdef OS2 -# define INCL_DOS -# include <os2.h> -#endif - -#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS) -# include <sys/statvfs.h> -#elif defined(HAVE_SYS_STATFS_H) && defined(HAVE_STATFS) -# include <sys/statfs.h> -#endif - -#if HAVE_PWD_H -# ifdef PHP_WIN32 -# include "win32/pwd.h" -# else -# include <pwd.h> -# endif -#endif - -#if HAVE_GRP_H -# ifdef PHP_WIN32 -# include "win32/grp.h" -# else -# include <grp.h> -# endif -#endif - -#if HAVE_UTIME -# ifdef PHP_WIN32 -# include <sys/utime.h> -# else -# include <utime.h> -# endif -#endif - -#include "basic_functions.h" - -#include "php_filestat.h" - -#ifndef S_ISDIR -#define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR) -#endif -#ifndef S_ISREG -#define S_ISREG(mode) (((mode)&S_IFMT) == S_IFREG) -#endif -#ifndef S_ISLNK -#define S_ISLNK(mode) (((mode)&S_IFMT) == S_IFLNK) -#endif - -#ifdef PHP_WIN32 -#define S_IRUSR S_IREAD -#define S_IWUSR S_IWRITE -#define S_IXUSR S_IEXEC - -#define S_IRGRP S_IREAD -#define S_IWGRP S_IWRITE -#define S_IXGRP S_IEXEC - -#define S_IROTH S_IREAD -#define S_IWOTH S_IWRITE -#define S_IXOTH S_IEXEC - -#undef getgid -#define getgroups(a,b) 0 -#define getgid() 1 -#define getuid() 1 -#endif - -#define S_IXROOT ( S_IXUSR | S_IXGRP | S_IXOTH ) - -PHP_RINIT_FUNCTION(filestat) -{ - BLS_FETCH(); - - BG(CurrentStatFile)=NULL; - BG(CurrentStatLength)=0; - return SUCCESS; -} - - -PHP_RSHUTDOWN_FUNCTION(filestat) -{ - BLS_FETCH(); - - if (BG(CurrentStatFile)) { - efree (BG(CurrentStatFile)); - } - return SUCCESS; -} - -/* {{{ proto double diskfreespace(string path) - Get free diskspace for filesystem that path is on */ -PHP_FUNCTION(diskfreespace) -{ - pval **path; -#ifdef WINDOWS - double bytesfree; - - HINSTANCE kernel32; - FARPROC gdfse; - typedef BOOL (WINAPI *gdfse_func)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); - gdfse_func func; - - /* These are used by GetDiskFreeSpaceEx, if available. */ - ULARGE_INTEGER FreeBytesAvailableToCaller; - ULARGE_INTEGER TotalNumberOfBytes; - ULARGE_INTEGER TotalNumberOfFreeBytes; - - /* These are used by GetDiskFreeSpace otherwise. */ - DWORD SectorsPerCluster; - DWORD BytesPerSector; - DWORD NumberOfFreeClusters; - DWORD TotalNumberOfClusters; - -#else /* not - WINDOWS */ -#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS) - struct statvfs buf; -#elif defined(HAVE_SYS_STATFS_H) && defined(HAVE_STATFS) - struct statfs buf; -#endif - double bytesfree = 0; -#endif /* WINDOWS */ - - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1,&path)==FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_string_ex(path); - - if (php_check_open_basedir((*path)->value.str.val)) RETURN_FALSE; - -#ifdef WINDOWS - /* GetDiskFreeSpaceEx is only available in NT and Win95 post-OSR2, - so we have to jump through some hoops to see if the function - exists. */ - kernel32 = LoadLibrary("kernel32.dll"); - if (kernel32) { - gdfse = GetProcAddress(kernel32, "GetDiskFreeSpaceExA"); - /* It's available, so we can call it. */ - if (gdfse) { - func = (gdfse_func)gdfse; - if (func((*path)->value.str.val, - &FreeBytesAvailableToCaller, - &TotalNumberOfBytes, - &TotalNumberOfFreeBytes) == 0) RETURN_FALSE; - - /* i know - this is ugly, but i works (thies@digicol.de) */ - bytesfree = FreeBytesAvailableToCaller.HighPart * - (double) (((unsigned long)1) << 31) * 2.0 + - FreeBytesAvailableToCaller.LowPart; - } - /* If it's not available, we just use GetDiskFreeSpace */ - else { - if (GetDiskFreeSpace((*path)->value.str.val, - &SectorsPerCluster, &BytesPerSector, - &NumberOfFreeClusters, &TotalNumberOfClusters) == 0) RETURN_FALSE; - bytesfree = (double)NumberOfFreeClusters * (double)SectorsPerCluster * (double)BytesPerSector; - } - } - else { - php_error(E_WARNING, "Unable to load kernel32.dll"); - RETURN_FALSE; - } - -#elif defined(OS2) - { - FSALLOCATE fsinfo; - char drive = (*path)->value.str.val[0] & 95; - - if (DosQueryFSInfo( drive ? drive - 64 : 0, FSIL_ALLOC, &fsinfo, sizeof( fsinfo ) ) == 0) - bytesfree = (double)fsinfo.cbSector * fsinfo.cSectorUnit * fsinfo.cUnitAvail; - } -#else /* WINDOWS, OS/2 */ -#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS) - if (statvfs((*path)->value.str.val,&buf)) RETURN_FALSE; - if (buf.f_frsize) { - bytesfree = (((double)buf.f_bavail) * ((double)buf.f_frsize)); - } else { - bytesfree = (((double)buf.f_bavail) * ((double)buf.f_bsize)); - } -#elif defined(HAVE_SYS_STATFS_H) && defined(HAVE_STATFS) - if (statfs((*path)->value.str.val,&buf)) RETURN_FALSE; - bytesfree = (((double)buf.f_bsize) * ((double)buf.f_bavail)); -#endif -#endif /* WINDOWS */ - - RETURN_DOUBLE(bytesfree); -} -/* }}} */ - -/* {{{ proto bool chown(string filename, mixed user) - Change file owner */ -PHP_FUNCTION(chgrp) -{ -#ifndef WINDOWS - pval **filename, **group; - gid_t gid; - struct group *gr=NULL; - int ret; - PLS_FETCH(); - - if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2,&filename,&group)==FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(filename); - if ((*group)->type == IS_STRING) { - gr = getgrnam((*group)->value.str.val); - if (!gr) { - php_error(E_WARNING, "unable to find gid for %s", - (*group)->value.str.val); - RETURN_FALSE; - } - gid = gr->gr_gid; - } else { - convert_to_long_ex(group); - gid = (*group)->value.lval; - } - - if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val, NULL, 1))) { - RETURN_FALSE; - } - - /* Check the basedir */ - if (php_check_open_basedir((*filename)->value.str.val)) - RETURN_FALSE; - - ret = V_CHOWN((*filename)->value.str.val, -1, gid); - if (ret == -1) { - php_error(E_WARNING, "chgrp failed: %s", strerror(errno)); - RETURN_FALSE; - } - RETURN_TRUE; -#else - RETURN_FALSE; -#endif -} -/* }}} */ - -/* {{{ proto bool chgrp(string filename, mixed group) - Change file group */ -PHP_FUNCTION(chown) -{ -#ifndef WINDOWS - pval **filename, **user; - int ret; - uid_t uid; - struct passwd *pw = NULL; - PLS_FETCH(); - - if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2,&filename,&user)==FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(filename); - if ((*user)->type == IS_STRING) { - pw = getpwnam((*user)->value.str.val); - if (!pw) { - php_error(E_WARNING, "unable to find uid for %s", - (*user)->value.str.val); - RETURN_FALSE; - } - uid = pw->pw_uid; - } else { - convert_to_long_ex(user); - uid = (*user)->value.lval; - } - - if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val, NULL, 1))) { - RETURN_FALSE; - } - - /* Check the basedir */ - if (php_check_open_basedir((*filename)->value.str.val)) - RETURN_FALSE; - - ret = V_CHOWN((*filename)->value.str.val, uid, -1); - if (ret == -1) { - php_error(E_WARNING, "chown failed: %s", strerror(errno)); - RETURN_FALSE; - } -#endif - RETURN_TRUE; -} -/* }}} */ - - -/* {{{ proto bool chmod(string filename, int mode) - Change file mode */ -PHP_FUNCTION(chmod) -{ - pval **filename, **mode; - int ret,imode; - PLS_FETCH(); - - if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2,&filename,&mode)==FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(filename); - convert_to_long_ex(mode); - - if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val, NULL, 1))) { - RETURN_FALSE; - } - - /* Check the basedir */ - if (php_check_open_basedir((*filename)->value.str.val)) - RETURN_FALSE; - - imode = (*mode)->value.lval; - /* in safe mode, do not allow to setuid files. - Setuiding files could allow users to gain privileges - that safe mode doesn't give them. - */ - if(PG(safe_mode)) - imode &= 0777; - - ret = V_CHMOD((*filename)->value.str.val, imode); - if (ret == -1) { - php_error(E_WARNING, "chmod failed: %s", strerror(errno)); - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - - -/* {{{ proto bool touch(string filename [, int time]) - Set modification time of file */ -PHP_FUNCTION(touch) -{ -#if HAVE_UTIME - pval **filename, **filetime; - int ret; - struct stat sb; - FILE *file; - struct utimbuf *newtime = NULL; - int ac = ZEND_NUM_ARGS(); - PLS_FETCH(); - - if (ac == 1 && zend_get_parameters_ex(1,&filename) != FAILURE) { -#ifndef HAVE_UTIME_NULL - newtime = (struct utimbuf *)emalloc(sizeof(struct utimbuf)); - if (!newtime) { - php_error(E_WARNING, "unable to emalloc memory for changing time"); - return; - } - newtime->actime = time(NULL); - newtime->modtime = newtime->actime; -#endif - } else if (ac == 2 && zend_get_parameters_ex(2,&filename,&filetime) != FAILURE) { - newtime = (struct utimbuf *)emalloc(sizeof(struct utimbuf)); - if (!newtime) { - php_error(E_WARNING, "unable to emalloc memory for changing time"); - return; - } - convert_to_long_ex(filetime); - newtime->actime = (*filetime)->value.lval; - newtime->modtime = (*filetime)->value.lval; - } else { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(filename); - - if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val, NULL, 2))) { - if (newtime) efree(newtime); - RETURN_FALSE; - } - - /* Check the basedir */ - if (php_check_open_basedir((*filename)->value.str.val)) { - if (newtime) efree(newtime); - RETURN_FALSE; - } - - /* create the file if it doesn't exist already */ - ret = V_STAT((*filename)->value.str.val, &sb); - if (ret == -1) { - file = V_FOPEN((*filename)->value.str.val, "w"); - if (file == NULL) { - php_error(E_WARNING, "unable to create file %s because %s", (*filename)->value.str.val, strerror(errno)); - if (newtime) efree(newtime); - RETURN_FALSE; - } - fclose(file); - } - - ret = V_UTIME((*filename)->value.str.val, newtime); - if (newtime) efree(newtime); - if (ret == -1) { - php_error(E_WARNING, "utime failed: %s", strerror(errno)); - RETURN_FALSE; - } else { - RETURN_TRUE; - } -#endif -} -/* }}} */ - - -/* {{{ proto void clearstatcache(void) - Clear file stat cache */ -PHP_FUNCTION(clearstatcache) -{ - BLS_FETCH(); - - if (BG(CurrentStatFile)) { - efree(BG(CurrentStatFile)); - BG(CurrentStatFile) = NULL; - } -} -/* }}} */ - - -static void php_stat(const char *filename, int type, pval *return_value) -{ - struct stat *stat_sb; - int rmask=S_IROTH,wmask=S_IWOTH,xmask=S_IXOTH; /* access rights defaults to other */ - BLS_FETCH(); - - stat_sb = &BG(sb); - - if (!BG(CurrentStatFile) || strcmp(filename,BG(CurrentStatFile))) { - if (!BG(CurrentStatFile) - || strlen(filename) > BG(CurrentStatLength)) { - if (BG(CurrentStatFile)) efree(BG(CurrentStatFile)); - BG(CurrentStatLength) = strlen(filename); - BG(CurrentStatFile) = estrndup(filename,BG(CurrentStatLength)); - } else { - strcpy(BG(CurrentStatFile),filename); - } -#if HAVE_SYMLINK - BG(lsb).st_mode = 0; /* mark lstat buf invalid */ -#endif - if (V_STAT(BG(CurrentStatFile),&BG(sb))==-1) { - if (type != 15 || errno != ENOENT) { /* fileexists() test must print no error */ - php_error(E_NOTICE,"stat failed for %s (errno=%d - %s)",BG(CurrentStatFile),errno,strerror(errno)); - } - efree(BG(CurrentStatFile)); - BG(CurrentStatFile)=NULL; - RETURN_FALSE; - } - } - -#if HAVE_SYMLINK - if (8 == type /* filetype */ - || 14 == type /* is link */ - || 16 == type) { /* lstat */ - - /* do lstat if the buffer is empty */ - - if (!BG(lsb).st_mode) { - if (V_LSTAT(BG(CurrentStatFile),&BG(lsb)) == -1) { - php_error(E_NOTICE,"lstat failed for %s (errno=%d - %s)",BG(CurrentStatFile),errno,strerror(errno)); - RETURN_FALSE; - } - } - } -#endif - - - if(BG(sb).st_uid==getuid()) { - rmask=S_IRUSR; - wmask=S_IWUSR; - xmask=S_IXUSR; - } else if(BG(sb).st_gid==getgid()) { - rmask=S_IRGRP; - wmask=S_IWGRP; - xmask=S_IXGRP; - } else { - int groups,n,i; - gid_t *gids; - - groups = getgroups(0,NULL); - if(groups) { - gids=(gid_t *)emalloc(groups*sizeof(gid_t)); - n=getgroups(groups,gids); - for(i=0;i<n;i++){ - if(BG(sb).st_gid==gids[i]) { - rmask=S_IRGRP; - wmask=S_IWGRP; - xmask=S_IXGRP; - break; - } - } - efree(gids); - } - } - - switch(type) { - case 0: /* fileperms */ - RETURN_LONG((long)BG(sb).st_mode); - case 1: /* fileinode */ - RETURN_LONG((long)BG(sb).st_ino); - case 2: /* filesize */ - RETURN_LONG((long)BG(sb).st_size); - case 3: /* fileowner */ - RETURN_LONG((long)BG(sb).st_uid); - case 4: /* filegroup */ - RETURN_LONG((long)BG(sb).st_gid); - case 5: /* fileatime */ - RETURN_LONG((long)BG(sb).st_atime); - case 6: /* filemtime */ - RETURN_LONG((long)BG(sb).st_mtime); - case 7: /* filectime */ - RETURN_LONG((long)BG(sb).st_ctime); - case 8: /* filetype */ -#if HAVE_SYMLINK - if (S_ISLNK(BG(lsb).st_mode)) { - RETURN_STRING("link",1); - } -#endif - switch(BG(sb).st_mode&S_IFMT) { - case S_IFIFO: RETURN_STRING("fifo",1); - case S_IFCHR: RETURN_STRING("char",1); - case S_IFDIR: RETURN_STRING("dir",1); - case S_IFBLK: RETURN_STRING("block",1); - case S_IFREG: RETURN_STRING("file",1); - } - php_error(E_WARNING,"Unknown file type (%d)",BG(sb).st_mode&S_IFMT); - RETURN_STRING("unknown",1); - case 9: /*is writable*/ - if(getuid()==0) RETURN_LONG(1); /* root */ - RETURN_LONG((BG(sb).st_mode&wmask)!=0); - case 10: /*is readable*/ - if(getuid()==0) RETURN_LONG(1); /* root */ - RETURN_LONG((BG(sb).st_mode&rmask)!=0); - case 11: /*is executable*/ - if(getuid()==0) xmask = S_IXROOT; /* root */ - RETURN_LONG((BG(sb).st_mode&xmask)!=0 && !S_ISDIR(BG(sb).st_mode)); - case 12: /*is file*/ - RETURN_LONG(S_ISREG(BG(sb).st_mode)); - case 13: /*is dir*/ - RETURN_LONG(S_ISDIR(BG(sb).st_mode)); - case 14: /*is link*/ -#if HAVE_SYMLINK - RETURN_LONG(S_ISLNK(BG(lsb).st_mode)); -#else - RETURN_FALSE; -#endif - case 15: /*file exists*/ - RETURN_TRUE; /* the false case was done earlier */ - case 16: /* lstat */ -#if HAVE_SYMLINK - stat_sb = &BG(lsb); -#endif - /* FALLTHROUGH */ - case 17: /* stat */ - if (array_init(return_value) == FAILURE) { - RETURN_FALSE; - } - add_next_index_long(return_value, stat_sb->st_dev); - add_next_index_long(return_value, stat_sb->st_ino); - add_next_index_long(return_value, stat_sb->st_mode); - add_next_index_long(return_value, stat_sb->st_nlink); - add_next_index_long(return_value, stat_sb->st_uid); - add_next_index_long(return_value, stat_sb->st_gid); -#ifdef HAVE_ST_BLKSIZE - add_next_index_long(return_value, stat_sb->st_rdev); -#else - add_next_index_long(return_value, -1); -#endif - add_next_index_long(return_value, stat_sb->st_size); - add_next_index_long(return_value, stat_sb->st_atime); - add_next_index_long(return_value, stat_sb->st_mtime); - add_next_index_long(return_value, stat_sb->st_ctime); -#ifdef HAVE_ST_BLKSIZE - add_next_index_long(return_value, stat_sb->st_blksize); -#else - add_next_index_long(return_value, -1); -#endif -#ifdef HAVE_ST_BLOCKS - add_next_index_long(return_value, stat_sb->st_blocks); -#else - add_next_index_long(return_value, -1); -#endif - return; - } - php_error(E_WARNING, "didn't understand stat call"); - RETURN_FALSE; -} - -/* another quickie macro to make defining similar functions easier */ -#define FileFunction(name, funcnum) \ -void name(INTERNAL_FUNCTION_PARAMETERS) { \ - pval **filename; \ - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1,&filename) == FAILURE) { \ - WRONG_PARAM_COUNT; \ - } \ - convert_to_string_ex(filename); \ - if ((*filename)->value.str.len) \ - php_stat((*filename)->value.str.val, funcnum, return_value); \ -} - -/* {{{ proto int fileperms(string filename) - Get file permissions */ -FileFunction(PHP_FN(fileperms),0) -/* }}} */ - -/* {{{ proto int fileinode(string filename) - Get file inode */ -FileFunction(PHP_FN(fileinode),1) -/* }}} */ - -/* {{{ proto int filesize(string filename) - Get file size */ -FileFunction(PHP_FN(filesize), 2) -/* }}} */ - -/* {{{ proto int fileowner(string filename) - Get file owner */ -FileFunction(PHP_FN(fileowner),3) -/* }}} */ - -/* {{{ proto nt filegroup(string filename) - Get file group */ -FileFunction(PHP_FN(filegroup),4) -/* }}} */ - -/* {{{ proto int fileatime(string filename) - Get last access time of file */ -FileFunction(PHP_FN(fileatime),5) -/* }}} */ - -/* {{{ proto int filemtime(string filename) - Get last modification time of file */ -FileFunction(PHP_FN(filemtime),6) -/* }}} */ - -/* {{{ proto int filectime(string filename) - Get inode modification time of file */ -FileFunction(PHP_FN(filectime),7) -/* }}} */ - -/* {{{ proto string filetype(string filename) - Get file type */ -FileFunction(PHP_FN(filetype), 8) -/* }}} */ - -/* {{{ proto int is_writable(string filename) - Returns true if file can be written */ -FileFunction(PHP_FN(is_writable), 9) -/* }}} */ - -/* {{{ proto int is_readable(string filename) - Returns true if file can be read */ -FileFunction(PHP_FN(is_readable),10) -/* }}} */ - -/* {{{ proto int is_executable(string filename) - Returns true if file is executable */ -FileFunction(PHP_FN(is_executable),11) -/* }}} */ - -/* {{{ proto int is_file(string filename) - Returns true if file is a regular file */ -FileFunction(PHP_FN(is_file),12) -/* }}} */ - -/* {{{ proto int is_dir(string filename) - Returns true if file is directory */ -FileFunction(PHP_FN(is_dir),13) -/* }}} */ - -/* {{{ proto int is_link(string filename) - Returns true if file is symbolic link */ -FileFunction(PHP_FN(is_link),14) -/* }}} */ - -/* {{{ proto bool file_exists(string filename) - Returns true if filename exists */ -FileFunction(PHP_FN(file_exists),15) -/* }}} */ - -/* {{{ proto array lstat(string filename) - Give information about a file or symbolic link */ -FileFunction(PHP_FN(lstat),16) -/* }}} */ - -/* {{{ proto array stat(string filename) - Give information about a file */ -FileFunction(PHP_FN(stat),17) -/* }}} */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ |