CVS update: php3/functions

From: 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

« previous php.dev (#6013) next »