Browse Source

Apply Sascha's fsock fixes to php4.

experimental/newoperator
Stig Bakken 28 years ago
parent
commit
467523bac5
  1. 84
      ext/standard/fsock.c
  2. 3
      ext/standard/fsock.h

84
ext/standard/fsock.c

@ -27,8 +27,11 @@
| Jim Winstead (jimw@php.net) |
+----------------------------------------------------------------------+
*/
/* $Id$ */
/* Synced with php3 revision 1.121 1999-06-18 [ssb] */
#include "php.h"
#include "php_globals.h"
#include <stdlib.h>
@ -108,6 +111,7 @@ struct php3i_sockbuf {
char eof;
char persistent;
char is_blocked;
size_t chunk_size;
};
static struct php3i_sockbuf *phpsockbuf;
@ -419,6 +423,7 @@ int _php3_sock_eof(int socket)
return ret;
}
#define CHUNK_SIZE 2048
#define SOCK_DESTROY(sock) \
if(sock->readbuf) pefree(sock->readbuf, sock->persistent); \
if(sock->prev) sock->prev->next = sock->next; \
@ -427,6 +432,8 @@ int _php3_sock_eof(int socket)
phpsockbuf = sock->next; \
pefree(sock, sock->persistent)
static size_t def_chunk_size = CHUNK_SIZE;
static void php_cleanup_sockbuf(int persistent)
{
php3i_sockbuf *now, *next;
@ -472,11 +479,25 @@ static php3i_sockbuf *_php3_sock_create(int socket)
}
sock->persistent = persistent;
sock->is_blocked = 1;
sock->chunk_size = def_chunk_size;
phpsockbuf = sock;
return sock;
}
size_t _php3_sock_set_def_chunk_size(size_t size)
{
size_t old;
old = def_chunk_size;
if (size <= CHUNK_SIZE || size > 0) {
def_chunk_size = size;
}
return old;
}
int _php3_sock_destroy(int socket)
{
int ret = 0;
@ -514,24 +535,40 @@ int _php3_sock_close(int socket)
return ret;
}
#define CHUNK_SIZE 2048
#define MAX_CHUNKS_PER_READ 10
static void _php3_sock_wait_for_data(php3i_sockbuf *sock)
{
fd_set fdr, tfdr;
FD_ZERO(&fdr);
FD_SET(sock->socket, &fdr);
while (1) {
tfdr = fdr;
if(select(sock->socket + 1, &tfdr, NULL, NULL, NULL) == 1) {
break;
}
}
}
static size_t _php3_sock_read_limited(php3i_sockbuf *sock, size_t max)
static size_t _php3_sock_read_limited(php3i_sockbuf *sock, int maxread)
{
char buf[CHUNK_SIZE];
int nr_bytes;
size_t nr_read = 0;
if (sock->eof || max > CHUNK_SIZE) {
return nr_read;
if (sock->eof || TOREAD(sock) >= maxread) {
return 0;
}
if (sock->is_blocked) {
_php3_sock_wait_for_data(sock);
}
nr_bytes = recv(sock->socket, buf, max, 0);
nr_bytes = recv(sock->socket, buf, sock->chunk_size, 0);
if (nr_bytes > 0) {
if (sock->writepos + nr_bytes > sock->readbuflen) {
sock->readbuflen += CHUNK_SIZE;
sock->readbuflen += sock->chunk_size;
sock->readbuf = perealloc(sock->readbuf, sock->readbuflen,
sock->persistent);
}
@ -545,32 +582,6 @@ static size_t _php3_sock_read_limited(php3i_sockbuf *sock, size_t max)
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;
@ -620,16 +631,13 @@ char *_php3_sock_fgets(char *buf, size_t maxlen, int socket)
}
if (sock->is_blocked) {
nr_toread = _php3_sock_queued_data(sock);
if (!nr_toread) {
nr_toread = 1;
}
nr_toread = 0;
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;
}
nr_toread = 1;
nr_toread = 512;
}
} else {
_php3_sock_read(sock);
@ -682,7 +690,7 @@ int _php3_sock_fgetc(int socket)
int _php3_sock_feof(int socket)
{
int ret = 0;
SOCK_FIND_AND_READ_MAX(1);
SOCK_FIND(sock, socket);
if (!TOREAD(sock) && sock->eof) {
ret = 1;

3
ext/standard/fsock.h

@ -29,6 +29,8 @@
*/
/* $Id$ */
/* Synced with php3 revision 1.24 1999-06-18 [ssb] */
#ifndef _FSOCK_H
#define _FSOCK_H
@ -58,6 +60,7 @@ extern int _php3_is_persistent_sock(int);
extern int _php3_sock_set_blocking(int socket, int mode);
extern int _php3_sock_destroy(int socket);
extern int _php3_sock_close(int socket);
size_t _php3_sock_set_def_chunk_size(size_t size);
PHPAPI int connect_nonb(int sockfd, struct sockaddr *addr, int addrlen, struct timeval *timeout);

Loading…
Cancel
Save