Added code to receive close
[yaz-moved-to-github.git] / server / eventl.c
index 42dd1f9..8eb2958 100644 (file)
@@ -4,7 +4,19 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: eventl.c,v $
- * Revision 1.9  1995-06-05 10:53:31  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
@@ -68,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;
 }
@@ -79,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)
@@ -109,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)
        {
@@ -135,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)