* fixed some #if/#ifdef issues

* hand-patched in php3 changes from 3.0.6 to HEAD in these files:
   fopen-wrappers.[ch] ext/standard/file.[ch] ext/standard/fsock.[ch]
   ext/standard/php3_string.h ext/standard/string.c
* added some new file/socket macros for more readable code:
   FP_FGETS(buf,len,sock,fp,issock)
   FP_FREAD(buf,len,sock,fp,issock)
   FP_FEOF(sock,fp,issock)
   FP_FGETC(sock,fp,issock)
This commit is contained in:
Stig Bakken 1999-06-16 17:06:53 +00:00
parent 5d4579a1f4
commit 117a2fba07
19 changed files with 1244 additions and 660 deletions

View File

@ -26,10 +26,10 @@
/* Define if you have dirent.h but opendir() resides in libc rather than in libdir */
/* This will cause HAVE_DIRENT_H defined twice sometimes, but it should be problem */
#define HAVE_DIRENT_H 0
#undef HAVE_DIRENT_H
/* Define if you have the resolv library (-lresolv). */
#define HAVE_LIBRESOLV 0
#undef HAVE_LIBRESOLV
/* Define if you have the pam library (-lpam). */
#define HAVE_LIBPAM 0
@ -62,10 +62,10 @@
#define HSREGEX 0
/* Define if you have and want to use libnsl */
#define HAVE_LIBNSL 0
#undef HAVE_LIBNSL
/* Define if you have and want to use libsocket */
#define HAVE_LIBSOCKET 0
#undef HAVE_LIBSOCKET
/* Define if you have the sendmail program available */
#define HAVE_SENDMAIL 0
@ -92,12 +92,6 @@
#define DEBUG 0
#endif
/* Define if your system has the gettimeofday() call */
#define HAVE_GETTIMEOFDAY 0
/* Define if your system has the putenv() library call */
#define HAVE_PUTENV 0
/* Define if you want to enable PHP RPC (experimental) */
#define PHP_RPC 0

View File

@ -211,7 +211,7 @@ else
fi
AC_MISSING_FCLOSE_DECL
dnl QNX requires unix.h to allow functions in libunix to work properly
AC_CHECK_HEADERS(fcntl.h unistd.h crypt.h sys/file.h memory.h pwd.h grp.h sys/socket.h sys/wait.h syslog.h string.h sys/varargs.h stdarg.h sys/time.h signal.h netinet/in.h dlfcn.h limits.h sys/types.h unix.h arpa/inet.h)
AC_CHECK_HEADERS(fcntl.h unistd.h crypt.h sys/file.h memory.h pwd.h grp.h sys/socket.h sys/wait.h syslog.h string.h sys/varargs.h stdarg.h sys/time.h signal.h netinet/in.h dlfcn.h limits.h sys/types.h unix.h arpa/inet.h locale.h)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_STRUCT_TM

View File

