Converted the timeout list to use the standard list functions.

diff --git a/server/fd.c b/server/fd.c
index 04e8df8..a40dc6e 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -173,21 +173,19 @@
 
 struct timeout_user
 {
-    struct timeout_user  *next;       /* next in sorted timeout list */
-    struct timeout_user  *prev;       /* prev in sorted timeout list */
+    struct list           entry;      /* entry in sorted timeout list */
     struct timeval        when;       /* timeout expiry (absolute time) */
     timeout_callback      callback;   /* callback function */
     void                 *private;    /* callback private data */
 };
 
-static struct timeout_user *timeout_head;   /* sorted timeouts list head */
-static struct timeout_user *timeout_tail;   /* sorted timeouts list tail */
+static struct list timeout_list = LIST_INIT(timeout_list);   /* sorted timeouts list */
 
 /* add a timeout user */
 struct timeout_user *add_timeout_user( struct timeval *when, timeout_callback func, void *private )
 {
     struct timeout_user *user;
-    struct timeout_user *pos;
+    struct list *ptr;
 
     if (!(user = mem_alloc( sizeof(*user) ))) return NULL;
     user->when     = *when;
@@ -196,34 +194,19 @@
 
     /* Now insert it in the linked list */
 
-    for (pos = timeout_head; pos; pos = pos->next)
-        if (!time_before( &pos->when, when )) break;
-
-    if (pos)  /* insert it before 'pos' */
+    LIST_FOR_EACH( ptr, &timeout_list )
     {
-        if ((user->prev = pos->prev)) user->prev->next = user;
-        else timeout_head = user;
-        user->next = pos;
-        pos->prev = user;
+        struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
+        if (!time_before( &timeout->when, when )) break;
     }
-    else  /* insert it at the tail */
-    {
-        user->next = NULL;
-        if (timeout_tail) timeout_tail->next = user;
-        else timeout_head = user;
-        user->prev = timeout_tail;
-        timeout_tail = user;
-    }
+    list_add_before( ptr, &user->entry );
     return user;
 }
 
 /* remove a timeout user */
 void remove_timeout_user( struct timeout_user *user )
 {
-    if (user->next) user->next->prev = user->prev;
-    else timeout_tail = user->prev;
-    if (user->prev) user->prev->next = user->next;
-    else timeout_head = user->next;
+    list_remove( &user->entry );
     free( user );
 }
 
@@ -314,44 +297,44 @@
     while (active_users)
     {
         long diff = -1;
-        if (timeout_head)
+        if (!list_empty( &timeout_list ))
         {
-            struct timeout_user *first = timeout_head;
+            struct list expired_list, *ptr;
             struct timeval now;
             gettimeofday( &now, NULL );
 
             /* first remove all expired timers from the list */
 
-            while (timeout_head && !time_before( &now, &timeout_head->when ))
-                timeout_head = timeout_head->next;
-
-            if (timeout_head)
+            list_init( &expired_list );
+            while ((ptr = list_head( &timeout_list )) != NULL)
             {
-                if (timeout_head->prev)
+                struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
+
+                if (!time_before( &now, &timeout->when ))
                 {
-                    timeout_head->prev->next = NULL;
-                    timeout_head->prev = NULL;
+                    list_remove( &timeout->entry );
+                    list_add_tail( &expired_list, &timeout->entry );
                 }
-                else first = NULL;  /* no timer removed */
+                else break;
             }
-            else timeout_tail = NULL;  /* all timers removed */
 
             /* now call the callback for all the removed timers */
 
-            while (first)
+            while ((ptr = list_head( &expired_list )) != NULL)
             {
-                struct timeout_user *next = first->next;
-                first->callback( first->private );
-                free( first );
-                first = next;
+                struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
+                list_remove( &timeout->entry );
+                timeout->callback( timeout->private );
+                free( timeout );
             }
 
             if (!active_users) break;  /* last user removed by a timeout */
 
-            if (timeout_head)
+            if ((ptr = list_head( &timeout_list )) != NULL)
             {
-                diff = (timeout_head->when.tv_sec - now.tv_sec) * 1000
-                     + (timeout_head->when.tv_usec - now.tv_usec) / 1000;
+                struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
+                diff = (timeout->when.tv_sec - now.tv_sec) * 1000
+                     + (timeout->when.tv_usec - now.tv_usec) / 1000;
                 if (diff < 0) diff = 0;
             }
         }