diff --git a/src/fd_control.c b/src/fd_control.c index 9334625ae29808e423736d136a296f272047bbca..6630307d5a1e037c828cebc005a5f3253ffdcb03 100644 --- a/src/fd_control.c +++ b/src/fd_control.c @@ -10,7 +10,7 @@ #include "error.h" #include "fdlib.h" -RCSID("$Id: fd_control.c,v 1.27 1999/09/14 21:07:20 hubbe Exp $"); +RCSID("$Id: fd_control.c,v 1.28 2000/05/20 02:21:47 per Exp $"); #else /* TESTING */ @@ -73,9 +73,8 @@ int set_nonblocking(int fd,int which) { int ret; #ifdef PIKE_DEBUG - if(fd<0 || fd >MAX_OPEN_FILEDESCRIPTORS) - fatal("Filedescriptor %d out of range [0,%d).\n", - fd, MAX_OPEN_FILEDESCRIPTORS); + if(fd<0) + fatal("Filedescriptor %d out of range [0,inf).\n", fd); #endif do @@ -110,7 +109,7 @@ int query_nonblocking(int fd) { int ret; #ifdef PIKE_DEBUG - if(fd<0 || fd > MAX_OPEN_FILEDESCRIPTORS) + if(fd<0) fatal("Filedescriptor out of range.\n"); #endif @@ -140,8 +139,23 @@ int query_nonblocking(int fd) #endif /* FD_CLOEXEC */ #ifdef HAVE_BROKEN_F_SETFD -static int fds_to_close[MAX_OPEN_FILEDESCRIPTORS]; -static int num_fds_to_close = 0; +static int *fds_to_close; +static int fds_to_close_size = 0; + +#define ASSURE_FDS_TO_CLOSE_SIZE(X) \ +do{while(fds_to_close_size-1 < X) grow_fds_to_close();}while(0) + +static void grow_fds_to_close( ) +{ + if(!fds_to_close_size) + fds_to_close_size = 1; + fds_to_close_size *= 2; + fds_to_close = realloc( fds_to_close, sizeof( int ) * fds_to_close_size ); + if(!fds_to_close) + fatal("Out of memory in fd_control::grow_fds_to_close()\n" + "Tried to allocate %d fd_datum structs\n", fds_to_close_size); + MEMSET( fds+(fds_size/2), 0, fds_to_close_size*sizeof(int)/2 ); +} void do_close_on_exec(void) { @@ -170,6 +184,7 @@ int set_close_on_exec(int fd, int which) return(0); /* Already marked */ } } + ASSURE_FDS_TO_CLOSE_SIZE((num_fds_to_close+1)); fds_to_close[num_fds_to_close++] = fd; return(0); } else {