CVS update: php3/functions
| From: | sas | Date: | Wed, 26 May 1999 12:15:24 +0000 |
| Subject: | CVS update: php3/functions | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-6013@lists.php.net to get a copy of this message | ||
Date: Wednesday May 26, 1999 @ 8:15
Author: sas
Update of /repository/php3/functions
In directory php:/tmp/cvs-serv18676
Modified Files:
fsock.c
Log Message:
first changes for blocking support
Index: php3/functions/fsock.c
diff -u php3/functions/fsock.c:1.100 php3/functions/fsock.c:1.101
--- php3/functions/fsock.c:1.100 Mon May 24 10:50:13 1999
+++ php3/functions/fsock.c Wed May 26 08:15:24 1999
@@ -27,7 +27,7 @@
| Jim Winstead (jimw@php.net) |
+----------------------------------------------------------------------+
*/
-/* $Id: fsock.c,v 1.100 1999/05/24 14:50:13 sas Exp $ */
+/* $Id: fsock.c,v 1.101 1999/05/26 12:15:24 sas Exp $ */
#ifdef THREAD_SAFE
#include "tls.h"
#endif
@@ -96,6 +96,7 @@
struct php3i_sockbuf *next;
char eof;
char persistent;
+ char is_blocked;
};
static struct php3i_sockbuf *phpsockbuf;
@@ -345,33 +346,42 @@
#define CHUNK_SIZE 2048
#define MAX_CHUNKS_PER_READ 10
-/* this reads all available data on a socket */
-size_t _php3_sock_read(php3i_sockbuf *sock)
+
+static size_t _php3_sock_read_limited(php3i_sockbuf *sock, size_t max)
{
char buf[CHUNK_SIZE];
- int nr_bytes;
+ size_t nr_bytes;
size_t nr_read = 0;
- int i;
- if(sock->eof) return nr_read;
+ if(sock->eof || max > CHUNK_SIZE) return nr_read;
- for(i = 0; i < MAX_CHUNKS_PER_READ; i++) {
- nr_bytes = recv(sock->socket, buf, CHUNK_SIZE, 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
- break;
+ 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;
}
- if(nr_bytes == 0 || (nr_bytes < 0 && errno != EWOULDBLOCK)) {
- sock->eof = 1;
+ return nr_read;
+}
+
+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;
@@ -383,12 +393,18 @@
if(!sock) sock = _php3_sock_create(socket); \
_php3_sock_read(sock)
+#define SOCK_FIND_AND_READ_MAX(max) \
+ php3i_sockbuf *sock; \
+ sock = _php3_sock_find(socket); \
+ if(!sock) sock = _php3_sock_create(socket); \
+ if(sock->is_blocked) _php3_sock_read_limited(sock, max); else _php3_sock_read(sock)
+
size_t _php3_sock_fgets(char *buf, size_t maxlen, int socket)
{
char *p;
size_t ret = 0;
size_t amount = 0;
- SOCK_FIND_AND_READ;
+ SOCK_FIND_AND_READ_MAX(maxlen);
p = memchr(READPTR(sock), '\n', MIN(TOREAD(sock), maxlen - 1));
if(p) {
@@ -412,7 +428,7 @@
int _php3_sock_fgetc(int socket)
{
int ret = EOF;
- SOCK_FIND_AND_READ;
+ SOCK_FIND_AND_READ_MAX(1);
if(TOREAD(sock) > 0) {
ret = *READPTR(sock);
@@ -425,7 +441,7 @@
int _php3_sock_feof(int socket)
{
int ret = 0;
- SOCK_FIND_AND_READ;
+ SOCK_FIND_AND_READ_MAX(1);
if(!TOREAD(sock) && sock->eof)
ret = 1;
@@ -436,7 +452,7 @@
size_t _php3_sock_fread(char *ptr, size_t size, int socket)
{
size_t ret = 0;
- SOCK_FIND_AND_READ;
+ SOCK_FIND_AND_READ_MAX(size);
ret = MIN(TOREAD(sock), size);
if(ret) {
--
PHP Development Mailing List http://www.php.net/
To unsubscribe send an empty message to php-dev-unsubscribe@lists.php.net
For help: php-dev-help@lists.php.net