CVS update: php4/ext/standard
| From: | ssb | Date: | Fri, 18 Jun 1999 13:42:21 +0000 |
| Subject: | CVS update: php4/ext/standard | ||
| Groups: | php.version4 | ||
| Request: | Send a blank email to php-version4+get-1593@lists.php.net to get a copy of this message | ||
Date: Friday June 18, 1999 @ 9:42
Author: ssb
Update of /repository/php4/ext/standard
In directory php:/tmp/cvs-serv26795
Modified Files:
fsock.c fsock.h
Log Message:
Apply Sascha's fsock fixes to php4.
Index: php4/ext/standard/fsock.c
diff -u php4/ext/standard/fsock.c:1.9 php4/ext/standard/fsock.c:1.10
--- php4/ext/standard/fsock.c:1.9 Wed Jun 16 13:06:52 1999
+++ php4/ext/standard/fsock.c Fri Jun 18 09:42:20 1999
@@ -27,8 +27,11 @@
| Jim Winstead (jimw@php.net) |
+----------------------------------------------------------------------+
*/
-/* $Id: fsock.c,v 1.9 1999/06/16 17:06:52 ssb Exp $ */
+/* $Id: fsock.c,v 1.10 1999/06/18 13:42:20 ssb Exp $ */
+
+/* Synced with php3 revision 1.121 1999-06-18 [ssb] */
+
#include "php.h"
#include "php_globals.h"
#include <stdlib.h>
@@ -108,6 +111,7 @@
char eof;
char persistent;
char is_blocked;
+ size_t chunk_size;
};
static struct php3i_sockbuf *phpsockbuf;
@@ -419,6 +423,7 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
}
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_feof(int socket)
{
int ret = 0;
- SOCK_FIND_AND_READ_MAX(1);
+ SOCK_FIND(sock, socket);
if (!TOREAD(sock) && sock->eof) {
ret = 1;
Index: php4/ext/standard/fsock.h
diff -u php4/ext/standard/fsock.h:1.8 php4/ext/standard/fsock.h:1.9
--- php4/ext/standard/fsock.h:1.8 Wed Jun 16 13:06:52 1999
+++ php4/ext/standard/fsock.h Fri Jun 18 09:42:21 1999
@@ -27,8 +27,10 @@
| Jim Winstead (jimw@php.net) |
+----------------------------------------------------------------------+
*/
-/* $Id: fsock.h,v 1.8 1999/06/16 17:06:52 ssb Exp $ */
+/* $Id: fsock.h,v 1.9 1999/06/18 13:42:21 ssb Exp $ */
+/* Synced with php3 revision 1.24 1999-06-18 [ssb] */
+
#ifndef _FSOCK_H
#define _FSOCK_H
@@ -58,6 +60,7 @@
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);