- created server object for handling async i/o
- implemented WaitCommEvent with the EV_RXCHAR flag
- implemented GetOverlappedResult

diff --git a/server/serial.c b/server/serial.c
index d102233..c549bec 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -182,6 +182,77 @@
     return 1;
 }
 
+/* these functions are for interaction with asynchronous i/o objects */
+int serial_async_setup(struct object *obj, struct async *ov)
+{
+    struct serial *serial = (struct serial *)obj;
+    int timeout;
+
+    if(obj->ops != &serial_ops)
+        return 0;
+
+    switch(async_type(ov))
+    {
+    case ASYNC_TYPE_READ:
+        timeout = serial->readconst + serial->readmult*async_count(ov);
+        async_add_timeout(ov, timeout);
+        async_set_eventmask(ov,EV_RXCHAR);
+        break;
+    case ASYNC_TYPE_WRITE:
+        timeout = serial->writeconst + serial->writemult*async_count(ov);
+        async_add_timeout(ov, timeout);
+        async_set_eventmask(ov,EV_TXEMPTY);
+        break;
+    case ASYNC_TYPE_WAIT:
+        async_set_eventmask(ov,serial->eventmask);
+        break;
+    }
+
+    return 1;
+}
+
+int serial_async_get_poll_events( struct async *ov )
+{
+    int events=0,mask;
+
+    switch(async_type(ov))
+    {
+    case ASYNC_TYPE_READ:
+        events |= POLLIN;
+        break;
+    case ASYNC_TYPE_WRITE:
+        events |= POLLOUT;
+        break;
+    case ASYNC_TYPE_WAIT:
+    /* 
+     * FIXME: here is the spot to implement other WaitCommEvent flags
+     */
+        mask = async_get_eventmask(ov);
+        if(mask&EV_RXCHAR)
+            events |= POLLIN;
+        if(mask&EV_TXEMPTY)
+            events |= POLLOUT;
+        break;
+    }
+    return events;
+}
+
+/* receive a select event, and output a windows event */
+int serial_async_poll_event(struct object *obj, int event)
+{
+    int r=0;
+
+    /* 
+     * FIXME: here is the spot to implement other WaitCommEvent flags
+     */
+    if(event & POLLIN)
+        r |= EV_RXCHAR;
+    if(event & POLLOUT)
+        r |= EV_TXEMPTY;
+
+    return r;
+}
+
 /* create a serial */
 DECL_HANDLER(create_serial)
 {