diff --git a/src/fdlib.c b/src/fdlib.c
index d958ba98a546062a67cf7e87e592635b3c00bde8..a6f5fadba48a442f4baed7fff675fbdf02f7f483 100644
--- a/src/fdlib.c
+++ b/src/fdlib.c
@@ -421,7 +421,7 @@ FD fd_dup(FD from)
   return fd;
 }
 
-FD fd_dup2(FD to, FD from)
+FD fd_dup2(FD from, FD to)
 {
   HANDLE x,p=GetCurrentProcess();
   if(!DuplicateHandle(p,(HANDLE)da_handle[from],p,&x,NULL,1,DUPLICATE_SAME_ACCESS))
@@ -457,3 +457,195 @@ FD fd_dup2(FD to, FD from)
 }
 
 #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
+
+
+#ifdef FDLIB_USE_SELECT
+
+struct fd_waitor
+{
+  fd_FDSET storage;
+  fd_FDSET temporary;
+  FD last;
+  int numleft;
+  int max;
+};
+
+#define init_waitor(X) do { (X)->numleft=0; (X)->max=0; fd_FDZERO(&X->storage); } while(0)
+
+void fd_waitor_add_customer(fd_waitor *x, FD customer)
+{
+  fd_FD_SET(& x->storage, customer);
+  if(customer>x->max) x->max=customer;
+}
+
+void fd_waitor_remove_customer(fd_waitor *x, FD customer)
+{
+  fd_FD_CLR(& x->storage, customer);
+  if(customer == x->max)
+  {
+    x->max--;
+    while(!fd_ISSET(& x->storage), x->max) x->max--;
+  }
+}
+
+FD fd_waitor_idle(fd_waitor *x)
+{
+  int tmp;
+  if(!x->numleft)
+  {
+    x->temporary=x->storage;
+    tmp=select(x->max, & x->temporary, 0, 0, 0);
+    if(tmp<0) return -1;
+
+    x->last=0;
+    x->numleft=tmp;
+  }
+  while(x->numleft)
+  {
+    while(x->last<x->max)
+    {
+      if(fd_FD_ISSET(& x->temporary, x->last))
+      {
+	numleft--;
+	return 1;
+      }
+    }
+  }
+}
+
+#endif
+
+#ifdef FDLIB_USE_WAITFORMULTIPLEOBJECTSEX
+
+#define FD_MAX 16384
+
+struct fd_waitor
+{
+  int occupied;
+  HANDLE customers[FD_MAX];
+  FD pos_to_fd[FD_MAX];
+};
+
+void fd_waitor_add_customer(fd_waitor *x, FD customer)
+{
+  HANDLE h=CreateEvent();
+  customers[x->occupied]=h;
+  pos_to_fd[x->occupied]=customer;
+  x->occupied++;
+}
+
+void fd_waitor_remove_customer(fd_waitor *x, FD customer)
+{
+  CloseHandle(customers[x]);
+  
+  customers[x]=
+  pos_to_fd[x
+}
+
+#endif
+
+#endif
diff --git a/src/fdlib.h b/src/fdlib.h
index be123d7369b335fbea2655ccb9153284630d5d2c..49a69b569b2151c77b3cbdeab5b4433daad67d0d 100644
--- a/src/fdlib.h
+++ b/src/fdlib.h
@@ -56,13 +56,13 @@ SOCKFUN1(shutdown, int)
 SOCKFUN1(listen, int)
 int fd_close(FD fd);
 long fd_write(FD fd, void *buf, long len);
-long fd_read(FD fd, void *buf, long len);
+long fd_read(FD fd, void *to, long len);
 long fd_lseek(FD fd, long pos, int where);
 int fd_fstat(FD fd, struct stat *s);
 int fd_select(int fds, FD_SET *a, FD_SET *b, FD_SET *c, struct timeval *t);
 int fd_ioctl(FD fd, int cmd, void *data);
-FD fd_dup(FD fd);
-FD fd_dup2(FD to, FD from);
+FD fd_dup(FD from);
+FD fd_dup2(FD from, FD to);
 /* Prototypes end here */
 
 #undef SOCKFUN1
@@ -123,7 +123,7 @@ typedef int FD;
 #define fd_RDWR O_RDWR
 #define fd_APPEND O_APPEND
 #define fd_CREAT O_CREAT
-#define fd_TRUNC O_TRUC
+#define fd_TRUNC O_TRUNC
 #define fd_EXCL O_EXCL
 
 #define fd_open open