1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
/* This file is part of the Project Athena Zephyr Notification System.
* It contains source for the ZIfNotice function.
*
* Created by: Robert French
*
* $Id$
*
* 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$";
#endif
Code_t
ZIfNotice(ZNotice_t *notice,
struct sockaddr_in *from,
int (*predicate)(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 */
}
}
|