Added code to receive close
[yaz-moved-to-github.git] / server / eventl.c
index 2d9886b..8eb2958 100644 (file)
@@ -1,10 +1,31 @@
 /*
- * Copyright (C) 1994, Index Data I/S 
- * All rights reserved.
+ * Copyright (c) 1995, Index Data
+ * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: eventl.c,v $
- * Revision 1.6  1995-03-27 08:34:21  quinn
+ * Revision 1.13  1995-08-29 11:17:56  quinn
+ * Added code to receive close
+ *
+ * Revision 1.12  1995/08/29  10:41:18  quinn
+ * Small.
+ *
+ * Revision 1.11  1995/06/19  12:39:09  quinn
+ * Fixed bug in timeout code. Added BER dumper.
+ *
+ * Revision 1.10  1995/06/16  10:31:33  quinn
+ * Added session timeout.
+ *
+ * Revision 1.9  1995/06/05  10:53:31  quinn
+ * Added a better SCAN.
+ *
+ * Revision 1.8  1995/05/16  08:51:01  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.7  1995/03/27  15:02:01  quinn
+ * Added some includes for better portability
+ *
+ * Revision 1.6  1995/03/27  08:34:21  quinn
  * Added dynamic server functionality.
  * Released bindings to session.c (is now redundant)
  *
 #include <sys/types.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#ifdef _AIX
+#include <sys/select.h>
+#endif
 
 #include <eventl.h>
 
@@ -54,6 +80,7 @@ IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags)
     new->fun = cb;
     new->next = iochans;
     new->force_event = 0;
+    new->last_event = new->max_idle = 0;
     iochans = new;
     return new;
 }
@@ -65,18 +92,20 @@ int event_loop()
        IOCHAN p, nextp;
        fd_set in, out, except;
        int res, max;
-       static struct timeval nullto = {0, 0};
+       static struct timeval nullto = {0, 0}, to;
        struct timeval *timeout;
 
        FD_ZERO(&in);
        FD_ZERO(&out);
        FD_ZERO(&except);
-       timeout = 0; /* hang on select */
+       timeout = &to; /* hang on select */
+       to.tv_sec = 10/*5*60*/;
+       to.tv_usec = 0;
        max = 0;
        for (p = iochans; p; p = p->next)
        {
            if (p->force_event)
-               timeout = &nullto;
+               timeout = &nullto;        /* polling select */
            if (p->flags & EVENT_INPUT)
                FD_SET(p->fd, &in);
            if (p->flags & EVENT_OUTPUT)
@@ -95,16 +124,32 @@ int event_loop()
        for (p = iochans; p; p = p->next)
        {
            int force_event = p->force_event;
+           time_t now = time(0);
 
            p->force_event = 0;
            if (FD_ISSET(p->fd, &in) || force_event == EVENT_INPUT)
+           {
+               p->last_event = now;
                (*p->fun)(p, EVENT_INPUT);
+           }
            if (!p->destroyed && (FD_ISSET(p->fd, &out) ||
-                force_event == EVENT_OUTPUT))
+               force_event == EVENT_OUTPUT))
+           {
+               p->last_event = now;
                (*p->fun)(p, EVENT_OUTPUT);
+           }
            if (!p->destroyed && (FD_ISSET(p->fd, &except) ||
                force_event == EVENT_EXCEPT))
+           {
+               p->last_event = now;
                (*p->fun)(p, EVENT_EXCEPT);
+           }
+           if (!p->destroyed && p->max_idle && now - p->last_event >
+               p->max_idle)
+           {
+               p->last_event = now;
+               (*p->fun)(p, EVENT_TIMEOUT);
+           }
        }
        for (p = iochans; p; p = nextp)
        {
@@ -121,7 +166,7 @@ int event_loop()
                    for (pr = iochans; pr; pr = pr->next)
                        if (pr->next == p)
                            break;
-                   assert(pr);
+                   assert(pr); /* grave error if it weren't there */
                    pr->next = p->next;
                }
                if (nextp == p)