@ -147,8 +147,8 @@ function_entry basic_functions[] = {
{"strrpos", php3_strrpos, NULL},
{"strrev", php3_strrev, NULL},
{"hebrev", php3_hebrev, NULL},
{"hebrevc", php3_hebrev_with_conversion,NULL},
{"nl2br", php3_newline_to_br, NULL},
PHP_FE(hebrevc, NULL)
PHP_FE(nl2br, NULL)
{"basename", php3_basename, NULL},
{"dirname", php3_dirname, NULL},
{"stripslashes", php3_stripslashes, NULL},
@ -236,7 +236,7 @@ function_entry basic_functions[] = {
{"base_convert",php3_base_convert, NULL},
{"number_format", php3_number_format, NULL},
#if HAVE_PUTENV
#ifdef HAVE_PUTENV
{"putenv", php3_putenv, NULL},
#endif
{"microtime", php3_microtime, NULL},
@ -328,7 +328,7 @@ php3_module_entry basic_functions_module = {
STANDARD_MODULE_PROPERTIES
};
#if HAVE_PUTENV
#ifdef HAVE_PUTENV
static HashTable putenv_ht;
static void _php3_putenv_destructor(putenv_entry *pe)
@ -378,6 +378,7 @@ int php3_minit_basic(INIT_FUNC_ARGS)
test_class_startup();
REGISTER_INI_ENTRIES();
return SUCCESS;
}
@ -392,7 +393,7 @@ int php3_mshutdown_basic(SHUTDOWN_FUNC_ARGS)
int php3_rinit_basic(INIT_FUNC_ARGS)
{
strtok_string = NULL;
#if HAVE_PUTENV
#ifdef HAVE_PUTENV
if (_php3_hash_init(&putenv_ht, 1, NULL, (void (*)(void *)) _php3_putenv_destructor, 0) == FAILURE) {
return FAILURE;
}
@ -406,9 +407,10 @@ int php3_rinit_basic(INIT_FUNC_ARGS)
int php3_rshutdown_basic(SHUTDOWN_FUNC_ARGS)
{
STR_FREE(strtok_string);
#if HAVE_PUTENV
#ifdef HAVE_PUTENV
_php3_hash_destroy(&putenv_ht);
#endif
return SUCCESS;
}
@ -468,7 +470,7 @@ PHP_FUNCTION(getenv)
}
#if HAVE_PUTENV
#ifdef HAVE_PUTENV
PHP_FUNCTION(putenv)
{

View File

@ -34,8 +34,8 @@
#include "php3_dir.h"
#if HAVE_DIRENT_H
#include <dirent.h>
#ifdef HAVE_DIRENT_H
# include <dirent.h>
#endif
#if HAVE_UNISTD_H

View File

@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP HTML Embedded Scripting Language Version 3.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
| Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+----------------------------------------------------------------------+
| This program is free software; you can redistribute it and/or modify |
| it under the terms of one of the following licenses: |
@ -26,7 +26,11 @@
| Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
/* Synced with php3 revision 1.218 1999-06-16 [ssb] */
#include "php.h"
#include "php_globals.h"
#include "ext/standard/flock_compat.h"
@ -59,14 +63,25 @@
#include <pwd.h>
#endif
#endif
#if HAVE_SYS_TIME_H
#include <sys/time.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
#if WIN32|WINNT
# include <winsock.h>
#else
# include <netinet/in.h>
# include <netdb.h>
# include <arpa/inet.h>
#endif
#include "snprintf.h"
#include "fsock.h"
#include "fopen-wrappers.h"
#include "php_globals.h"
#ifdef HAVE_SYS_FILE_H
# include <sys/file.h>
#endif
#if MISSING_FCLOSE_DECL
extern int fclose();
#endif
@ -115,7 +130,9 @@ extern int le_uploads;
* SUCH DAMAGE.
*/
#include <unistd.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifndef MAXPATHLEN
# ifdef PATH_MAX
@ -173,41 +190,48 @@ char *tempnam(const char *dir, const char *pfx)
function_entry php3_file_functions[] = {
{"pclose", php3_pclose, NULL},
{"popen", php3_popen, NULL},
{"readfile", php3_readfile, NULL},
{"rewind", php3_rewind, NULL},
{"rmdir", php3_rmdir, NULL},
{"umask", php3_fileumask, NULL},
{"fclose", php3_fclose, NULL},
{"feof", php3_feof, NULL},
{"fgetc", php3_fgetc, NULL},
{"fgets", php3_fgets, NULL},
{"fgetss", php3_fgetss, NULL},
{"fread", php3_fread, NULL},
{"fopen", php3_fopen, NULL},
{"fpassthru", php3_fpassthru, NULL},
{"fseek", php3_fseek, NULL},
{"ftell", php3_ftell, NULL},
{"fwrite", php3_fwrite, NULL},
{"fputs", php3_fwrite, NULL},
{"mkdir", php3_mkdir, NULL},
{"rename", php3_rename, NULL},
{"copy", php3_file_copy, NULL},
{"tempnam", php3_tempnam, NULL},
{"file", php3_file, NULL},
{"fgetcsv", php3_fgetcsv, NULL},
PHP_FE(flock, NULL)
{"get_meta_tags", php3_get_meta_tags, NULL},
{"set_socket_blocking", php3_set_socket_blocking, NULL},
#if (0 && HAVE_SYS_TIME_H && HAVE_SETSOCKOPT && defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO))
{"set_socket_timeout", php3_set_socket_timeout, NULL},
PHP_FE(pclose, NULL)
PHP_FE(popen, NULL)
PHP_FE(readfile, NULL)
PHP_FE(rewind, NULL)
PHP_FE(rmdir, NULL)
PHP_FE(umask, NULL)
PHP_FE(fclose, NULL)
PHP_FE(feof, NULL)
PHP_FE(fgetc, NULL)
PHP_FE(fgets, NULL)
PHP_FE(fgetss, NULL)
PHP_FE(fread, NULL)
PHP_FE(fopen, NULL)
PHP_FE(fpassthru, NULL)
PHP_FE(fseek, NULL)
PHP_FE(ftell, NULL)
PHP_FE(fwrite, NULL)
{"fputs", php3_fwrite, NULL},
PHP_FE(mkdir, NULL)
PHP_FE(rename, NULL)
PHP_FE(copy, NULL)
PHP_FE(tempnam, NULL)
PHP_FE(file, NULL)
PHP_FE(fgetcsv, NULL)
PHP_FE(flock, NULL)
PHP_FE(get_meta_tags, NULL)
PHP_FE(set_socket_blocking, NULL)
#if (0 && defined(HAVE_SYS_TIME_H) && HAVE_SETSOCKOPT && defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO))
PHP_FE(set_socket_timeout, NULL)
#endif
{NULL, NULL, NULL}
};
php3_module_entry php3_file_module_entry = {
"PHP_file", php3_file_functions, php3_minit_file, NULL, NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES
"File functions",
php3_file_functions,
php3_minit_file,
NULL,
NULL,
NULL,
NULL,
STANDARD_MODULE_PROPERTIES
};
@ -307,20 +331,16 @@ PHP_FUNCTION(get_meta_tags)
if (array_init(return_value)==FAILURE) {
if (issock) {
#if WIN32|WINNT
closesocket(socketd);
#else
close(socketd);
#endif
SOCK_FCLOSE(socketd);
} else {
fclose(fp);
}
RETURN_FALSE;
}
/* Now loop through the file and do the magic quotes thing if needed */
memset(buf,0,8191);
while((issock?SOCK_FGETS(buf,8191,socketd):fgets(buf,8191,fp) != NULL)
&& !php3i_stristr(buf,"</head>")) {
memset(buf, 0, 8191);
while((FP_FGETS(buf,8191,socketd,fp,issock) != NULL)
&& !php3i_stristr(buf,"</head>")) {
if(php3i_stristr(buf,"<meta")) {
memset(var_name,0,50);
@ -383,11 +403,7 @@ PHP_FUNCTION(get_meta_tags)
}
}
if (issock) {
#if WIN32|WINNT
closesocket(socketd);
#else
close(socketd);
#endif
SOCK_FCLOSE(socketd);
} else {
fclose(fp);
}
@ -442,7 +458,7 @@ PHP_FUNCTION(file)
/* Now loop through the file and do the magic quotes thing if needed */
memset(buf,0,8191);
while(issock?SOCK_FGETS(buf,8191,socketd):fgets(buf,8191,fp) != NULL) {
while (FP_FGETS(buf,8191,socketd,fp,issock) != NULL) {
if (PG(magic_quotes_runtime)) {
int len;
@ -453,11 +469,7 @@ PHP_FUNCTION(file)
}
}
if (issock) {
#if WIN32|WINNT
closesocket(socketd);
#else
close(socketd);
#endif
SOCK_FCLOSE(socketd);
} else {
fclose(fp);
}
@ -472,15 +484,10 @@ static void __pclose(FILE *pipe)
static void _php3_closesocket(int *sock) {
int socketd=*sock;
if (socketd){
#if WIN32|WINNT
closesocket(socketd);
#else
close(socketd);
#endif
if (sock) {
SOCK_FCLOSE(*sock);
#if HAVE_SHUTDOWN
shutdown(socketd, 0);
shutdown(*sock, 0);
#endif
efree(sock);
}
@ -495,12 +502,16 @@ static void _php3_unlink_uploaded_file(char *file)
}
static void php3i_destructor_fclose(FILE *fp) {
(void)fclose(fp);
}
int php3_minit_file(INIT_FUNC_ARGS)
{
le_fp = register_list_destructors(fclose,NULL);
le_pp = register_list_destructors(__pclose,NULL);
wsa_fp = register_list_destructors(_php3_closesocket,NULL);
le_uploads = register_list_destructors(_php3_unlink_uploaded_file,NULL);
le_fp = register_list_destructors(php3i_destructor_fclose, NULL);
le_pp = register_list_destructors(__pclose, NULL);
wsa_fp = register_list_destructors(_php3_closesocket, NULL);
le_uploads = register_list_destructors(_php3_unlink_uploaded_file, NULL);
return SUCCESS;
}
@ -720,7 +731,7 @@ PHP_FUNCTION(feof)
/* we're at the eof if the file doesn't exist */
RETURN_TRUE;
}
if ((issock?(_php3_sock_eof(socketd)):feof(fp))) {
if (FP_FEOF(socketd, fp, issock)) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@ -729,14 +740,43 @@ PHP_FUNCTION(feof)
/* }}} */
PHPAPI int _php3_set_sock_blocking(int socketd, int block)
{
int ret = SUCCESS;
int flags;
int myflag = 0;
#if WIN32|WINNT
/* with ioctlsocket, a non-zero sets nonblocking, a zero sets blocking */
flags = block;
if (ioctlsocket(socketd,FIONBIO,&flags)==SOCKET_ERROR){
php3_error(E_WARNING,"%s",WSAGetLastError());
ret = FALSE;
}
#else
flags = fcntl(socketd, F_GETFL);
#ifdef O_NONBLOCK
myflag = O_NONBLOCK; /* POSIX version */
#elif defined(O_NDELAY)
myflag = O_NDELAY; /* old non-POSIX version */
#endif
if (block) {
flags |= myflag;
} else {
flags &= ~myflag;
}
fcntl(socketd, F_SETFL, flags);
#endif
return ret;
}
/* {{{ proto int set_socket_blocking(int socket descriptor, int mode)
Set blocking/non-blocking mode on a socket */
PHP_FUNCTION(set_socket_blocking)
{
pval *arg1, *arg2;
int id, type, block;
int flags;
int socketd=0, *sock;
int socketd = 0, *sock;
if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
@ -747,51 +787,20 @@ PHP_FUNCTION(set_socket_blocking)
block = arg2->value.lval;
sock = php3_list_find(id,&type);
if (type!=wsa_fp) {
if (type != wsa_fp) {
php3_error(E_WARNING,"%d is not a socket id",id);
RETURN_FALSE;
}
socketd=*sock;
#if WIN32|WINNT
/* with ioctlsocket, a non-zero sets nonblocking, a zero sets blocking */
flags=block;
if (ioctlsocket(socketd,FIONBIO,&flags)==SOCKET_ERROR){
php3_error(E_WARNING,"%s",WSAGetLastError());
socketd = *sock;
if(_php3_set_sock_blocking(socketd, block) == FAILURE)
RETURN_FALSE;
} else {
RETURN_TRUE;
}
#else
flags = fcntl(socketd, F_GETFL);
# ifdef O_NONBLOCK
/* POSIX version */
if (block) {
if ((flags & O_NONBLOCK)) {
flags ^= O_NONBLOCK;
}
} else {
if (!(flags & O_NONBLOCK)) {
flags |= O_NONBLOCK;
}
}
# else
# ifdef O_NDELAY
/* old non-POSIX version */
if (block) {
flags |= O_NDELAY;
} else {
flags ^= O_NDELAY;
}
# endif
# endif
fcntl(socketd,F_SETFL,flags);
/* FIXME: Shouldnt we return true on this function? */
#endif
_php3_sock_set_blocking(socketd, block == 0 ? 0 : 1);
RETURN_TRUE;
}
/* }}} */
#if (0 && HAVE_SYS_TIME_H && HAVE_SETSOCKOPT && defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO))
#if (0 && defined(HAVE_SYS_TIME_H) && HAVE_SETSOCKOPT && defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO))
/* this doesn't work, as it appears those properties are read-only :( */
PHP_FUNCTION(set_socket_timeout)
{
@ -852,7 +861,7 @@ PHP_FUNCTION(fgets)
buf = emalloc(sizeof(char) * (len + 1));
/* needed because recv doesnt put a null at the end*/
memset(buf,0,len+1);
if (!(issock?SOCK_FGETS(buf,len,socketd):fgets(buf,len,fp) != NULL)) {
if (FP_FGETS(buf, len, socketd, fp, issock) == NULL) {
efree(buf);
RETVAL_FALSE;
} else {
@ -896,7 +905,7 @@ PHP_FUNCTION(fgetc) {
RETURN_FALSE;
}
buf = emalloc(sizeof(char) * 2);
if (!(issock?(SOCK_FGETC(buf,socketd)):(*buf=fgetc(fp)))) {
if (!(*buf = FP_FGETC(socketd, fp, issock))) {
efree(buf);
RETVAL_FALSE;
} else {
@ -905,7 +914,6 @@ PHP_FUNCTION(fgetc) {
return_value->value.str.len = 1;
return_value->type = IS_STRING;
}
return;
}
/* }}} */
@ -917,8 +925,8 @@ PHP_FUNCTION(fgetss)
{
pval *fd, *bytes;
FILE *fp;
int id, len, br, type;
char *buf, *p, *rbuf, *rp, c, lc;
int id, len, type;
char *buf;
int issock=0;
int *sock,socketd=0;
@ -933,9 +941,9 @@ PHP_FUNCTION(fgetss)
len = bytes->value.lval;
fp = php3_list_find(id,&type);
if (type==wsa_fp){
issock=1;
sock = php3_list_find(id,&type);
if (type == wsa_fp){
issock = 1;
sock = php3_list_find(id, &type);
socketd=*sock;
}
if ((!fp || (type!=le_fp && type!=le_pp)) && (!socketd || type!=wsa_fp)) {
@ -945,95 +953,20 @@ PHP_FUNCTION(fgetss)
buf = emalloc(sizeof(char) * (len + 1));
/*needed because recv doesnt set null char at end*/
memset(buf,0,len+1);
if (!(issock?SOCK_FGETS(buf,len,socketd):fgets(buf, len, fp) != NULL)) {
memset(buf, 0, len + 1);
if (FP_FGETS(buf, len, socketd, fp, issock) == NULL) {
efree(buf);
RETURN_FALSE;
}
rbuf = estrdup(buf);
c = *buf;
lc = '\0';
p = buf;
rp = rbuf;
br = 0;
while (c) {
switch (c) {
case '<':
if (fgetss_state == 0) {
lc = '<';
fgetss_state = 1;
}
break;
case '(':
if (fgetss_state == 2) {
if (lc != '\"') {
lc = '(';
br++;
}
} else if (fgetss_state == 0) {
*(rp++) = c;
}
break;
case ')':
if (fgetss_state == 2) {
if (lc != '\"') {
lc = ')';
br--;
}
} else if (fgetss_state == 0) {
*(rp++) = c;
}
break;
case '>':
if (fgetss_state == 1) {
lc = '>';
fgetss_state = 0;
} else if (fgetss_state == 2) {
if (!br && lc != '\"') {
fgetss_state = 0;
}
}
break;
case '\"':
if (fgetss_state == 2) {
if (lc == '\"') {
lc = '\0';
} else if (lc != '\\') {
lc = '\"';
}
} else if (fgetss_state == 0) {
*(rp++) = c;
}
break;
case '?':
if (fgetss_state==1) {
br=0;
fgetss_state=2;
break;
}
/* fall-through */
default:
if (fgetss_state == 0) {
*(rp++) = c;
}
}
c = *(++p);
}
*rp = '\0';
efree(buf);
RETVAL_STRING(rbuf,1);
efree(rbuf);
_php3_strip_tags(buf, fgetss_state);
RETURN_STRING(buf, 0);
}
/* }}} */
/* {{{ proto int fputs(int fp, string str [, int length])
An alias for fwrite */
/* }}} */
/* {{{ proto int fwrite(int fp, string str [, int length])
Binary-safe file write */
@ -1097,6 +1030,59 @@ PHP_FUNCTION(fwrite)
/* }}} */
/* {{{ proto int set_file_buffer(int fp, int buffer)
Set file write buffer */
/*
wrapper for setvbuf()
*/
void php3_set_file_buffer(INTERNAL_FUNCTION_PARAMETERS)
{
pval *arg1, *arg2;
FILE *fp;
int ret,id,type,buff;
int issock=0;
int *sock, socketd=0;
PLS_FETCH();
switch (ARG_COUNT(ht)) {
case 2:
if (getParameters(ht, 2, &arg1, &arg2)==FAILURE) {
RETURN_FALSE;
}
convert_to_long(arg1);
convert_to_long(arg2);
break;
default:
WRONG_PARAM_COUNT;
/* NOTREACHED */
break;
}
id = arg1->value.lval;
buff = arg2->value.lval;
fp = php3_list_find(id,&type);
if (type == wsa_fp){
issock = 1;
sock = php3_list_find(id,&type);
socketd = *sock;
}
if ((!fp || (type != le_fp && type != le_pp)) &&
(!socketd || type != wsa_fp)) {
php3_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
/* if buff is 0 then set to non-buffered */
if (buff == 0){
ret = setvbuf(fp, NULL, _IONBF, 0);
} else {
ret = setvbuf(fp, NULL, _IOFBF, buff);
}
RETURN_LONG(ret);
}
/* }}} */
/* {{{ proto int rewind(int fp)
Rewind the position of a file pointer */
PHP_FUNCTION(rewind)
@ -1277,17 +1263,13 @@ PHP_FUNCTION(readfile)
}
RETURN_FALSE;
}
size= 0;
while(issock?(b=SOCK_FGETS(buf,sizeof(buf),socketd)):(b = fread(buf, 1, sizeof(buf), fp)) > 0) {
PHPWRITE(buf,b);
size += b ;
size = 0;
while ((b = FP_FREAD(buf, sizeof(buf), socketd, fp, issock)) > 0) {
PHPWRITE(buf, b);
size += b;
}
if (issock) {
#if WIN32|WINNT
closesocket(socketd);
#else
close(socketd);
#endif
SOCK_FCLOSE(socketd);
} else {
fclose(fp);
}
@ -1298,7 +1280,7 @@ PHP_FUNCTION(readfile)
/* {{{ proto int umask([int mask])
Return or change the umask */
PHP_FUNCTION(fileumask)
PHP_FUNCTION(umask)
{
pval *arg1;
int oldumask;
@ -1352,22 +1334,11 @@ PHP_FUNCTION(fpassthru)
}
size = 0;
if (php3_header()) { /* force headers if not already sent */
while(issock?(b=SOCK_FGETS(buf,sizeof(buf),socketd)):(b = fread(buf, 1, sizeof(buf), fp)) > 0) {
while ((b = FP_FREAD(buf, sizeof(buf), socketd, fp, issock)) > 0) {
PHPWRITE(buf,b);
size += b ;
}
}
/*
if (issock) {
#if WIN32|WINNT
closesocket(socketd);
#else
close(socketd);
#endif
} else {
fclose(fp);
}
*/
php3_list_delete(id);
RETURN_LONG(size);
}
@ -1411,7 +1382,7 @@ PHP_FUNCTION(rename)
/* {{{ proto int copy(string source_file, string destination_file)
Copy a file */
PHP_FUNCTION(file_copy)
PHP_FUNCTION(copy)
{
pval *source, *target;
char buffer[8192];
@ -1500,7 +1471,7 @@ PHP_FUNCTION(fread)
return_value->value.str.len = fread(return_value->value.str.val, 1, len, fp);
return_value->value.str.val[return_value->value.str.len] = 0;
} else {
return_value->value.str.len = _php3_sock_fread(return_value->value.str.val, len, socketd);
return_value->value.str.len = SOCK_FREAD(return_value->value.str.val, len, socketd);
}
if (PG(magic_quotes_runtime)) {
return_value->value.str.val = _php3_addslashes(return_value->value.str.val,return_value->value.str.len,&return_value->value.str.len,1);
@ -1520,19 +1491,42 @@ PHPAPI int php3i_get_le_fp(void)
get line from file pointer and parse for CSV fields */
PHP_FUNCTION(fgetcsv) {
char *temp, *tptr, *bptr;
char delimiter = ','; /* allow this to be set as parameter if required in future version? */
char delimiter = ','; /* allow this to be set as parameter */
/* first section exactly as php3_fgetss */
pval *fd, *bytes;
pval *fd, *bytes, *p_delim;
FILE *fp;
int id, len, type;
char *buf;
int issock=0;
int *sock,socketd=0;
PLS_FETCH();
if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &fd, &bytes) == FAILURE) {
WRONG_PARAM_COUNT;
switch(ARG_COUNT(ht)) {
case 2:
if (getParameters(ht, 2, &fd, &bytes) == FAILURE) {
WRONG_PARAM_COUNT;
}
break;
case 3:
if (getParameters(ht, 3, &fd, &bytes, &p_delim) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(p_delim);
/* Make sure that there is at least one character in string */
if (p_delim->value.str.len < 1) {
WRONG_PARAM_COUNT;
}
/* use first character from string */
delimiter = p_delim->value.str.val[0];
break;
default:
WRONG_PARAM_COUNT;
/* NOTREACHED */
break;
}
convert_to_long(fd);
@ -1541,21 +1535,22 @@ PHP_FUNCTION(fgetcsv) {
id = fd->value.lval;
len = bytes->value.lval;
fp = php3_list_find(id,&type);
if (type==wsa_fp){
issock=1;
fp = php3_list_find(id, &type);
if (type == wsa_fp){
issock = 1;
sock = php3_list_find(id,&type);
socketd=*sock;
socketd = *sock;
}
if ((!fp || (type!=le_fp && type!=le_pp)) && (!socketd || type!=wsa_fp)) {
if ((!fp || (type != le_fp && type != le_pp)) &&
(!socketd || type != wsa_fp)) {
php3_error(E_WARNING, "Unable to find file identifier %d", id);
RETURN_FALSE;
}
buf = emalloc(sizeof(char) * (len + 1));
/*needed because recv doesnt set null char at end*/
memset(buf,0,len+1);
if (!(issock?SOCK_FGETS(buf,len,socketd):fgets(buf, len, fp) != NULL)) {
memset(buf, 0, len + 1);
if (FP_FGETS(buf, len, socketd, fp, issock) == NULL) {
efree(buf);
RETURN_FALSE;
}
@ -1575,7 +1570,7 @@ PHP_FUNCTION(fgetcsv) {
/* reserve workspace for building each individual field */
temp = emalloc(sizeof(char) * len); /* unlikely but possible! */
tptr=temp;
tptr = temp;
/* Initialize return array */
if (array_init(return_value) == FAILURE) {
@ -1589,7 +1584,7 @@ PHP_FUNCTION(fgetcsv) {
do {
/* 1. Strip any leading space */
while isspace(*bptr) bptr++;
while(isspace(*bptr)) bptr++;
/* 2. Read field, leaving bptr pointing at start of next field */
if (*bptr == '"') {
/* 2A. handle quote delimited field */
@ -1629,6 +1624,7 @@ PHP_FUNCTION(fgetcsv) {
efree(temp);
efree(buf);
}
/* }}} */
/*

View File

@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP HTML Embedded Scripting Language Version 3.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
| Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+----------------------------------------------------------------------+
| This program is free software; you can redistribute it and/or modify |
| it under the terms of one of the following licenses: |
@ -29,6 +29,8 @@
/* $Id$ */
/* Synced with php3 revision 1.30 1999-06-16 [ssb] */
#ifndef _FILE_H
#define _FILE_H
@ -55,14 +57,17 @@ PHP_FUNCTION(mkdir);
PHP_FUNCTION(rmdir);
PHP_FUNCTION(fpassthru);
PHP_FUNCTION(readfile);
PHP_FUNCTION(fileumask);
PHP_FUNCTION(umask);
PHP_FUNCTION(rename);
PHP_FUNCTION(file_copy);
PHP_FUNCTION(copy);
PHP_FUNCTION(file);
PHP_FUNCTION(set_socket_blocking);
PHP_FUNCTION(set_socket_timeout);
PHP_FUNCTION(set_file_buffer);
PHP_FUNCTION(get_meta_tags);
PHP_FUNCTION(flock);
PHPAPI int _php3_set_sock_blocking(int socketd, int block);
#define phpext_file_ptr php3_file_module_ptr
#endif /* _FILE_H */

View File

@ -417,12 +417,12 @@ static void _php3_stat(const char *filename, int type, pval *return_value)
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);
#if HAVE_ST_BLKSIZE
#ifdef HAVE_ST_BLKSIZE
add_next_index_long(return_value, stat_sb->st_blksize);
#else
add_next_index_long(return_value, -1);
#endif
#if HAVE_ST_BLOCKS
#ifdef HAVE_ST_BLOCKS
add_next_index_long(return_value, stat_sb->st_blocks);
#else
add_next_index_long(return_value, -1);

View File

@ -44,7 +44,7 @@
#include <io.h>
#endif
#if !HAVE_FLOCK
#ifndef HAVE_FLOCK
int flock(int fd, int operation)
#if HAVE_STRUCT_FLOCK
{
@ -161,7 +161,7 @@ int flock(int fd, int operation)
return 0;
}
#endif
#endif /* !HAVE_FLOCK */
#endif /* !defined(HAVE_FLOCK) */
#if !(HAVE_INET_ATON)

View File

@ -1,7 +1,7 @@
#ifndef _FLOCK_COMPAT_H
#define _FLOCK_COMPAT_H
#if !HAVE_FLOCK
#ifndef HAVE_FLOCK
# define LOCK_SH 1
# define LOCK_EX 2
# define LOCK_NB 4

View File

@ -30,13 +30,23 @@
/* $Id$ */
#include "php.h"
#include "php_globals.h"
#include <stdlib.h>
#if HAVE_UNISTD_H
#include <stddef.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
#include <sys/types.h>
#if HAVE_SYS_SOCKET_H
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef WIN32
@ -62,7 +72,7 @@
#include "url.h"
#include "fsock.h"
#ifndef THREAD_SAFE
#ifndef ZTS
extern int le_fp;
#endif
@ -74,40 +84,53 @@ extern int le_fp;
#include "build-defs.h"
#endif
#ifndef ZTS
static HashTable ht_keys;
static HashTable ht_socks;
#endif
static unsigned char third_and_fourth_args_force_ref[] = { 4, BYREF_NONE, BYREF_NONE, BYREF_FORCE, BYREF_FORCE };
function_entry fsock_functions[] = {
PHP_FE(fsockopen, third_and_fourth_args_force_ref)
PHP_FE(pfsockopen, third_and_fourth_args_force_ref)
{NULL, NULL, NULL}
PHP_FE(fsockopen, third_and_fourth_args_force_ref)
PHP_FE(pfsockopen, third_and_fourth_args_force_ref)
{NULL, NULL, NULL}
};
struct php3i_sockbuf {
int socket;
char *readbuf;
unsigned char *readbuf;
size_t readbuflen;
size_t readpos;
size_t writepos;
struct php3i_sockbuf *next;
struct php3i_sockbuf *prev;
char eof;
char persistent;
char is_blocked;
};
static struct php3i_sockbuf *phpsockbuf;
typedef struct php3i_sockbuf php3i_sockbuf;
static int php3_minit_fsock(INIT_FUNC_ARGS);
static int php3_mshutdown_fsock(SHUTDOWN_FUNC_ARGS);
static int php3_rshutdown_fsock(SHUTDOWN_FUNC_ARGS);
php3_module_entry fsock_module_entry = {
"Socket functions", fsock_functions, php3_minit_fsock, php3_mshutdown_fsock, NULL, php3_rshutdown_fsock, NULL, STANDARD_MODULE_PROPERTIES
"Socket functions",
fsock_functions,
php3_minit_fsock,
php3_mshutdown_fsock,
NULL,
php3_rshutdown_fsock,
NULL,
STANDARD_MODULE_PROPERTIES
};
#ifndef THREAD_SAFE
#ifndef ZTS
static HashTable ht_keys;
static HashTable ht_socks;
#endif
/* {{{ lookup_hostname */
/*
@ -117,7 +140,7 @@ int lookup_hostname(const char *addr, struct in_addr *in)
{
struct hostent *host_info;
if(!inet_aton(addr, in)) {
if (!inet_aton(addr, in)) {
host_info = gethostbyname(addr);
if (host_info == 0) {
/* Error: unknown host */
@ -141,6 +164,76 @@ int _php3_is_persistent_sock(int sock)
return 0;
}
/* }}} */
/* {{{ connect_nonb */
PHPAPI int connect_nonb(int sockfd,
struct sockaddr *addr,
int addrlen,
struct timeval *timeout)
{
/* probably won't work on Win32, someone else might try it (read: fix it ;) */
#if !defined(WIN32) && (defined(O_NONBLOCK) || defined(O_NDELAY))
#ifndef O_NONBLOCK
#define O_NONBLOCK O_NDELAY
#endif
int flags;
int n;
int error = 0;
int len;
int ret = 0;
fd_set rset;
fd_set wset;
flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
if ((n = connect(sockfd, addr, addrlen)) < 0) {
if (errno != EINPROGRESS) {
return -1;
}
}
if (n == 0) {
goto ok;
}
FD_ZERO(&rset);
FD_SET(sockfd, &rset);
wset = rset;
if ((n = select(sockfd + 1, &rset, &wset, NULL, timeout)) == 0) {
error = ETIMEDOUT;
}
if(FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {
len = sizeof(error);
/*
BSD-derived systems set errno correctly
Solaris returns -1 from getsockopt in case of error
*/
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
ret = -1;
}
} else {
/* whoops: sockfd has disappeared */
ret = -1;
}
ok:
fcntl(sockfd, F_SETFL, flags);
if(error) {
errno = error;
ret = -1;
}
return ret;
#else /* !defined(WIN32) && ... */
return connect(sockfd, addr, addrlen);
#endif
}
/* }}} */
/* {{{ _php3_fsockopen() */
/*
@ -149,19 +242,25 @@ int _php3_is_persistent_sock(int sock)
to this variable.
*/
static void _php3_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
pval *args[4];
pval *args[5];
int *sock=emalloc(sizeof(int));
int *sockp;
int id, arg_count=ARG_COUNT(ht);
int socketd = -1;
struct timeval timeout = { 60, 0 };
unsigned short portno;
char *key = NULL;
PLS_FETCH();
if (arg_count > 4 || arg_count < 2 || getParametersArray(ht,arg_count,args)==FAILURE) {
if (arg_count > 5 || arg_count < 2 || getParametersArray(ht,arg_count,args)==FAILURE) {
FREE_SOCK;
WRONG_PARAM_COUNT;
}
switch(arg_count) {
case 5:
convert_to_long(args[4]);
timeout.tv_sec = args[4]->value.lval;
/* fall-through */
case 4:
if(!ParameterPassedByReference(ht,4)) {
php3_error(E_WARNING,"error string argument to fsockopen not passed by reference");
@ -212,7 +311,7 @@ static void _php3_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
server.sin_port = htons(portno);
if (connect(socketd, (struct sockaddr *)&server, sizeof(server)) == SOCK_CONN_ERR) {
if (connect_nonb(socketd, (struct sockaddr *)&server, sizeof(server), &timeout) == SOCK_CONN_ERR) {
FREE_SOCK;
if(arg_count>2) args[2]->value.lval = errno;
if(arg_count>3) {
@ -235,7 +334,7 @@ static void _php3_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
unix_addr.sun_family = AF_UNIX;
strcpy(unix_addr.sun_path, args[0]->value.str.val);
if (connect(socketd, (struct sockaddr *) &unix_addr, sizeof(unix_addr)) == SOCK_CONN_ERR) {
if (connect_nonb(socketd, (struct sockaddr *) &unix_addr, sizeof(unix_addr), &timeout) == SOCK_CONN_ERR) {
FREE_SOCK;
if(arg_count>2) args[2]->value.lval = errno;
if(arg_count>3) {
@ -320,168 +419,337 @@ int _php3_sock_eof(int socket)
return ret;
}
/* {{{ _php3_sock_fgets() */
int _php3_sock_fgets(char *buf, int maxlen, int socket)
#define SOCK_DESTROY(sock) \
if(sock->readbuf) pefree(sock->readbuf, sock->persistent); \
if(sock->prev) sock->prev->next = sock->next; \
if(sock->next) sock->next->prev = sock->prev; \
if(sock == phpsockbuf) \
phpsockbuf = sock->next; \
pefree(sock, sock->persistent)
static void php_cleanup_sockbuf(int persistent)
{
struct php3i_sockbuf *sockbuf;
int bytesread, toread, len, buflen, count = 0;
char *nl;
sockbuf = _php3_sock_findsock(socket);
if (sockbuf) {
toread = sockbuf->writepos - sockbuf->readpos;
if (toread > maxlen) {
toread = maxlen;
}
if ((nl = memchr(sockbuf->readbuf + sockbuf->readpos, '\n', toread)) != NULL) {
toread = (nl - (sockbuf->readbuf + sockbuf->readpos)) + 1;
}
memcpy(buf, sockbuf->readbuf + sockbuf->readpos, toread);
sockbuf->readpos += toread;
count += toread;
buf += toread;
if (sockbuf->readpos >= sockbuf->writepos) {
sockbuf->readpos = sockbuf->writepos = 0;
}
if (nl != NULL) {
/* if a newline was found, skip the recv() loop */
goto sock_fgets_exit;
php3i_sockbuf *now, *next;
for(now = phpsockbuf; now; now = next) {
next = now->next;
if(now->persistent == persistent) {
SOCK_DESTROY(now);
}
}
}
nl = NULL;
buflen = 0;
while (count < maxlen && nl == NULL) {
toread = maxlen - count;
bytesread = recv(socket, buf, toread, 0);
if (bytesread <= 0) {
#define TOREAD(sock) ((sock)->writepos - (sock)->readpos)
#define READPTR(sock) ((sock)->readbuf + (sock)->readpos)
#define WRITEPTR(sock) ((sock)->readbuf + (sock)->writepos)
#define SOCK_FIND(sock,socket) \
php3i_sockbuf *sock; \
sock = _php3_sock_find(socket); \
if(!sock) sock = _php3_sock_create(socket)
static php3i_sockbuf *_php3_sock_find(int socket)
{
php3i_sockbuf *buf = NULL, *tmp;
for (tmp = phpsockbuf; tmp; tmp = tmp->next) {
if (tmp->socket == socket) {
buf = tmp;
break;
}
if ((nl = memchr(buf, '\n', bytesread)) != NULL) {
len = (nl - buf) + 1;
count += len;
buf += len;
if (len < bytesread) {
buflen = bytesread - len;
}
return buf;
}
static php3i_sockbuf *_php3_sock_create(int socket)
{
php3i_sockbuf *sock;
int persistent = _php3_is_persistent_sock(socket);
sock = pecalloc(sizeof(*sock), 1, persistent);
sock->socket = socket;
if ((sock->next = phpsockbuf)) {
phpsockbuf->prev = sock;
}
sock->persistent = persistent;
sock->is_blocked = 1;
phpsockbuf = sock;
return sock;
}
int _php3_sock_destroy(int socket)
{
int ret = 0;
php3i_sockbuf *sock;
sock = _php3_sock_find(socket);
if (sock) {
ret = 1;
SOCK_DESTROY(sock);
}
return ret;
}
int _php3_sock_close(int socket)
{
int ret = 0;
php3i_sockbuf *sock;
sock = _php3_sock_find(socket);
if (sock) {
if (!sock->persistent) {
#if HAVE_SHUTDOWN
shutdown(sock->socket, 0);
#endif
#if WIN32||WINNT
closesocket(sock->socket);
#else
close(sock->socket);
#endif
SOCK_DESTROY(sock);
}
}
return ret;
}
#define CHUNK_SIZE 2048
#define MAX_CHUNKS_PER_READ 10
static size_t _php3_sock_read_limited(php3i_sockbuf *sock, size_t max)
{
char buf[CHUNK_SIZE];
int nr_bytes;
size_t nr_read = 0;
if (sock->eof || max > CHUNK_SIZE) {
return nr_read;
}
nr_bytes = recv(sock->socket, buf, max, 0);
if (nr_bytes > 0) {
if (sock->writepos + nr_bytes > sock->readbuflen) {
sock->readbuflen += CHUNK_SIZE;
sock->readbuf = perealloc(sock->readbuf, sock->readbuflen,
sock->persistent);
}
memcpy(WRITEPTR(sock), buf, nr_bytes);
sock->writepos += nr_bytes;
nr_read = nr_bytes;
} else if (nr_bytes == 0 || (nr_bytes < 0 && errno != EWOULDBLOCK)) {
sock->eof = 1;
}
return nr_read;
}
#if !defined(MSG_DONTWAIT) && defined(__GLIBC__) && __GLIBC__ == 2
# define MSG_DONTWAIT 0x40
#endif
/* only for blocking sockets */
static size_t _php3_sock_queued_data(php3i_sockbuf *sock)
{
int nr_bytes;
char buf[CHUNK_SIZE];
int flags = MSG_PEEK;
#ifdef MSG_DONTWAIT
flags |= MSG_DONTWAIT;
#else
_php3_set_sock_blocking(sock->socket, 1);
#endif
nr_bytes = recv(sock->socket, buf, CHUNK_SIZE, flags);
#ifndef MSG_DONTWAIT
_php3_set_sock_blocking(sock->socket, 0);
#endif
return (nr_bytes < 0 ? 0 : nr_bytes);
}
static size_t _php3_sock_read(php3i_sockbuf *sock)
{
size_t nr_bytes;
size_t nr_read = 0;
int i;
for (i = 0; !sock->eof && i < MAX_CHUNKS_PER_READ; i++) {
nr_bytes = _php3_sock_read_limited(sock, CHUNK_SIZE);
if(nr_bytes == 0) break;
nr_read += nr_bytes;
}
return nr_read;
}
int _php3_sock_set_blocking(int socket, int mode)
{
int old;
SOCK_FIND(sock, socket);
old = sock->is_blocked;
sock->is_blocked = mode;
return old;
}
#define SOCK_FIND_AND_READ_MAX(max) \
SOCK_FIND(sock, socket); \
if(sock->is_blocked) _php3_sock_read_limited(sock, max); else _php3_sock_read(sock)
/* {{{ _php3_sock_fgets() */
/*
* FIXME: fgets depends on '\n' as line delimiters
*/
char *_php3_sock_fgets(char *buf, size_t maxlen, int socket)
{
char *p = NULL;
char *ret = NULL;
size_t amount = 0;
size_t nr_read;
size_t nr_toread;
SOCK_FIND(sock, socket);
if (maxlen < 0) {
return ret;
}
if (sock->is_blocked) {
nr_toread = _php3_sock_queued_data(sock);
if (!nr_toread) {
nr_toread = 1;
}
for (nr_read = 1; !sock->eof && nr_read < maxlen; ) {
nr_read += _php3_sock_read_limited(sock, nr_toread);
if ((p = memchr(READPTR(sock), '\n', TOREAD(sock))) != NULL) {
break;
}
} else {
count += bytesread;
buf += bytesread;
nr_toread = 1;
}
} else {
_php3_sock_read(sock);
p = memchr(READPTR(sock), '\n', MIN(TOREAD(sock), maxlen - 1));
}
if (buflen > 0) { /* there was data after the "\n" ... */
if (sockbuf == NULL) {
sockbuf = emalloc(sizeof(struct php3i_sockbuf));
sockbuf->socket = socket;
sockbuf->readbuf = emalloc(maxlen);
sockbuf->readbuflen = maxlen;
sockbuf->readpos = sockbuf->writepos = 0;
sockbuf->next = phpsockbuf;
phpsockbuf = sockbuf;
} else {
uint needlen = sockbuf->writepos + buflen;
if (needlen > sockbuf->readbuflen) {
sockbuf->readbuflen += maxlen;
sockbuf->readbuf = erealloc(sockbuf->readbuf, sockbuf->readbuflen);
}
}
memcpy(sockbuf->readbuf + sockbuf->writepos, buf, buflen);
sockbuf->writepos += buflen;
if (p) {
amount = (ptrdiff_t) p - (ptrdiff_t) READPTR(sock) + 1;
} else {
amount = MIN(TOREAD(sock), maxlen - 1);
}
sock_fgets_exit:
*buf = '\0';
return count;
if (amount > 0) {
memcpy(buf, READPTR(sock), amount);
sock->readpos += amount;
}
buf[amount] = '\0';
/* signal error only, if we don't return data from this call and
if there is no data to read and if the eof flag is set */
if (amount || TOREAD(sock) || !sock->eof) {
ret = buf;
}
return ret;
}
/* }}} */
/*
* FIXME: fgetc returns EOF, if no data is available on a nonblocking socket.
* I don't have any documentation on the semantics of fgetc in this case.
*
* ss@2ns.de 19990528
*/
int _php3_sock_fgetc(int socket)
{
int ret = EOF;
SOCK_FIND_AND_READ_MAX(1);
if (TOREAD(sock) > 0) {
ret = *READPTR(sock);
sock->readpos++;
}
return ret;
}
int _php3_sock_feof(int socket)
{
int ret = 0;
SOCK_FIND_AND_READ_MAX(1);
if (!TOREAD(sock) && sock->eof) {
ret = 1;
}
return ret;
}
/* {{{ _php3_sock_fread() */
int _php3_sock_fread(char *buf, int maxlen, int socket)
size_t _php3_sock_fread(char *ptr, size_t size, int socket)
{
struct php3i_sockbuf *sockbuf = phpsockbuf;
int bytesread, toread, count = 0;
size_t ret = 0;
SOCK_FIND_AND_READ_MAX(size);
while (sockbuf) {
if (sockbuf->socket == socket) {
toread = sockbuf->writepos - sockbuf->readpos;
if (toread > maxlen) {
toread = maxlen;
}
memcpy(buf, sockbuf->readbuf + sockbuf->readpos, toread);
sockbuf->readpos += toread;
count += toread;
buf += toread;
break;
}
sockbuf = sockbuf->next;
if (size < 0) {
return ret;
}
while (count < maxlen) {
toread = maxlen - count;
bytesread = recv(socket, buf, toread, 0);
if (bytesread <= 0) {
break;
}
count += bytesread;
buf += bytesread;
ret = MIN(TOREAD(sock), size);
if (ret) {
memcpy(ptr, READPTR(sock), ret);
sock->readpos += ret;
}
*buf = '\0';
return count;
return ret;
}
/* }}} */
/* {{{ module start/shutdown functions */
/* {{{ _php3_sock_destroy */
#ifndef THREAD_SAFE
static void _php3_sock_destroy(void *data)
#ifndef ZTS
static void _php3_msock_destroy(int *data)
{
int *sock = (int *) data;
close(*sock);
close(*data);
}
#endif
/* }}} */
/* {{{ php3_minit_fsock */
static int php3_minit_fsock(INIT_FUNC_ARGS)
int php3_minit_fsock(INIT_FUNC_ARGS)
{
#ifndef THREAD_SAFE
#ifndef ZTS
_php3_hash_init(&ht_keys, 0, NULL, NULL, 1);
_php3_hash_init(&ht_socks, 0, NULL, _php3_sock_destroy, 1);
_php3_hash_init(&ht_socks, 0, NULL, (void (*)(void *))_php3_msock_destroy, 1);
#endif
return SUCCESS;
}
/* }}} */
/* {{{ php3_mshutdown_fsock */
static int php3_mshutdown_fsock(SHUTDOWN_FUNC_ARGS)
int php3_mshutdown_fsock(SHUTDOWN_FUNC_ARGS)
{
#ifndef THREAD_SAFE
#ifndef ZTS
_php3_hash_destroy(&ht_socks);
_php3_hash_destroy(&ht_keys);
#endif
php_cleanup_sockbuf(1);
return SUCCESS;
}
/* }}} */
/* {{{ php3_rshutdown_fsock() */
static int php3_rshutdown_fsock(SHUTDOWN_FUNC_ARGS)
int php3_rshutdown_fsock(SHUTDOWN_FUNC_ARGS)
{
struct php3i_sockbuf *sockbuf = phpsockbuf, *this;
while (sockbuf) {
this = sockbuf;
sockbuf = this->next;
efree(this->readbuf);
efree(this);
}
phpsockbuf = NULL;
php_cleanup_sockbuf(0);
return SUCCESS;
}

View File

@ -33,28 +33,36 @@
#define _FSOCK_H
#if WIN32|WINNT
# ifndef WINNT
# define WINNT 1
# endif
#undef FD_SETSIZE
#include "arpa/inet.h"
# ifndef WINNT
# define WINNT 1
# endif
# undef FD_SETSIZE
# include "arpa/inet.h"
#endif
#if HAVE_NETINET_IN_H
#include <netinet/in.h>
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
extern php3_module_entry fsock_module_entry;
#define fsock_module_ptr &fsock_module_entry
#define phpext_fsock_ptr &fsock_module_entry
PHP_FUNCTION(fsockopen);
PHP_FUNCTION(pfsockopen);
extern int lookup_hostname(const char *addr, struct in_addr *in);
extern int _php3_sock_fgets(char *buf, int maxlen, int socket);
extern int _php3_sock_fread(char *buf, int maxlen, int socket);
extern char *_php3_sock_fgets(char *buf, size_t maxlen, int socket);
extern size_t _php3_sock_fread(char *buf, size_t maxlen, int socket);
extern int _php3_sock_feof(int socket);
extern int _php3_sock_fgetc(int socket);
extern int _php3_is_persistent_sock(int);
int _php3_sock_eof(int socket);
extern int _php3_sock_set_blocking(int socket, int mode);
extern int _php3_sock_destroy(int socket);
extern int _php3_sock_close(int socket);
#define phpext_fsock_ptr fsock_module_ptr
PHPAPI int connect_nonb(int sockfd, struct sockaddr *addr, int addrlen, struct timeval *timeout);
int php3_minit_fsock(INIT_FUNC_ARGS);
int php3_mshutdown_fsock(SHUTDOWN_FUNC_ARGS);
int php3_rshutdown_fsock(SHUTDOWN_FUNC_ARGS);
#endif /* _FSOCK_H */

View File

@ -41,7 +41,7 @@
#include "snprintf.h"
#include <stdio.h>
#if HAVE_GETTIMEOFDAY
#ifdef HAVE_GETTIMEOFDAY
#if MSVC5
#include "win32/time.h"
#else
@ -56,7 +56,7 @@
Returns a string containing the current time in seconds and microseconds */
PHP_FUNCTION(microtime)
{
#if HAVE_GETTIMEOFDAY
#ifdef HAVE_GETTIMEOFDAY
struct timeval tp;
long sec = 0L;
double msec = 0.0;
@ -77,7 +77,7 @@ PHP_FUNCTION(microtime)
returns the current time as array */
PHP_FUNCTION(gettimeofday)
{
#if HAVE_GETTIMEOFDAY
#ifdef HAVE_GETTIMEOFDAY
struct timeval tp;
struct timezone tz;

View File

@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP HTML Embedded Scripting Language Version 3.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
| Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+----------------------------------------------------------------------+
| This program is free software; you can redistribute it and/or modify |
| it under the terms of one of the following licenses: |
@ -31,6 +31,8 @@
/* $Id$ */
/* Synced with php3 revision 1.43 1999-06-16 [ssb] */
#ifndef _PHPSTRING_H
#define _PHPSTRING_H
@ -67,26 +69,34 @@ PHP_FUNCTION(ucwords);
PHP_FUNCTION(strtr);
PHP_FUNCTION(strrev);
PHP_FUNCTION(hebrev);
PHP_FUNCTION(hebrev_with_conversion);
PHP_FUNCTION(hebrevc);
PHP_FUNCTION(user_sprintf);
PHP_FUNCTION(user_printf);
PHP_FUNCTION(addslashes);
PHP_FUNCTION(stripslashes);
PHP_FUNCTION(chr);
PHP_FUNCTION(ord);
PHP_FUNCTION(newline_to_br);
PHP_FUNCTION(nl2br);
PHP_FUNCTION(setlocale);
PHP_FUNCTION(stristr);
PHP_FUNCTION(chunk_split);
PHP_FUNCTION(parsestr);
PHP_FUNCTION(bin2hex);
PHP_FUNCTION(similar_text);
extern PHPAPI char *_php3_strtoupper(char *s);
extern PHPAPI char *_php3_strtolower(char *s);
extern char *_StrTr(char *string, char *str_from, char *str_to);
extern PHPAPI char *_php3_strtr(char *string, int len, char *str_from, char *str_to, int trlen);
extern PHPAPI char *_php3_addslashes(char *string, int length, int *new_length, int freeit);
extern PHPAPI void _php3_stripslashes(char *string, int *len);
extern PHPAPI void _php3_dirname(char *str, int len);
extern PHPAPI char *php3i_stristr(unsigned char *s, unsigned char *t);
extern PHPAPI void _php3_trim(pval *str, pval *return_value, int mode);
extern PHPAPI void _php3_strip_tags(char *rbuf, int state);
extern PHPAPI void _php3_char_to_str(char *str, uint len, char from, char *to, int to_len, pval *result);
extern PHPAPI void _php3_implode(pval *delim, pval *arr, pval *return_value);
extern PHPAPI void _php3_explode(pval *delim, pval *str, pval *return_value);
#endif /* _PHPSTRING_H */

View File

@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP HTML Embedded Scripting Language Version 3.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
| Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+----------------------------------------------------------------------+
| This program is free software; you can redistribute it and/or modify |
| it under the terms of one of the following licenses: |
@ -24,21 +24,22 @@
| contact core@php.net. |
+----------------------------------------------------------------------+
| Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
| Stig Sæther Bakken <ssb@guardian.no> |
| Stig Sæther Bakken <ssb@fast.no> |
| Zeev Suraski <bourbon@nevision.net.il> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
/* Synced with php3 revision 1.193 1999-06-16 [ssb] */
#include <stdio.h>
#include "php.h"
#include "reg.h"
#include "post.h"
#include "php3_string.h"
#if HAVE_SETLOCALE
#include <locale.h>
#ifdef HAVE_LOCALE_H
# include <locale.h>
#endif
#include "zend_execute.h"
#include "php_globals.h"
@ -128,7 +129,7 @@ PHP_FUNCTION(strcasecmp)
}
convert_to_string(s1);
convert_to_string(s2);
RETURN_LONG(strcasecmp(s1->value.str.val,s2->value.str.val));
RETURN_LONG(zend_binary_strcasecmp(s1, s2));
}
/* }}} */
@ -162,21 +163,30 @@ PHP_FUNCTION(strcspn)
}
/* }}} */
/* {{{ proto string chop(string str)
Remove trailing whitespace */
PHP_FUNCTION(chop)
PHPAPI void _php3_trim(pval *str, pval * return_value, int mode)
/* mode 1 : trim left
mode 2 : trim right
mode 3 : trim left and right
*/
{
pval *str;
register int i;
if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(str);
int len = str->value.str.len;
int trimmed = 0;
char *c = str->value.str.val;
if (str->type == IS_STRING) {
int len = str->value.str.len;
char *c = str->value.str.val;
if (mode & 1) {
for (i = 0; i < len; i++) {
if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
c[i] == '\t' || c[i] == '\v') {
trimmed++;
} else {
break;
}
}
len -= trimmed;
c += trimmed;
}
if (mode & 2) {
for (i = len - 1; i >= 0; i--) {
if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
c[i] == '\t' || c[i] == '\v') {
@ -185,7 +195,27 @@ PHP_FUNCTION(chop)
break;
}
}
RETVAL_STRINGL(c, len, 1);
}
RETVAL_STRINGL(c, len, 1);
}
/* {{{ proto string rtrim(string str)
An alias for chop */
/* }}} */
/* {{{ proto string chop(string str)
Remove trailing whitespace */
PHP_FUNCTION(chop)
{
pval *str;
if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(str);
if (str->type == IS_STRING) {
_php3_trim(str, return_value, 2);
return;
}
RETURN_FALSE;
@ -197,7 +227,6 @@ PHP_FUNCTION(chop)
PHP_FUNCTION(trim)
{
pval *str;
register int i;
if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
WRONG_PARAM_COUNT;
@ -205,28 +234,7 @@ PHP_FUNCTION(trim)
convert_to_string(str);
if (str->type == IS_STRING) {
int len = str->value.str.len;
int trimmed = 0;
char *c = str->value.str.val;
for (i = 0; i < len; i++) {
if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
c[i] == '\t' || c[i] == '\v') {
trimmed++;
} else {
break;
}
}
len-=trimmed;
c+=trimmed;
for (i = len - 1; i >= 0; i--) {
if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
c[i] == '\t' || c[i] == '\v') {
len--;
} else {
break;
}
}
RETVAL_STRINGL(c, len, 1);
_php3_trim(str, return_value, 3);
return;
}
RETURN_FALSE;
@ -238,39 +246,44 @@ PHP_FUNCTION(trim)
PHP_FUNCTION(ltrim)
{
pval *str;
register int i;
if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(str);
if (str->type == IS_STRING) {
int len = str->value.str.len;
int trimmed = 0;
char *c = str->value.str.val;
for (i = 0; i < len; i++) {
if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
c[i] == '\t' || c[i] == '\v') {
trimmed++;
} else {
break;
}
}
RETVAL_STRINGL(c+trimmed, len-trimmed, 1);
_php3_trim(str, return_value, 1);
return;
}
RETURN_FALSE;
}
/* }}} */
/* {{{ proto array(string separator, string str)
void _php3_explode(pval *delim, pval *str, pval *return_value)
{
char *work_str, *p1, *p2;
int i = 0;
work_str = p1 = estrndup(str->value.str.val,str->value.str.len);
p2 = strstr(p1, delim->value.str.val);
if (p2 == NULL) {
add_index_string(return_value, i++, p1, 1);
} else do {
p2[0] = 0;
add_index_string(return_value, i++, p1, 1);
p1 = p2 + delim->value.str.len;
} while ((p2 = strstr(p1, delim->value.str.val)) && p2 != work_str);
if (p1 != work_str) {
add_index_string(return_value, i++, p1, 1);
}
efree(work_str);
}
/* {{{ proto array explode(string separator, string str)
Split a string on string separator and return array of components */
PHP_FUNCTION(explode)
{
pval *str, *delim;
char *work_str, *p1, *p2;
int i = 0;
if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &delim, &str) == FAILURE) {
WRONG_PARAM_COUNT;
@ -286,28 +299,58 @@ PHP_FUNCTION(explode)
if (array_init(return_value) == FAILURE) {
return;
}
work_str = p1 = estrndup(str->value.str.val,str->value.str.len);
p2 = strstr(p1, delim->value.str.val);
if (p2 == NULL) {
add_index_string(return_value, i++, p1, 1);
} else do {
p2[0] = 0;
add_index_string(return_value, i++, p1, 1);
p1 = p2 + delim->value.str.len;
} while ((p2 = strstr(p1, delim->value.str.val)) && p2 != work_str);
if (p1 != work_str) {
add_index_string(return_value, i++, p1, 1);
}
efree(work_str);
_php3_explode(delim, str, return_value);
}
/* }}} */
/* {{{ proto string join(array src, string glue)
An alias for implode */
/* }}} */
void _php3_implode(pval *delim, pval *arr, pval *return_value)
{
pval *tmp;
int len = 0, count = 0;
/* convert everything to strings, and calculate length */
_php3_hash_internal_pointer_reset(arr->value.ht);
while (_php3_hash_get_current_data(arr->value.ht, (void **) &tmp) == SUCCESS) {
convert_to_string(tmp);
if (tmp->type == IS_STRING && tmp->value.str.val != undefined_variable_string) {
len += tmp->value.str.len;
if (count>0) {
len += delim->value.str.len;
}
count++;
}
_php3_hash_move_forward(arr->value.ht);
}
/* do it */
return_value->value.str.val = (char *) emalloc(len + 1);
return_value->value.str.val[0] = '\0';
return_value->value.str.val[len] = '\0';
_php3_hash_internal_pointer_reset(arr->value.ht);
while (_php3_hash_get_current_data(arr->value.ht, (void **) &tmp) == SUCCESS) {
if (tmp->type == IS_STRING && tmp->value.str.val != undefined_variable_string) {
count--;
strcat(return_value->value.str.val, tmp->value.str.val);
if (count > 0) {
strcat(return_value->value.str.val, delim->value.str.val);
}
}
_php3_hash_move_forward(arr->value.ht);
}
return_value->type = IS_STRING;
return_value->value.str.len = len;
}
/* {{{ proto string implode(array src, string glue)
Join array elements placing glue string between items and return one string */
PHP_FUNCTION(implode)
{
pval *arg1, *arg2, *delim, **tmp, *arr;
int len = 0, count = 0;
pval *arg1, *arg2, *delim, *arr;
if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
@ -325,43 +368,11 @@ PHP_FUNCTION(implode)
get_active_function_name());
return;
}
/* convert everything to strings, and calculate length */
_php3_hash_internal_pointer_reset(arr->value.ht);
while (_php3_hash_get_current_data(arr->value.ht, (void **) &tmp) == SUCCESS) {
convert_to_string(*tmp);
if ((*tmp)->type == IS_STRING) {
len += (*tmp)->value.str.len;
if (count>0) {
len += delim->value.str.len;
}
count++;
}
_php3_hash_move_forward(arr->value.ht);
}
/* do it */
return_value->value.str.val = (char *) emalloc(len + 1);
return_value->value.str.val[0] = '\0';
return_value->value.str.val[len] = '\0';
_php3_hash_internal_pointer_reset(arr->value.ht);
while (_php3_hash_get_current_data(arr->value.ht, (void **) &tmp) == SUCCESS) {
if ((*tmp)->type == IS_STRING) {
count--;
strcat(return_value->value.str.val, (*tmp)->value.str.val);
if (count > 0) {
strcat(return_value->value.str.val, delim->value.str.val);
}
}
_php3_hash_move_forward(arr->value.ht);
}
return_value->type = IS_STRING;
return_value->refcount = 1;
return_value->is_ref = 0;
return_value->value.str.len = len;
_php3_implode(delim, arr, return_value);
}
/* }}} */
#ifndef THREAD_SAFE
char *strtok_string;
#endif
@ -559,7 +570,7 @@ PHP_FUNCTION(dirname)
/* }}} */
/* case-insensitve strstr */
/* case insensitve strstr */
PHPAPI char *php3i_stristr(unsigned char *s, unsigned char *t)
{
int i, j, k, l;
@ -635,7 +646,7 @@ PHP_FUNCTION(strstr)
}
/* }}} */
/* {{{ proto int strpos(string haystack, string needle)
/* {{{ proto int strpos(string haystack, string needle [, int offset])
Find position of first occurrence of a string within another */
PHP_FUNCTION(strpos)
{
@ -742,7 +753,8 @@ PHP_FUNCTION(strrchr)
/* }}} */
static char *
_php3_chunk_split(char *src, int srclen, char *end, int endlen, int chunklen)
_php3_chunk_split(char *src, int srclen, char *end, int endlen,
int chunklen, int *destlen)
{
char *dest;
char *p, *q;
@ -770,6 +782,9 @@ _php3_chunk_split(char *src, int srclen, char *end, int endlen, int chunklen)
}
*q = '\0';
if (destlen) {
*destlen = q - dest;
}
return(dest);
}
@ -784,16 +799,15 @@ PHP_FUNCTION(chunk_split)
char *end = "\r\n";
int endlen = 2;
int chunklen = 76;
int result_len;
argc = ARG_COUNT(ht);
if(!((argc == 1 && getParameters(ht, 1, &p_str) != FAILURE) ||
(argc == 2 && getParameters(ht, 2, &p_str, &p_chunklen) != FAILURE) ||
(argc == 3 && getParameters(ht, 3, &p_str, &p_chunklen,
&p_ending) != FAILURE))) {
if (argc < 1 || argc > 3 ||
getParameters(ht, argc, &p_str, &p_chunklen, &p_ending) == FAILURE) {
WRONG_PARAM_COUNT;
}
switch(argc) {
case 3:
convert_to_string(p_ending);
@ -812,10 +826,10 @@ PHP_FUNCTION(chunk_split)
}
result = _php3_chunk_split(p_str->value.str.val, p_str->value.str.len,
end, endlen, chunklen);
end, endlen, chunklen, &result_len);
if(result) {
RETVAL_STRING(result, 0);
RETVAL_STRINGL(result, result_len, 0);
} else {
RETURN_FALSE;
}
@ -997,20 +1011,42 @@ PHP_FUNCTION(ucwords)
if(*(r+1)){
r++;
*r=toupper((unsigned char)*r);
} else break;
} else {
break;
}
}
RETVAL_STRING(arg->value.str.val,1);
}
/* }}} */
PHPAPI char *_php3_strtr(char *string, int len, char *str_from,
char *str_to, int trlen)
{
int i;
unsigned char xlat[256];
if ((trlen < 1) || (len < 1)) {
return string;
}
for (i = 0; i < 256; xlat[i] = i, i++);
for (i = 0; i < trlen; i++) {
xlat[(unsigned char) str_from[i]] = str_to[i];
}
for (i = 0; i < len; i++) {
string[i] = xlat[(unsigned char) string[i]];
}
return string;
}
/* {{{ proto string strtr(string str, string from, string to)
Translate characters in str using given translation tables */
PHP_FUNCTION(strtr)
{ /* strtr(STRING,FROM,TO) */
pval *str, *from, *to;
unsigned char xlat[256];
unsigned char *str_from, *str_to, *string;
int i, len1, len2;
if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &str, &from, &to) ==
FAILURE) {
@ -1020,28 +1056,12 @@ PHP_FUNCTION(strtr)
convert_to_string(from);
convert_to_string(to);
string = (unsigned char*) str->value.str.val;
str_from = (unsigned char*) from->value.str.val;
str_to = (unsigned char*) to->value.str.val;
len1 = from->value.str.len;
len2 = to->value.str.len;
if (len1 > len2) {
str_from[len2] = '\0';
len1 = len2;
}
for (i = 0; i < 256; xlat[i] = i, i++);
for (i = 0; i < len1; i++) {
xlat[(unsigned char) str_from[i]] = str_to[i];
}
for (i = 0; i < str->value.str.len; i++) {
string[i] = xlat[(unsigned char) string[i]];
}
RETVAL_STRING((char *)string,1);
RETVAL_STRING(_php3_strtr(str->value.str.val,
str->value.str.len,
from->value.str.val,
to->value.str.val,
MIN(from->value.str.len,to->value.str.len)),
1);
}
/* }}} */
@ -1073,6 +1093,82 @@ PHP_FUNCTION(strrev)
}
/* }}} */
static void _php3_similar_str(const char *txt1, int len1, const char *txt2,
int len2, int *pos1, int *pos2, int *max)
{
char *p, *q;
char *end1 = (char *) txt1 + len1;
char *end2 = (char *) txt2 + len2;
int l;
*max = 0;
for (p = (char *) txt1; p < end1; p++) {
for (q = (char *) txt2; q < end2; q++) {
for (l = 0; (p + l < end1) && (q + l < end2) && (p[l] == q[l]);
l++);
if (l > *max) {
*max = l;
*pos1 = p - txt1;
*pos2 = q - txt2;
}
}
}
}
static int _php3_similar_char(const char *txt1, int len1,
const char *txt2, int len2)
{
int sum;
int pos1, pos2, max;
_php3_similar_str(txt1, len1, txt2, len2, &pos1, &pos2, &max);
if ((sum = max)) {
if (pos1 && pos2)
sum += _php3_similar_char(txt1, pos1, txt2, pos2);
if ((pos1 + max < len1) && (pos2 + max < len2))
sum += _php3_similar_char(txt1 + pos1 + max, len1 - pos1 - max,
txt2 + pos2 + max, len2 - pos2 -max);
}
return sum;
}
/* {{{ proto int similar_text(string str1, string str2 [, double percent])
Calculates the similarity between two strings */
PHP_FUNCTION(similar_text)
{
pval *t1, *t2, *percent;
int ac = ARG_COUNT(ht);
int sim;
if (ac < 2 || ac > 3 ||
getParameters(ht, ac, &t1, &t2, &percent) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(t1);
convert_to_string(t2);
if (ac > 2) {
convert_to_double(percent);
}
if ((t1->value.str.len + t2->value.str.len) == 0) {
if(ac > 2) {
percent->value.dval = 0;
}
RETURN_LONG(0);
}
sim = _php3_similar_char(t1->value.str.val, t1->value.str.len,
t2->value.str.val, t2->value.str.len);
if (ac > 2) {
percent->value.dval = sim * 200.0 / (t1->value.str.len + t2->value.str.len);
}
RETURN_LONG(sim);
}
/* }}} */
/* be careful, this edits the string in-place */
PHPAPI void _php3_stripslashes(char *string, int *len)
@ -1223,7 +1319,7 @@ PHPAPI char *_php3_addslashes(char *str, int length, int *new_length, int should
#define _isblank(c) (((((unsigned char) c)==' ' || ((unsigned char) c)=='\t')) ? 1 : 0)
#define _isnewline(c) (((((unsigned char) c)=='\n' || ((unsigned char) c)=='\r')) ? 1 : 0)
static void _php3_char_to_str(char *str,uint len,char from,char *to,int to_len,pval *result)
PHPAPI void _php3_char_to_str(char *str,uint len,char from,char *to,int to_len,pval *result)
{
int char_count=0;
char *source,*target,*tmp,*source_end=str+len, *tmp_end=NULL;
@ -1259,6 +1355,7 @@ static void _php3_char_to_str(char *str,uint len,char from,char *to,int to_len,p
*target = 0;
}
#if 0
/*
* this is a binary safe equivalent to strnstr
* note that we don't check for the end in str_to_str but here
@ -1328,6 +1425,56 @@ finish:
return new;
}
#else
static char *_php3_memstr(char *s, char *c, size_t n, size_t m)
{
char *p;
for(p = s; (p - s) < n; p++)
if(memcmp(p, c, m) == 0)
return p;
return NULL;
}
#define ATTCHSTR(st, sz) \
nl += sz; \
n = erealloc(n, nl + 1); \
memcpy(n + no, st, sz); \
no += sz
static char *_php3_str_to_str(char *a, int al, char *b, int bl, char *c, int cl,
int *newlen)
{
char *n = NULL, *p, *q;
int nl = 0;
int no = 0;
/* run through all occurences of b in a */
for(p = q = a; (p = _php3_memstr(p, b, al - (p - a), bl)); q = p) {
/* attach everything between the previous occ. and this one */
ATTCHSTR(q, p - q);
/* attach the replacement string c */
ATTCHSTR(c, cl);
/* jump over string b in a */
p += bl;
}
/* anything left over ? */
if((al - (q - a)) > 0) {
ATTCHSTR(q, al - (q - a));
}
if(newlen) *newlen = nl;
n[nl] = '\0';
return n;
}
#undef ATTCHSTR
#endif
/* {{{ proto string str_replace(string needle, string str, string haystack)
Replace all occurrences of needle in haystack with str */
PHP_FUNCTION(str_replace)
@ -1343,7 +1490,19 @@ PHP_FUNCTION(str_replace)
convert_to_string(haystack);
convert_to_string(needle);
convert_to_string(str); if(needle->value.str.len == 1) { _php3_char_to_str(haystack->value.str.val,haystack->value.str.len,needle->value.str.val[0],str->value.str.val, str->value.str.len ,return_value);
convert_to_string(str);
if(haystack->value.str.len == 0) {
RETURN_STRING(empty_string,1);
}
if(needle->value.str.len == 1) {
_php3_char_to_str(haystack->value.str.val,
haystack->value.str.len,
needle->value.str.val[0],
str->value.str.val,
str->value.str.len,
return_value);
return;
}
@ -1353,9 +1512,8 @@ PHP_FUNCTION(str_replace)
}
new = _php3_str_to_str(haystack->value.str.val, haystack->value.str.len,
needle->value.str.val, needle->value.str.len,
str->value.str.val, str->value.str.len,
&len);
needle->value.str.val, needle->value.str.len,
str->value.str.val, str->value.str.len, &len);
RETURN_STRINGL(new, len, 0);
}
/* }}} */
@ -1535,9 +1693,9 @@ PHP_FUNCTION(hebrev)
}
/* }}} */
/* {{{ proto string hebrev(string str [, int max_chars_per_line])
/* {{{ proto string hebrevc(string str [, int max_chars_per_line])
Convert logical Hebrew text to visual text with newline conversion */
PHP_FUNCTION(hebrev_with_conversion)
PHP_FUNCTION(hebrevc)
{
_php3_hebrev(INTERNAL_FUNCTION_PARAM_PASSTHRU,1);
}
@ -1545,7 +1703,7 @@ PHP_FUNCTION(hebrev_with_conversion)
/* {{{ proto string nl2br(string str)
Converts newlines to HTML line breaks */
PHP_FUNCTION(newline_to_br)
PHP_FUNCTION(nl2br)
{
pval *str;
@ -1559,6 +1717,23 @@ PHP_FUNCTION(newline_to_br)
}
/* }}} */
/* {{{ proto string strip_tags(string str)
Strips HTML and PHP tags from a string */
PHP_FUNCTION(strip_tags)
{
char *buf;
pval *str;
if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(str);
buf = estrdup(str->value.str.val);
_php3_strip_tags(buf, 0);
RETURN_STRING(buf, 0);
}
/* }}} */
/* {{{ proto string setlocale(string category, string locale)
Set locale information */
PHP_FUNCTION(setlocale)
@ -1569,7 +1744,7 @@ PHP_FUNCTION(setlocale)
if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &category, &locale)==FAILURE)
WRONG_PARAM_COUNT;
#if HAVE_SETLOCALE
#ifdef HAVE_SETLOCALE
convert_to_string(category);
convert_to_string(locale);
if (!strcasecmp ("LC_ALL", category->value.str.val))
@ -1618,6 +1793,103 @@ PHP_FUNCTION(parsestr)
}
php3_treat_data(PARSE_STRING, res);
}
/* }}} */
/* A simple little state-machine to strip out html and php tags
State 0 is the output state, State 1 means we are inside a
normal html tag and state 2 means we are inside a php tag.
The state variable is passed in to allow a function like fgetss
to maintain state across calls to the function.
lc holds the last significant character read and br is a bracket
counter.
*/
void _php3_strip_tags(char *rbuf, int state) {
char *buf, *p, *rp, c, lc;
int br;
buf = estrdup(rbuf);
c = *buf;
lc = '\0';
p = buf;
rp = rbuf;
br = 0;
while (c) { /* This is not binary-safe. Don't see why it should be */
switch (c) {
case '<':
if (state == 0) {
lc = '<';
state = 1;
}
break;
case '(':
if (state == 2) {
if (lc != '\"') {
lc = '(';
br++;
}
} else if (state == 0) {
*(rp++) = c;
}
break;
case ')':
if (state == 2) {
if (lc != '\"') {
lc = ')';
br--;
}
} else if (state == 0) {
*(rp++) = c;
}
break;
case '>':
if (state == 1) {
lc = '>';
state = 0;
} else if (state == 2) {
if (!br && lc != '\"' && *(p-1)=='?') {
state = 0;
}
}
break;
case '\"':
if (state == 2) {
if (lc == '\"') {
lc = '\0';
} else if (lc != '\\') {
lc = '\"';
}
} else if (state == 0) {
*(rp++) = c;
}
break;
case '?':
if (state==1 && *(p-1)=='<') {
br=0;
state=2;
break;
}
/* fall-through */
default:
if (state == 0) {
*(rp++) = c;
}
break;
}
c = *(++p);
}
*rp = '\0';
efree(buf);
}
/*
* Local variables:

View File

@ -60,7 +60,7 @@
---------------------------------------------------------------*/
/* Define if you have the link function. */
#define HAVE_LINK 0
#undef HAVE_LINK
/* Define if you have the lockf function. */
/* #undef HAVE_LOCKF */
@ -72,10 +72,10 @@
/* #undef HAVE_SRAND48 */
/* Define if you have the symlink function. */
#define HAVE_SYMLINK 0
#undef HAVE_SYMLINK
/* Define if you have the usleep function. */
#define HAVE_USLEEP 1
#undef HAVE_USLEEP
#define NEED_ISBLANK 1
/* ----------------------------------------------------------------
@ -96,7 +96,7 @@
---------------------------------------------------------------*/
#define DISCARD_PATH 1
#define HAVE_SETITIMER 0
#undef HAVE_SETITIMER
#define HAVE_IODBC 0 /*getting rid of old odbc*/
#define HAVE_UODBC 0
#define HAVE_LIBDL 1
@ -107,7 +107,7 @@
#define HAVE_TZSET 1
/* Define if you have the flock function. */
#define HAVE_FLOCK 0
#undef HAVE_FLOCK
/* Define if using alloca.c. */
/* #undef C_ALLOCA */
@ -126,7 +126,7 @@
/* #undef HAVE_ALLOCA_H */
/* Define if you have <sys/time.h> */
#define HAVE_SYS_TIME_H 0
#undef HAVE_SYS_TIME_H
/* Define if you have <signal.h> */
#define HAVE_SIGNAL_H 1
@ -135,10 +135,10 @@
/* #undef HAVE_DOPRNT */
/* Define if your struct stat has st_blksize. */
#define HAVE_ST_BLKSIZE 0
#undef HAVE_ST_BLKSIZE
/* Define if your struct stat has st_blocks. */
#define HAVE_ST_BLOCKS 0
#undef HAVE_ST_BLOCKS
/* Define if your struct stat has st_rdev. */
#define HAVE_ST_RDEV 1
@ -228,7 +228,7 @@
/* #undef HAVE_CRYPT_H */
/* Define if you have the <dirent.h> header file. */
#define HAVE_DIRENT_H 0
#undef HAVE_DIRENT_H
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1

View File

@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP HTML Embedded Scripting Language Version 3.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
| Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+----------------------------------------------------------------------+
| This program is free software; you can redistribute it and/or modify |
| it under the terms of one of the following licenses: |
@ -29,6 +29,8 @@
*/
/* $Id$ */
/* Synced with php3 revision 1.62 1999-06-16 [ssb] */
#include "php.h"
#include "php_globals.h"
#include "SAPI.h"
@ -98,87 +100,103 @@ int _php3_getftpresult(int socketd);
When open_basedir is NULL, always return 0
*/
PHPAPI int _php3_check_open_basedir(char *path)
PHPAPI int _php3_check_specific_open_basedir(char *basedir, char *path)
{
char resolved_name[MAXPATHLEN];
char resolved_basedir[MAXPATHLEN];
char local_open_basedir[MAXPATHLEN];
int local_open_basedir_pos;
PLS_FETCH();
/* Only check when open_basedir is available */
if (PG(open_basedir) && *PG(open_basedir)) {
/* Special case basedir==".": Use script-directory */
if ((strcmp(PG(open_basedir), ".") == 0) &&
request_info.filename &&
*request_info.filename
/* Special case basedir==".": Use script-directory */
if ((strcmp(PG(open_basedir), ".") == 0) &&
SG(request_info).path_translated &&
*SG(request_info).path_translated
) {
strcpy(local_open_basedir, request_info.filename);
local_open_basedir_pos = strlen(local_open_basedir) - 1;
strcpy(local_open_basedir, SG(request_info).path_translated);
local_open_basedir_pos = strlen(local_open_basedir) - 1;
/* Strip filename */
while ((
/* Strip filename */
while ((
#if WIN32|WINNT
(local_open_basedir[local_open_basedir_pos] != '\\') ||
(local_open_basedir[local_open_basedir_pos] != '\\') ||
#endif
(local_open_basedir[local_open_basedir_pos] != '/')
) &&
(local_open_basedir_pos >= 0)
(local_open_basedir[local_open_basedir_pos] != '/')
) &&
(local_open_basedir_pos >= 0)
) {
local_open_basedir[local_open_basedir_pos--] = 0;
}
#if 0
/* Strip double (back)slashes */
if (local_open_basedir_pos > 0) {
while ((
#if WIN32|WINNT
(local_open_basedir[local_open_basedir_pos-1] == '\\') ||
#endif
(local_open_basedir[local_open_basedir_pos-1] == '/')
) &&
(local_open_basedir_pos > 0)
) {
local_open_basedir[local_open_basedir_pos--] = 0;
}
}
#endif
} else {
/* Else use the unmodified path */
strcpy(local_open_basedir, PG(open_basedir));
local_open_basedir[local_open_basedir_pos--] = 0;
}
/* Resolve the real path into resolved_name */
if (_php3_realpath(path, resolved_name) != NULL) {
/* Check the path */
} else {
/* Else use the unmodified path */
strcpy(local_open_basedir, basedir);
}
/* Resolve the real path into resolved_name */
if ((_php3_realpath(path, resolved_name) != NULL) && (_php3_realpath(local_open_basedir, resolved_basedir) != NULL)) {
/* Check the path */
#if WIN32|WINNT
if (strncasecmp(local_open_basedir, resolved_name, strlen(local_open_basedir)) == 0) {
if (strncasecmp(resolved_basedir, resolved_name, strlen(resolved_basedir)) == 0) {
#else
if (strncmp(local_open_basedir, resolved_name, strlen(local_open_basedir)) == 0) {
if (strncmp(resolved_basedir, resolved_name, strlen(resolved_basedir)) == 0) {
#endif
/* File is in the right directory */
return 0;
} else {
php3_error(E_WARNING, "open_basedir restriction in effect. File is in wrong directory.");
return -1;
}
/* File is in the right directory */
return 0;
} else {
/* Unable to resolve the real path, return -1 */
php3_error(E_WARNING, "open_basedir restriction in effect. Unable to verify location of file.");
return -1;
}
} else {
/* open_basedir is not available, return 0 */
return 0;
/* Unable to resolve the real path, return -1 */
return -1;
}
}
PHPAPI int _php3_check_open_basedir(char *path)
{
/* Only check when open_basedir is available */
if (PG(open_basedir) && *PG(open_basedir)) {
char *pathbuf;
char *ptr;
char *end;
pathbuf = estrdup(PG(open_basedir));
ptr = pathbuf;
while (ptr && *ptr) {
#if WIN32|WINNT
end = strchr(ptr, ';');
#else
end = strchr(ptr, ':');
#endif
if (end != NULL) {
*end = '\0';
end++;
}
if (_php3_check_specific_open_basedir(ptr, path) == 0) {
efree(pathbuf);
return 0;
}
ptr = end;
}
php3_error(E_WARNING, "open_basedir restriction in effect. File is in wrong directory.");
efree(pathbuf);
return -1;
}
/* Nothing to check... */
return 0;
}
PHPAPI FILE *php3_fopen_wrapper(char *path, char *mode, int options, int *issock, int *socketd)
{
int cm=2; /* checkuid mode: 2 = if file does not exist, check directory */
PLS_FETCH();
/* FIXME Lets not get in the habit of doing stuff like this. This should
be runtime enabled, NOT compile time. */
#if PHP3_URL_FOPEN
if (!(options & IGNORE_URL)) {
return php3_fopen_url_wrapper(path, mode, options, issock, socketd);
@ -208,7 +226,7 @@ PHPAPI FILE *php3_fopen_for_parser(void)
PLS_FETCH();
SLS_FETCH();
fn = request_info.filename;
fn = SG(request_info).path_translated;
path_info = SG(request_info).request_uri;
#if HAVE_PWD_H
if (PG(user_dir) && *PG(user_dir)
@ -236,8 +254,8 @@ PHPAPI FILE *php3_fopen_for_parser(void)
strcat(fn, PG(user_dir)); /* safe */
strcat(fn, "/"); /* safe */
strcat(fn, s + 1); /* safe (shorter than path_info) */
STR_FREE(request_info.filename);
request_info.filename = fn;
STR_FREE(SG(request_info).path_translated);
SG(request_info).path_translated = fn;
}
}
}
@ -259,17 +277,17 @@ PHPAPI FILE *php3_fopen_for_parser(void)
if ('/' == path_info[0])
l--;
strcpy(fn + l, path_info);
STR_FREE(request_info.filename);
request_info.filename = fn;
STR_FREE(SG(request_info).path_translated);
SG(request_info).path_translated = fn;
}
} /* if doc_root && path_info */
if (!fn) {
/* we have to free request_info.filename here because
/* we have to free SG(request_info).path_translated here because
php3_destroy_request_info assumes that it will get
freed when the include_names hash is emptied, but
we're not adding it in this case */
STR_FREE(request_info.filename);
request_info.filename = NULL;
STR_FREE(SG(request_info).path_translated);
SG(request_info).path_translated = NULL;
return NULL;
}
fp = fopen(fn, "r");
@ -281,7 +299,7 @@ PHPAPI FILE *php3_fopen_for_parser(void)
}
if (!fp) {
php3_error(E_CORE_ERROR, "Unable to open %s", fn);
STR_FREE(request_info.filename); /* for same reason as above */
STR_FREE(SG(request_info).path_translated); /* for same reason as above */
return NULL;
}
@ -443,7 +461,6 @@ static FILE *php3_fopen_url_wrapper(const char *path, char *mode, int options, i
FILE *fp = NULL;
struct sockaddr_in server;
unsigned short portno;
char winfeof;
if (!strncasecmp(path, "http://", 7)) {
resource = url_parse((char *) path);
@ -463,16 +480,15 @@ static FILE *php3_fopen_url_wrapper(const char *path, char *mode, int options, i
free_url(resource);
return NULL;
}
lookup_hostname(resource->host, &server.sin_addr);
server.sin_family = AF_INET;
if (server.sin_addr.s_addr == -1) {
if (lookup_hostname(resource->host, &server.sin_addr)) {
SOCK_FCLOSE(*socketd);
*socketd = 0;
free_url(resource);
return NULL;
}
server.sin_port = htons(resource->port);
server.sin_family = AF_INET;
if (connect(*socketd, (struct sockaddr *) &server, sizeof(server)) == SOCK_CONN_ERR) {
SOCK_FCLOSE(*socketd);
@ -554,8 +570,8 @@ static FILE *php3_fopen_url_wrapper(const char *path, char *mode, int options, i
/* Read past http header */
body = 0;
location[0] = '\0';
while (!body && recv(*socketd, (char *) &winfeof, 1, MSG_PEEK)) {
if (SOCK_FGETC(buf, *socketd) == SOCK_RECV_ERR) {
while (!body && !SOCK_FEOF(*socketd)) {
if ((buf[0] = SOCK_FGETC(*socketd)) == EOF) {
SOCK_FCLOSE(*socketd);
*socketd = 0;
free_url(resource);
@ -629,9 +645,9 @@ static FILE *php3_fopen_url_wrapper(const char *path, char *mode, int options, i
free_url(resource);
return NULL;
}
lookup_hostname(resource->host, &server.sin_addr);
server.sin_family = AF_INET;
if (server.sin_addr.s_addr == -1) {
if (lookup_hostname(resource->host, &server.sin_addr)) {
SOCK_FCLOSE(*socketd);
*socketd = 0;
free_url(resource);
@ -712,6 +728,16 @@ static FILE *php3_fopen_url_wrapper(const char *path, char *mode, int options, i
return NULL;
}
/* set the connection to be binary */
SOCK_WRITE("TYPE I\n", *socketd);
result = _php3_getftpresult(*socketd);
if (result > 299 || result < 200) {
free_url(resource);
SOCK_FCLOSE(*socketd);
*socketd = 0;
return NULL;
}
/* find out the size of the file (verifying it exists) */
SOCK_WRITE("SIZE ", *socketd);
SOCK_WRITE(resource->path, *socketd);
@ -741,15 +767,6 @@ static FILE *php3_fopen_url_wrapper(const char *path, char *mode, int options, i
}
}
/* set the connection to be binary */
SOCK_WRITE("TYPE I\n", *socketd);
result = _php3_getftpresult(*socketd);
if (result > 299 || result < 200) {
free_url(resource);
SOCK_FCLOSE(*socketd);
*socketd = 0;
return NULL;
}
/* set up the passive connection */
SOCK_WRITE("PASV\n", *socketd);
while (SOCK_FGETS(tmp_line, 256, *socketd) &&
@ -841,9 +858,9 @@ static FILE *php3_fopen_url_wrapper(const char *path, char *mode, int options, i
free_url(resource);
return NULL;
}
lookup_hostname(resource->host, &server.sin_addr);
server.sin_family = AF_INET;
if (server.sin_addr.s_addr == -1) {
if (lookup_hostname(resource->host, &server.sin_addr)) {
free_url(resource);
SOCK_FCLOSE(*socketd);
*socketd = 0;

View File

@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP HTML Embedded Scripting Language Version 3.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
| Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+----------------------------------------------------------------------+
| This program is free software; you can redistribute it and/or modify |
| it under the terms of one of the following licenses: |
@ -28,6 +28,8 @@
*/
/* $Id$ */
/* Synced with php3 revision 1.25 1999-06-16 [ssb] */
#ifndef _FOPEN_WRAPPERS_H
#define _FOPEN_WRAPPERS_H
@ -46,17 +48,27 @@
# define SOCK_ERR INVALID_SOCKET
# define SOCK_CONN_ERR SOCKET_ERROR
# define SOCK_RECV_ERR SOCKET_ERROR
# define SOCK_FCLOSE(s) closesocket(s)
#else
# define SOCK_ERR -1
# define SOCK_CONN_ERR -1
# define SOCK_RECV_ERR -1
# define SOCK_FCLOSE(s) close(s)
#endif
#define SOCK_WRITE(d,s) send(s,d,strlen(d),0)
#define SOCK_WRITEL(d,l,s) send(s,d,l,0)
#define SOCK_FGETC(c,s) recv(s,c,1,0)
#define SOCK_FGETC(s) _php3_sock_fgetc((s))
#define SOCK_FGETS(b,l,s) _php3_sock_fgets((b),(l),(s))
#define SOCK_FEOF(sock) _php3_sock_feof((sock))
#define SOCK_FREAD(ptr,size,sock) _php3_sock_fread((ptr),(size),(sock))
#define SOCK_FCLOSE(s) _php3_sock_close(s)
#define FP_FGETS(buf,len,sock,fp,issock) \
((issock)?SOCK_FGETS(buf,len,sock):fgets(buf,len,fp))
#define FP_FREAD(buf,len,sock,fp,issock) \
((issock)?SOCK_FREAD(buf,len,sock):fread(buf,1,len,fp))
#define FP_FEOF(sock,fp,issock) \
((issock)?SOCK_FEOF(sock):feof(fp))
#define FP_FGETC(sock,fp,issock) \
((issock)?SOCK_FGETC(sock):fgetc(fp))
/* values for issock */
#define IS_NOT_SOCKET 0
@ -72,12 +84,12 @@ extern PHPAPI FILE *php3_fopen_wrapper(char *filename, char *mode, int options,
PHPAPI FILE *php3_fopen_for_parser(void);
extern PHPAPI int _php3_check_open_basedir(char *path);
extern PHPAPI int _php3_check_specific_open_basedir(char *basedir, char *path);
extern PHPAPI FILE *php3_fopen_with_path(char *filename, char *mode, char *path, char **opened_path);
extern PHPAPI int php3_isurl(char *path);
extern PHPAPI char *php3_strip_url_passwd(char *path);
extern PHPAPI int php3_write(void *buf, int size);
extern PHPAPI char *expand_filepath(char *filepath);

View File

@ -465,7 +465,7 @@ PHPAPI void php3_error(int type, const char *format,...)
#if HAVE_SETITIMER
#ifdef HAVE_SETITIMER
static void php3_timeout(int dummy)
{
PLS_FETCH();
@ -483,7 +483,7 @@ static void php3_set_timeout(long seconds)
{
#if WIN32|WINNT
#else
# if HAVE_SETITIMER
# ifdef HAVE_SETITIMER
struct itimerval t_r; /* timeout requested */
t_r.it_value.tv_sec = seconds;
@ -500,7 +500,7 @@ static void php3_unset_timeout()
{
#if WIN32|WINNT
#else
# if HAVE_SETITIMER
# ifdef HAVE_SETITIMER
struct itimerval no_timeout;
no_timeout.it_value.tv_sec = no_timeout.it_value.tv_usec = no_timeout.it_interval.tv_sec = no_timeout.it_interval.tv_usec = 0;

View File

@ -70,7 +70,7 @@ void usleep(unsigned int useconds)
}
#if HAVE_SETITIMER
#ifdef HAVE_SETITIMER
#ifndef THREAD_SAFE