1700
|
1 /* This file is part of the Project Athena Zephyr Notification System.
|
|
2 * It contains source for the ZSendPacket function.
|
|
3 *
|
|
4 * Created by: Robert French
|
|
5 *
|
|
6 * $Source$
|
|
7 * $Author: warmenhoven $
|
|
8 *
|
|
9 * Copyright (c) 1987,1991 by the Massachusetts Institute of Technology.
|
|
10 * For copying and distribution information, see the file
|
|
11 * "mit-copyright.h".
|
|
12 */
|
|
13 /* $Header$ */
|
|
14
|
|
15 #ifndef lint
|
|
16 static char rcsid_ZSendPacket_c[] =
|
|
17 "$Zephyr: /mit/zephyr/src/lib/RCS/ZSendPacket.c,v 1.29 91/03/21 11:57:08 raeburn Exp $";
|
|
18 #endif
|
|
19
|
|
20 #include <internal.h>
|
|
21 #include <sys/socket.h>
|
|
22
|
|
23 static int wait_for_ack();
|
|
24
|
|
25 Code_t ZSendPacket(packet, len, waitforack)
|
|
26 char *packet;
|
|
27 int len;
|
|
28 int waitforack;
|
|
29 {
|
|
30 Code_t retval;
|
|
31 struct sockaddr_in dest;
|
|
32 ZNotice_t notice, acknotice;
|
|
33
|
|
34 if (!packet || len < 0)
|
|
35 return (ZERR_ILLVAL);
|
|
36
|
|
37 if (len > Z_MAXPKTLEN)
|
|
38 return (ZERR_PKTLEN);
|
|
39
|
|
40 if (ZGetFD() < 0)
|
|
41 if ((retval = ZOpenPort((u_short *)0)) != ZERR_NONE)
|
|
42 return (retval);
|
|
43
|
|
44 dest = ZGetDestAddr();
|
|
45
|
|
46 if (sendto(ZGetFD(), packet, len, 0, (struct sockaddr *)&dest,
|
|
47 sizeof(dest)) < 0)
|
|
48 return (errno);
|
|
49
|
|
50 if (!waitforack)
|
|
51 return (ZERR_NONE);
|
|
52
|
|
53 if ((retval = ZParseNotice(packet, len, ¬ice)) != ZERR_NONE)
|
|
54 return (retval);
|
|
55
|
|
56 retval = Z_WaitForNotice (&acknotice, wait_for_ack, ¬ice.z_uid,
|
|
57 HM_TIMEOUT);
|
|
58 if (retval == ETIMEDOUT)
|
|
59 return ZERR_HMDEAD;
|
|
60 if (retval == ZERR_NONE)
|
|
61 ZFreeNotice (&acknotice);
|
|
62 return retval;
|
|
63 }
|
|
64
|
|
65 static int wait_for_ack(notice, uid)
|
|
66 ZNotice_t *notice;
|
|
67 ZUnique_Id_t *uid;
|
|
68 {
|
|
69 return (ZCompareUID(¬ice->z_uid, uid) &&
|
|
70 (notice->z_kind == HMACK ||
|
|
71 notice->z_kind == SERVACK ||
|
|
72 notice->z_kind == CLIENTACK ));
|
|
73 }
|