diff --git a/src/backend.c b/src/backend.c index 4e8e3dcc30185d180a85b12635de0fe5ace081a7..ec8be646cf75657707abe0ef52f8de022b8d8927 100644 --- a/src/backend.c +++ b/src/backend.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: backend.c,v 1.46 2000/04/13 20:14:35 hubbe Exp $"); +RCSID("$Id: backend.c,v 1.47 2000/05/20 02:20:00 per Exp $"); #include "fdlib.h" #include "backend.h" #include <errno.h> @@ -50,7 +50,23 @@ struct fd_datum #endif }; -struct fd_datum fds[MAX_OPEN_FILEDESCRIPTORS]; +struct fd_datum *fds; +int fds_size = 0; + +#define ASSURE_FDS_SIZE(X) do{while(fds_size-1 < X) grow_fds();}while(0) + +void grow_fds( ) +{ + if( !fds_size ) + fds_size = 16; + fds_size *= 2; + fds = realloc( fds, sizeof(struct fd_datum) * fds_size ); + if( !fds ) + fatal("Out of memory in backend::grow_fds()\n" + "Tried to allocate %d fd_datum structs\n", fds_size); + MEMSET( fds+(fds_size/2), 0, fds_size*sizeof(struct fd_datum)/2 ); +} + #ifndef HAVE_AND_USE_POLL #undef HAVE_POLL @@ -250,10 +266,14 @@ void cleanup_backend(void) void set_read_callback(int fd,file_callback cb,void *data) { #ifdef HAVE_POLL - int was_set = (fds[fd].read.callback!=0); + int was_set; +#endif + ASSURE_FDS_SIZE( fd ); +#ifdef HAVE_POLL + was_set = (fds[fd].read.callback!=0); #endif #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif fds[fd].read.callback=cb; @@ -297,10 +317,14 @@ void set_read_callback(int fd,file_callback cb,void *data) void set_write_callback(int fd,file_callback cb,void *data) { #ifdef HAVE_POLL - int was_set = (fds[fd].write.callback!=0); + int was_set; +#endif + ASSURE_FDS_SIZE( fd ); +#ifdef HAVE_POLL + was_set = (fds[fd].write.callback!=0); #endif #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif @@ -356,10 +380,14 @@ void set_write_callback(int fd,file_callback cb,void *data) void set_read_oob_callback(int fd,file_callback cb,void *data) { #ifdef HAVE_POLL - int was_set = (fds[fd].read_oob.callback!=0); + int was_set; +#endif + ASSURE_FDS_SIZE( fd ); +#ifdef HAVE_POLL + was_set = (fds[fd].read_oob.callback!=0); #endif #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif fds[fd].read_oob.callback=cb; @@ -399,10 +427,14 @@ void set_read_oob_callback(int fd,file_callback cb,void *data) void set_write_oob_callback(int fd,file_callback cb,void *data) { #ifdef HAVE_POLL - int was_set = (fds[fd].write_oob.callback!=0); + int was_set; +#endif + ASSURE_FDS_SIZE( fd ); +#ifdef HAVE_POLL + was_set = (fds[fd].write_oob.callback!=0); #endif #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif @@ -451,20 +483,20 @@ void set_write_oob_callback(int fd,file_callback cb,void *data) file_callback query_read_callback(int fd) { #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif - + ASSURE_FDS_SIZE( fd ); return fds[fd].read.callback; } file_callback query_write_callback(int fd) { #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif - + ASSURE_FDS_SIZE( fd ); return fds[fd].write.callback; } @@ -472,20 +504,21 @@ file_callback query_write_callback(int fd) file_callback query_read_oob_callback(int fd) { #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif - + ASSURE_FDS_SIZE( fd ); return fds[fd].read_oob.callback; } file_callback query_write_oob_callback(int fd) { #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif + ASSURE_FDS_SIZE( fd ); return fds[fd].write_oob.callback; } #endif /* WITH_OOB */ @@ -493,20 +526,22 @@ file_callback query_write_oob_callback(int fd) void *query_read_callback_data(int fd) { #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif + ASSURE_FDS_SIZE( fd ); return fds[fd].read.data; } void *query_write_callback_data(int fd) { #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif + ASSURE_FDS_SIZE( fd ); return fds[fd].write.data; } @@ -514,20 +549,22 @@ void *query_write_callback_data(int fd) void *query_read_oob_callback_data(int fd) { #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif + ASSURE_FDS_SIZE( fd ); return fds[fd].read_oob.data; } void *query_write_oob_callback_data(int fd) { #ifdef PIKE_DEBUG - if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif + ASSURE_FDS_SIZE( fd ); return fds[fd].write_oob.data; } #endif /* WITH_OOB */ @@ -890,7 +927,7 @@ void backend(void) case EBADF: { int i; - for(i=0;i<MAX_OPEN_FILEDESCRIPTORS;i++) + for(i=0;i<fds_size;i++) { if(!my_FD_ISSET(i, &selectors.read) && !my_FD_ISSET(i, &selectors.write)