#include "ext/standard/basic_functions.h"
-static void php_statpage(void)
+static void php_statpage(BLS_D)
{
-#if !APACHE
- char *path;
- struct stat sb;
- BLS_FETCH();
-#else
- request_rec *r;
- BLS_FETCH();
- SLS_FETCH();
-
- r = ((request_rec *) SG(server_context));
-#endif
-
-#if APACHE
- /* Apache has already gone through the trouble of doing
- the stat(), so the only real overhead is copying three
- values. We can afford it, and it means we don't have to
- worry about resetting the static variables after every
- hit. */
- BG(page_uid) = r ->finfo.st_uid;
- BG(page_inode) = r->finfo.st_ino;
- BG(page_mtime) = r->finfo.st_mtime;
-#else
- if (BG(page_uid) == -1) {
- SLS_FETCH();
+ struct stat *pstat;
- path = SG(request_info).path_translated;
- if (path != NULL) {
- if (stat(path, &sb) == -1) {
- php_error(E_WARNING, "Unable to find file: '%s'", path);
- return;
- }
- BG(page_uid) = sb.st_uid;
- BG(page_inode) = sb.st_ino;
- BG(page_mtime) = sb.st_mtime;
- }
+ pstat = sapi_get_stat();
+
+ if (BG(page_uid)==-1) {
+ BG(page_uid) = pstat->st_uid;
+ BG(page_inode) = pstat->st_ino;
+ BG(page_mtime) = pstat->st_mtime;
}
-#endif
}
long php_getuid(void)
{
BLS_FETCH();
- php_statpage();
+ php_statpage(BLS_C);
return (BG(page_uid));
}
{
BLS_FETCH();
- php_statpage();
+ php_statpage(BLS_C);
if (BG(page_inode) < 0) {
RETURN_FALSE;
} else {
{
BLS_FETCH();
- php_statpage();
+ php_statpage(BLS_C);
if (BG(page_mtime) < 0) {
RETURN_FALSE;
} else {
}
}
-SAPI_API int sapi_get_uid()
+SAPI_API struct stat *sapi_get_stat()
{
SLS_FETCH();
- if (sapi_module.get_uid) {
- return sapi_module.get_uid(SLS_C);
+ if (sapi_module.get_stat) {
+ return sapi_module.get_stat(SLS_C);
} else {
- struct stat statbuf;
-
- if (!SG(request_info).path_translated || (stat(SG(request_info).path_translated, &statbuf)==-1)) {
- return -1;
+ if (!SG(request_info).path_translated || (stat(SG(request_info).path_translated, &SG(global_stat))==-1)) {
+ return NULL;
}
-
- stat(SG(request_info).path_translated, &statbuf);
- return statbuf.st_uid;
+ return &SG(global_stat);
}
}
#include "zend.h"
#include "zend_llist.h"
#include "zend_operators.h"
+#include <sys/stat.h>
#define SAPI_POST_BLOCK_SIZE 4000
sapi_headers_struct sapi_headers;
uint read_post_bytes;
unsigned char headers_sent;
+ struct stat global_stat;
} sapi_globals_struct;
SAPI_API int sapi_register_default_post_reader(void (*default_post_reader)(char *content_type_dup SLS_DC));
SAPI_API int sapi_flush();
-SAPI_API int sapi_get_uid();
+SAPI_API struct stat *sapi_get_stat();
SAPI_API char *sapi_getenv(char *name, int name_len);
struct _sapi_module_struct {
int (*ub_write)(const char *str, unsigned int str_length);
void (*flush)(void *server_context);
- int (*get_uid)(SLS_D);
+ struct stat *(*get_stat)(SLS_D);
char *(*getenv)(char *name, int name_len SLS_DC);
void (*sapi_error)(int type, const char *error_msg, ...);
PHPAPI char *php_get_current_user()
{
struct passwd *pwd;
- int uid;
+ struct stat *pstat;
SLS_FETCH();
if (request_info.current_user) {
USE_SAPI is defined, because cgi will also be
interfaced in USE_SAPI */
- uid = sapi_get_uid();
+ pstat = sapi_get_stat();
- if (uid==-1) {
+ if (!pstat) {
return empty_string;
}
- if ((pwd=getpwuid(uid))==NULL) {
+ if ((pwd=getpwuid(pstat->st_uid))==NULL) {
return empty_string;
}
request_info.current_user_length = strlen(pwd->pw_name);
}
-static int php_apache_get_uid(SLS_D)
+static struct stat *php_apache_get_stat(SLS_D)
{
- return ((request_rec *) SG(server_context))->finfo.st_uid;
+ return &((request_rec *) SG(server_context))->finfo;
}
sapi_apache_ub_write, /* unbuffered write */
sapi_apache_flush, /* flush */
- php_apache_get_uid, /* get uid */
+ php_apache_get_stat, /* get uid */
php_apache_getenv, /* getenv */
php_error, /* error handler */