]> asedeno.scripts.mit.edu Git - 1ts-debian.git/blobdiff - zephyr/lib/ZIfNotice.c
upstream tag
[1ts-debian.git] / zephyr / lib / ZIfNotice.c
diff --git a/zephyr/lib/ZIfNotice.c b/zephyr/lib/ZIfNotice.c
new file mode 100644 (file)
index 0000000..19aabe9
--- /dev/null
@@ -0,0 +1,62 @@
+/* This file is part of the Project Athena Zephyr Notification System.
+ * It contains source for the ZIfNotice function.
+ *
+ *     Created by:     Robert French
+ *
+ *     $Id: ZIfNotice.c,v 1.15 1999/01/22 23:19:13 ghudson Exp $
+ *
+ *     Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
+ *     For copying and distribution information, see the file
+ *     "mit-copyright.h". 
+ */
+
+#include <internal.h>
+
+#ifndef lint
+static const char rcsid_ZIfNotice_c[] = "$Id: ZIfNotice.c,v 1.15 1999/01/22 23:19:13 ghudson Exp $";
+#endif
+
+Code_t ZIfNotice(notice, from, predicate, args)
+    ZNotice_t *notice;
+    struct sockaddr_in *from;
+    int (*predicate) __P((ZNotice_t *, void *));
+    void *args;
+{
+    ZNotice_t tmpnotice;
+    Code_t retval;
+    char *buffer;
+    struct _Z_InputQ *qptr;
+
+    if ((retval = Z_WaitForComplete()) != ZERR_NONE)
+       return (retval);
+       
+    qptr = Z_GetFirstComplete();
+    
+    for (;;) {
+       while (qptr) {
+           if ((retval = ZParseNotice(qptr->packet, qptr->packet_len, 
+                                      &tmpnotice)) != ZERR_NONE)
+               return (retval);
+           if ((*predicate)(&tmpnotice, args)) {
+               if (!(buffer = (char *) malloc((unsigned) qptr->packet_len)))
+                   return (ENOMEM);
+               (void) memcpy(buffer, qptr->packet, qptr->packet_len);
+               if (from)
+                   *from = qptr->from;
+               if ((retval = ZParseNotice(buffer, qptr->packet_len, 
+                                          notice)) != ZERR_NONE) {
+                   free(buffer);
+                   return (retval);
+               }
+               Z_RemQueue(qptr);
+               return (ZERR_NONE);
+           }
+           qptr = Z_GetNextComplete(qptr);
+       }
+       if ((retval = Z_ReadWait()) != ZERR_NONE)
+           return (retval);
+       qptr = Z_GetFirstComplete();    /* need to look over all of
+                                          the queued messages, in case
+                                          a fragment has been reassembled */
+    }
+}