diff --git a/src/fdlib.c b/src/fdlib.c index 7395872c64b0a27520812778fd1c2f9cd63a73be..c58a4cd9147f957f3d1fd1f63ab6a49c3900a856 100644 --- a/src/fdlib.c +++ b/src/fdlib.c @@ -456,7 +456,7 @@ FD fd_dup2(FD from, FD to) return to; } -#endif +#endif /* HAVE_WINSOCK_H */ #if 0 @@ -496,7 +496,7 @@ void *fd_mapper_get(struct fd_mapper *x, FD fd) { return x->data[fd]; } -#else +#else /* FD_LINEAR */ struct fd_mapper_data { FD x; @@ -560,1141 +560,9 @@ void *fd_mapper_get(struct fd_mapper *x, FD fd) } return x->data[hval].data; } -#endif +#endif /* FD_LINEAR */ -#if 0 -struct fd_data_hash -{ - FD fd; - int key; - struct fd_data_hash *next; - void *data; -}; - -#define FD_DATA_PER_BLOCK 255 - -struct fd_data_hash_block -{ - struct fd_data_hash_block *next; - struct fd_data_hash data[FD_DATA_PER_BLOCk]; -}; - -static int keynum=0; -static unsigned int num_stored_keys=0; -static unsigned int hash_size=0; -static struct fd_data_hash *free_blocks=0; -static struct fd_data_hash **htable=0; -static fd_data_hash_block *hash_blocks=0; - -int get_fd_data_key(void) -{ - return ++keynum; -} - -void store_fd_data(FD fd, int key, void *data) -{ - struct fd_data_hash *p,**last; - unsigned int hval=(fd + key * 53) % hash_size; - - for(last=htable[e];p=*last;last=&p->next) - { - if(p->fd == fd && p->key == key) - { - if(data) - { - p->data=data; - }else{ - *last=p->next; - p->next=free_blocks; - free_blocks=p; - num_stored_keys--; - } - return; - } - } - if(!data) return; - - num_stored_keys++; - - if(num_stored_keys * 2 >= hash_size) - { - /* time to rehash */ - unsigned int h; - unsigned int old_hsize=hash_size; - unsigned fd_data_hash **old_htable=htable; - if(!hash_size) - hash_size=127; - else - hash_size*=3; - - htable=(struct fd_data_hash **)xalloc(hash_size * sizeof(struct fd_data_hash *)); - - for(h=0;h<old_hsize;h++) - { - for(last=old_htable+e;p=*last;last=&p->next) - store_fd_data(p->fd, p->key, p->data); - *last=free_blocks; - free_blocks=old_htable[h]; - } - if(old_htable) - free((char *)old_htable); - } - - - if(!free_blocks) - { - struct fd_data_hash_block *n; - int e; - n=ALLOC_STRUCT(fd_data_hash_block); - n->next=hash_blocks; - hash_blocks=n; - for(e=0;e<FD_DATA_PER_BLOCK;e++) - { - n->data[e].next=free_blocks; - free_blocks=n->data+e; - } - } - - p=free_blocks; - free_blocks=p->next; - p->fd=fd; - p->key=key; - p->data=data; - p->next=htable[hval]; - htable[hval]=p; -} - -void *get_fd_data(FD fd, int key) -{ - struct fd_data_hash *p,**last; - unsigned int hval=(fd + key * 53) % hash_size; - - for(p=htable[hval];p;p=p->next) - if(p->fd == fd && p->key == key) - return p->data; - - return 0; -} - - -#endif - -#ifdef FDLIB_USE_SELECT - -struct fd_waitor -{ - fd_FDSET storage; - fd_FDSET temporary; -static long convert_filetime_to_time_t(FILETIME tmp) -{ - double t; - t=tmp.dwHighDateTime * pow(2.0,32.0) + (double)tmp.dwLowDateTime; - t/=10000000.0; - t-=11644473600.0; - return (long)floor(t); -} - -int fd_fstat(FD fd, struct stat *s) -{ - DWORD x; - int ret; - FILETIME c,a,m; - FDDEBUG(fprintf(stderr,"fstat on %d (%d)\n",fd,da_handle[fd])); - if(fd_type[fd]!=FD_FILE) - { - errno=ENOTSUPP; - return -1; - } - - MEMSET(s, 0, sizeof(struct stat)); - s->st_nlink=1; - - switch(fd_type[fd]) - { - case FD_SOCKET: - s->st_mode=S_IFSOCK; - break; - - default: - switch(GetFileType((HANDLE)da_handle[fd])) - { - default: - case FILE_TYPE_UNKNOWN: s->st_mode=0; break; - case FILE_TYPE_DISK: - s->st_mode=S_IFREG; - s->st_size=GetFileSize((HANDLE)da_handle[fd],&x); - if(x) - { - s->st_size=0x7fffffff; - } - if(!GetFileTime((HANDLE)da_handle[fd], &c, &a, &m)) - { - errno=GetLastError(); - return -1; - } - s->st_ctime=convert_filetime_to_time_t(c); - s->st_atime=convert_filetime_to_time_t(a); - s->st_mtime=convert_filetime_to_time_t(m); - break; - case FILE_TYPE_CHAR: s->st_mode=S_IFCHR; break; - case FILE_TYPE_PIPE: s->st_mode=S_IFFIFO; break; - } - } - s->st_mode |= 0666; - return 0; -} - -int fd_select(int fds, FD_SET *a, FD_SET *b, FD_SET *c, struct timeval *t) -{ - int ret; - ret=select(fds,a,b,c,t); - if(ret==SOCKET_ERROR) - { - errno=WSAGetLastError(); - return -1; - } - return ret; -} - - -int fd_ioctl(FD fd, int cmd, void *data) -{ - int ret; - switch(fd_type[fd]) - { - case FD_SOCKET: - ret=ioctlsocket((SOCKET)da_handle[fd], cmd, data); - if(ret==SOCKET_ERROR) - { - errno=WSAGetLastError(); - return -1; - } - return ret; - - default: - errno=ENOTSUPP; - return -1; - } -} - - -FD fd_dup(FD from) -{ - FD fd; - HANDLE x,p=GetCurrentProcess(); - if(!DuplicateHandle(p,(HANDLE)da_handle[from],p,&x,NULL,0,DUPLICATE_SAME_ACCESS)) - { - errno=GetLastError(); - return -1; - } - - fd=first_free_handle; - first_free_handle=fd_type[fd]; - fd_type[fd]=fd_type[from]; - da_handle[fd]=(long)x; - - FDDEBUG(fprintf(stderr,"Dup %d (%d) to %d (%d)\n",from,da_handle[from],fd,x)); - return fd; -} - -FD fd_dup2(FD from, FD to) -{ - HANDLE x,p=GetCurrentProcess(); - if(!DuplicateHandle(p,(HANDLE)da_handle[from],p,&x,NULL,0,DUPLICATE_SAME_ACCESS)) - { - errno=GetLastError(); - return -1; - } - - if(fd_type[to] < FD_NO_MORE_FREE) - { - if(!CloseHandle((HANDLE)da_handle[to])) - { - errno=GetLastError(); - return -1; - } - }else{ - int *prev,next; - for(prev=&first_free_handle;(next=*prev) != FD_NO_MORE_FREE;prev=fd_type+next) - { - if(next==to) - { - *prev=fd_type[next]; - break; - } - } - } - fd_type[to]=fd_type[from]; - da_handle[to]=(long)x; - - FDDEBUG(fprintf(stderr,"Dup2 %d (%d) to %d (%d)\n",from,da_handle[from],to,x)); - - return to; -} - -#endif - -#if 0 - -#ifdef FD_LINEAR -struct fd_mapper -{ - int size; - void **data; -}; - -void init_fd_mapper(struct fd_mapper *x) -{ - x->size=64; - x->data=(void **)xalloc(x->size*sizeof(void *)); -} - -void exit_fd_mapper(struct fd_mapper *x) -{ - free((char *)x->data); -} - -void fd_mapper_set(struct fd_mapper *x, FD fd, void *data) -{ - while(fd>=x->size) - { - x->size*=2; - x->data=(void **)realloc((char *)x->data, x->size*sizeof(void *)); - if(!x->data) - fatal("Out of memory.\n"); - x->data=nd; - } - x->data[fd]=data; - -} - -void *fd_mapper_get(struct fd_mapper *x, FD fd) -{ - return x->data[fd]; -} -#else -struct fd_mapper_data -{ - FD x; - void *data; -}; -struct fd_mapper -{ - int num; - int hsize; - struct fd_mapper_data *data; -}; - -void init_fd_mapper(struct fd_mapper *x) -{ - int i; - x->num=0; - x->hsize=127; - x->data=(struct fd_mapper_data *)xalloc(x->hsize*sizeof(struct fd_mapper_data)); - for(i=0;i<x->hsize;i++) x->data[i].fd=-1; -} - -void exit_fd_mapper(struct fd_mapper *x) -{ - free((char *)x->data); -} - -void fd_mapper_set(struct fd_mapper *x, FD fd, void *data) -{ - int hval; - x->num++; - if(x->num*2 > x->hsize) - { - struct fd_mapper_data *old=x->data; - int i,old_size=x->hsize; - x->hsize*=3; - x->num=0; - x->data=(struct fd_mapper_data *)xalloc(x->size*sizeof(struct fd_mapper_data *)); - for(i=0;i<x->size;i++) x->data[i].fd=-1; - for(i=0;i<old_size;i++) - if(old[i].fd!=-1) - fd_mapper_set(x, old[i].fd, old[i].data); - } - - hval=fd % x->hsize; - while(x->data[hval].fd != -1) - { - hval++; - if(hval==x->hsize) hval=0; - } - x->data[hval].fd=fd; - x->data[hval].data=data; -} - -void *fd_mapper_get(struct fd_mapper *x, FD fd) -{ - int hval=fd % x->hsize; - while(x->data[hval].fd != fd) - { - hval++; - if(hval==x->hsize) hval=0; - } - return x->data[hval].data; -} -#endif - - -#if 0 -struct fd_data_hash -{ - FD fd; - int key; - struct fd_data_hash *next; - void *data; -}; - -#define FD_DATA_PER_BLOCK 255 - -struct fd_data_hash_block -{ - struct fd_data_hash_block *next; - struct fd_data_hash data[FD_DATA_PER_BLOCk]; -}; - -static int keynum=0; -static unsigned int num_stored_keys=0; -static unsigned int hash_size=0; -static struct fd_data_hash *free_blocks=0; -static struct fd_data_hash **htable=0; -static fd_data_hash_block *hash_blocks=0; - -int get_fd_data_key(void) -{ - return ++keynum; -} - -void store_fd_data(FD fd, int key, void *data) -{ - struct fd_data_hash *p,**last; - unsigned int hval=(fd + key * 53) % hash_size; - - for(last=htable[e];p=*last;last=&p->next) - { - if(p->fd == fd && p->key == key) - { - if(data) - { - p->data=data; - }else{ - *last=p->next; - p->next=free_blocks; - free_blocks=p; - num_stored_keys--; - } - return; - } - } - if(!data) return; - - num_stored_keys++; - - if(num_stored_keys * 2 >= hash_size) - { - /* time to rehash */ - unsigned int h; - unsigned int old_hsize=hash_size; - unsigned fd_data_hash **old_htable=htable; - if(!hash_size) - hash_size=127; - else - hash_size*=3; - - htable=(struct fd_data_hash **)xalloc(hash_size * sizeof(struct fd_data_hash *)); - - for(h=0;h<old_hsize;h++) - { - for(last=old_htable+e;p=*last;last=&p->next) - store_fd_data(p->fd, p->key, p->data); - *last=free_blocks; - free_blocks=old_htable[h]; - } - if(old_htable) - free((char *)old_htable); - } - - - if(!free_blocks) - { - struct fd_data_hash_block *n; - int e; - n=ALLOC_STRUCT(fd_data_hash_block); - n->next=hash_blocks; - hash_blocks=n; - for(e=0;e<FD_DATA_PER_BLOCK;e++) - { - n->data[e].next=free_blocks; - free_blocks=n->data+e; - } - } - - p=free_blocks; - free_blocks=p->next; - p->fd=fd; - p->key=key; - p->data=data; - p->next=htable[hval]; - htable[hval]=p; -} - -void *get_fd_data(FD fd, int key) -{ - struct fd_data_hash *p,**last; - unsigned int hval=(fd + key * 53) % hash_size; - - for(p=htable[hval];p;p=p->next) - if(p->fd == fd && p->key == key) - return p->data; - - return 0; -} - - -#endif - -#ifdef FDLIB_USE_SELECT - -struct fd_waitor -{ - fd_FDSET storage; - fd_FDSET temporary; -static long convert_filetime_to_time_t(FILETIME tmp) -{ - double t; - t=tmp.dwHighDateTime * pow(2.0,32.0) + (double)tmp.dwLowDateTime; - t/=10000000.0; - t-=11644473600.0; - return (long)floor(t); -} - -int fd_fstat(FD fd, struct stat *s) -{ - DWORD x; - int ret; - FILETIME c,a,m; - FDDEBUG(fprintf(stderr,"fstat on %d (%d)\n",fd,da_handle[fd])); - if(fd_type[fd]!=FD_FILE) - { - errno=ENOTSUPP; - return -1; - } - - MEMSET(s, 0, sizeof(struct stat)); - s->st_nlink=1; - - switch(fd_type[fd]) - { - case FD_SOCKET: - s->st_mode=S_IFSOCK; - break; - - default: - switch(GetFileType((HANDLE)da_handle[fd])) - { - default: - case FILE_TYPE_UNKNOWN: s->st_mode=0; break; - case FILE_TYPE_DISK: - s->st_mode=S_IFREG; - s->st_size=GetFileSize((HANDLE)da_handle[fd],&x); - if(x) - { - s->st_size=0x7fffffff; - } - if(!GetFileTime((HANDLE)da_handle[fd], &c, &a, &m)) - { - errno=GetLastError(); - return -1; - } - s->st_ctime=convert_filetime_to_time_t(c); - s->st_atime=convert_filetime_to_time_t(a); - s->st_mtime=convert_filetime_to_time_t(m); - break; - case FILE_TYPE_CHAR: s->st_mode=S_IFCHR; break; - case FILE_TYPE_PIPE: s->st_mode=S_IFFIFO; break; - } - } - s->st_mode |= 0666; - return 0; -} - -int fd_select(int fds, FD_SET *a, FD_SET *b, FD_SET *c, struct timeval *t) -{ - int ret; - ret=select(fds,a,b,c,t); - if(ret==SOCKET_ERROR) - { - errno=WSAGetLastError(); - return -1; - } - return ret; -} - - -int fd_ioctl(FD fd, int cmd, void *data) -{ - int ret; - switch(fd_type[fd]) - { - case FD_SOCKET: - ret=ioctlsocket((SOCKET)da_handle[fd], cmd, data); - if(ret==SOCKET_ERROR) - { - errno=WSAGetLastError(); - return -1; - } - return ret; - - default: - errno=ENOTSUPP; - return -1; - } -} - - -FD fd_dup(FD from) -{ - FD fd; - HANDLE x,p=GetCurrentProcess(); - if(!DuplicateHandle(p,(HANDLE)da_handle[from],p,&x,NULL,0,DUPLICATE_SAME_ACCESS)) - { - errno=GetLastError(); - return -1; - } - - fd=first_free_handle; - first_free_handle=fd_type[fd]; - fd_type[fd]=fd_type[from]; - da_handle[fd]=(long)x; - - FDDEBUG(fprintf(stderr,"Dup %d (%d) to %d (%d)\n",from,da_handle[from],fd,x)); - return fd; -} - -FD fd_dup2(FD from, FD to) -{ - HANDLE x,p=GetCurrentProcess(); - if(!DuplicateHandle(p,(HANDLE)da_handle[from],p,&x,NULL,0,DUPLICATE_SAME_ACCESS)) - { - errno=GetLastError(); - return -1; - } - - if(fd_type[to] < FD_NO_MORE_FREE) - { - if(!CloseHandle((HANDLE)da_handle[to])) - { - errno=GetLastError(); - return -1; - } - }else{ - int *prev,next; - for(prev=&first_free_handle;(next=*prev) != FD_NO_MORE_FREE;prev=fd_type+next) - { - if(next==to) - { - *prev=fd_type[next]; - break; - } - } - } - fd_type[to]=fd_type[from]; - da_handle[to]=(long)x; - - FDDEBUG(fprintf(stderr,"Dup2 %d (%d) to %d (%d)\n",from,da_handle[from],to,x)); - - return to; -} - -#endif - -#if 0 - -#ifdef FD_LINEAR -struct fd_mapper -{ - int size; - void **data; -}; - -void init_fd_mapper(struct fd_mapper *x) -{ - x->size=64; - x->data=(void **)xalloc(x->size*sizeof(void *)); -} - -void exit_fd_mapper(struct fd_mapper *x) -{ - free((char *)x->data); -} - -void fd_mapper_set(struct fd_mapper *x, FD fd, void *data) -{ - while(fd>=x->size) - { - x->size*=2; - x->data=(void **)realloc((char *)x->data, x->size*sizeof(void *)); - if(!x->data) - fatal("Out of memory.\n"); - x->data=nd; - } - x->data[fd]=data; - -} - -void *fd_mapper_get(struct fd_mapper *x, FD fd) -{ - return x->data[fd]; -} -#else -struct fd_mapper_data -{ - FD x; - void *data; -}; -struct fd_mapper -{ - int num; - int hsize; - struct fd_mapper_data *data; -}; - -void init_fd_mapper(struct fd_mapper *x) -{ - int i; - x->num=0; - x->hsize=127; - x->data=(struct fd_mapper_data *)xalloc(x->hsize*sizeof(struct fd_mapper_data)); - for(i=0;i<x->hsize;i++) x->data[i].fd=-1; -} - -void exit_fd_mapper(struct fd_mapper *x) -{ - free((char *)x->data); -} - -void fd_mapper_set(struct fd_mapper *x, FD fd, void *data) -{ - int hval; - x->num++; - if(x->num*2 > x->hsize) - { - struct fd_mapper_data *old=x->data; - int i,old_size=x->hsize; - x->hsize*=3; - x->num=0; - x->data=(struct fd_mapper_data *)xalloc(x->size*sizeof(struct fd_mapper_data *)); - for(i=0;i<x->size;i++) x->data[i].fd=-1; - for(i=0;i<old_size;i++) - if(old[i].fd!=-1) - fd_mapper_set(x, old[i].fd, old[i].data); - } - - hval=fd % x->hsize; - while(x->data[hval].fd != -1) - { - hval++; - if(hval==x->hsize) hval=0; - } - x->data[hval].fd=fd; - x->data[hval].data=data; -} - -void *fd_mapper_get(struct fd_mapper *x, FD fd) -{ - int hval=fd % x->hsize; - while(x->data[hval].fd != fd) - { - hval++; - if(hval==x->hsize) hval=0; - } - return x->data[hval].data; -} -#endif - - -#if 0 -struct fd_data_hash -{ - FD fd; - int key; - struct fd_data_hash *next; - void *data; -}; - -#define FD_DATA_PER_BLOCK 255 - -struct fd_data_hash_block -{ - struct fd_data_hash_block *next; - struct fd_data_hash data[FD_DATA_PER_BLOCk]; -}; - -static int keynum=0; -static unsigned int num_stored_keys=0; -static unsigned int hash_size=0; -static struct fd_data_hash *free_blocks=0; -static struct fd_data_hash **htable=0; -static fd_data_hash_block *hash_blocks=0; - -int get_fd_data_key(void) -{ - return ++keynum; -} - -void store_fd_data(FD fd, int key, void *data) -{ - struct fd_data_hash *p,**last; - unsigned int hval=(fd + key * 53) % hash_size; - - for(last=htable[e];p=*last;last=&p->next) - { - if(p->fd == fd && p->key == key) - { - if(data) - { - p->data=data; - }else{ - *last=p->next; - p->next=free_blocks; - free_blocks=p; - num_stored_keys--; - } - return; - } - } - if(!data) return; - - num_stored_keys++; - - if(num_stored_keys * 2 >= hash_size) - { - /* time to rehash */ - unsigned int h; - unsigned int old_hsize=hash_size; - unsigned fd_data_hash **old_htable=htable; - if(!hash_size) - hash_size=127; - else - hash_size*=3; - - htable=(struct fd_data_hash **)xalloc(hash_size * sizeof(struct fd_data_hash *)); - - for(h=0;h<old_hsize;h++) - { - for(last=old_htable+e;p=*last;last=&p->next) - store_fd_data(p->fd, p->key, p->data); - *last=free_blocks; - free_blocks=old_htable[h]; - } - if(old_htable) - free((char *)old_htable); - } - - - if(!free_blocks) - { - struct fd_data_hash_block *n; - int e; - n=ALLOC_STRUCT(fd_data_hash_block); - n->next=hash_blocks; - hash_blocks=n; - for(e=0;e<FD_DATA_PER_BLOCK;e++) - { - n->data[e].next=free_blocks; - free_blocks=n->data+e; - } - } - - p=free_blocks; - free_blocks=p->next; - p->fd=fd; - p->key=key; - p->data=data; - p->next=htable[hval]; - htable[hval]=p; -} - -void *get_fd_data(FD fd, int key) -{ - struct fd_data_hash *p,**last; - unsigned int hval=(fd + key * 53) % hash_size; - - for(p=htable[hval];p;p=p->next) - if(p->fd == fd && p->key == key) - return p->data; - - return 0; -} - - -#endif - -#ifdef FDLIB_USE_SELECT - -struct fd_waitor -{ - fd_FDSET storage; - fd_FDSET temporary; -static long convert_filetime_to_time_t(FILETIME tmp) -{ - double t; - t=tmp.dwHighDateTime * pow(2.0,32.0) + (double)tmp.dwLowDateTime; - t/=10000000.0; - t-=11644473600.0; - return (long)floor(t); -} - -int fd_fstat(FD fd, struct stat *s) -{ - DWORD x; - int ret; - FILETIME c,a,m; - FDDEBUG(fprintf(stderr,"fstat on %d (%d)\n",fd,da_handle[fd])); - if(fd_type[fd]!=FD_FILE) - { - errno=ENOTSUPP; - return -1; - } - - MEMSET(s, 0, sizeof(struct stat)); - s->st_nlink=1; - - switch(fd_type[fd]) - { - case FD_SOCKET: - s->st_mode=S_IFSOCK; - break; - - default: - switch(GetFileType((HANDLE)da_handle[fd])) - { - default: - case FILE_TYPE_UNKNOWN: s->st_mode=0; break; - case FILE_TYPE_DISK: - s->st_mode=S_IFREG; - s->st_size=GetFileSize((HANDLE)da_handle[fd],&x); - if(x) - { - s->st_size=0x7fffffff; - } - if(!GetFileTime((HANDLE)da_handle[fd], &c, &a, &m)) - { - errno=GetLastError(); - return -1; - } - s->st_ctime=convert_filetime_to_time_t(c); - s->st_atime=convert_filetime_to_time_t(a); - s->st_mtime=convert_filetime_to_time_t(m); - break; - case FILE_TYPE_CHAR: s->st_mode=S_IFCHR; break; - case FILE_TYPE_PIPE: s->st_mode=S_IFFIFO; break; - } - } - s->st_mode |= 0666; - return 0; -} - -int fd_select(int fds, FD_SET *a, FD_SET *b, FD_SET *c, struct timeval *t) -{ - int ret; - ret=select(fds,a,b,c,t); - if(ret==SOCKET_ERROR) - { - errno=WSAGetLastError(); - return -1; - } - return ret; -} - - -int fd_ioctl(FD fd, int cmd, void *data) -{ - int ret; - switch(fd_type[fd]) - { - case FD_SOCKET: - ret=ioctlsocket((SOCKET)da_handle[fd], cmd, data); - if(ret==SOCKET_ERROR) - { - errno=WSAGetLastError(); - return -1; - } - return ret; - - default: - errno=ENOTSUPP; - return -1; - } -} - - -FD fd_dup(FD from) -{ - FD fd; - HANDLE x,p=GetCurrentProcess(); - if(!DuplicateHandle(p,(HANDLE)da_handle[from],p,&x,NULL,0,DUPLICATE_SAME_ACCESS)) - { - errno=GetLastError(); - return -1; - } - - fd=first_free_handle; - first_free_handle=fd_type[fd]; - fd_type[fd]=fd_type[from]; - da_handle[fd]=(long)x; - - FDDEBUG(fprintf(stderr,"Dup %d (%d) to %d (%d)\n",from,da_handle[from],fd,x)); - return fd; -} - -FD fd_dup2(FD from, FD to) -{ - HANDLE x,p=GetCurrentProcess(); - if(!DuplicateHandle(p,(HANDLE)da_handle[from],p,&x,NULL,0,DUPLICATE_SAME_ACCESS)) - { - errno=GetLastError(); - return -1; - } - - if(fd_type[to] < FD_NO_MORE_FREE) - { - if(!CloseHandle((HANDLE)da_handle[to])) - { - errno=GetLastError(); - return -1; - } - }else{ - int *prev,next; - for(prev=&first_free_handle;(next=*prev) != FD_NO_MORE_FREE;prev=fd_type+next) - { - if(next==to) - { - *prev=fd_type[next]; - break; - } - } - } - fd_type[to]=fd_type[from]; - da_handle[to]=(long)x; - - FDDEBUG(fprintf(stderr,"Dup2 %d (%d) to %d (%d)\n",from,da_handle[from],to,x)); - - return to; -} - -#endif - -#if 0 - -#ifdef FD_LINEAR -struct fd_mapper -{ - int size; - void **data; -}; - -void init_fd_mapper(struct fd_mapper *x) -{ - x->size=64; - x->data=(void **)xalloc(x->size*sizeof(void *)); -} - -void exit_fd_mapper(struct fd_mapper *x) -{ - free((char *)x->data); -} - -void fd_mapper_set(struct fd_mapper *x, FD fd, void *data) -{ - while(fd>=x->size) - { - x->size*=2; - x->data=(void **)realloc((char *)x->data, x->size*sizeof(void *)); - if(!x->data) - fatal("Out of memory.\n"); - x->data=nd; - } - x->data[fd]=data; - -} - -void *fd_mapper_get(struct fd_mapper *x, FD fd) -{ - return x->data[fd]; -} -#else -struct fd_mapper_data -{ - FD x; - void *data; -}; -struct fd_mapper -{ - int num; - int hsize; - struct fd_mapper_data *data; -}; - -void init_fd_mapper(struct fd_mapper *x) -{ - int i; - x->num=0; - x->hsize=127; - x->data=(struct fd_mapper_data *)xalloc(x->hsize*sizeof(struct fd_mapper_data)); - for(i=0;i<x->hsize;i++) x->data[i].fd=-1; -} - -void exit_fd_mapper(struct fd_mapper *x) -{ - free((char *)x->data); -} - -void fd_mapper_set(struct fd_mapper *x, FD fd, void *data) -{ - int hval; - x->num++; - if(x->num*2 > x->hsize) - { - struct fd_mapper_data *old=x->data; - int i,old_size=x->hsize; - x->hsize*=3; - x->num=0; - x->data=(struct fd_mapper_data *)xalloc(x->size*sizeof(struct fd_mapper_data *)); - for(i=0;i<x->size;i++) x->data[i].fd=-1; - for(i=0;i<old_size;i++) - if(old[i].fd!=-1) - fd_mapper_set(x, old[i].fd, old[i].data); - } - - hval=fd % x->hsize; - while(x->data[hval].fd != -1) - { - hval++; - if(hval==x->hsize) hval=0; - } - x->data[hval].fd=fd; - x->data[hval].data=data; -} - -void *fd_mapper_get(struct fd_mapper *x, FD fd) -{ - int hval=fd % x->hsize; - while(x->data[hval].fd != fd) - { - hval++; - if(hval==x->hsize) hval=0; - } - return x->data[hval].data; -} -#endif - - -#if 0 struct fd_data_hash { FD fd; @@ -1809,8 +677,6 @@ void *get_fd_data(FD fd, int key) } -#endif - #define FD_EVENT_READ 1 #define FD_EVENT_WRITE 2 #define FD_EVENT_OOB 4 @@ -1915,7 +781,7 @@ int fd_waitor_idle(fd_waitor *x, return 0; } -#endif +#endif /* FDLIB_USE_SELECT */ #ifdef FDLIB_USE_WAITFORMULTIPLEOBJECTS @@ -1990,6 +856,6 @@ FD fd_waitor_idle(fd_waitor *x, struct timeval delay) } } -#endif +#endif /* FDLIB_USE_WAITFORMULTIPLEOBJECTS */ -#endif +#endif /* 0 */