]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - hunt/huntd/ctl_transact.c
1 /* $NetBSD: ctl_transact.c,v 1.5 2002/09/20 20:54:16 mycroft Exp $ */
3 * Copyright (c) 1983 Regents of the University of California.
4 * All rights reserved. The Berkeley software License Agreement
5 * specifies the terms and conditions for redistribution.
10 #if defined(TALK_43) || defined(TALK_42)
12 #include <sys/cdefs.h>
15 static char sccsid
[] = "@(#)ctl_transact.c 5.2 (Berkeley) 3/13/86";
17 __RCSID("$NetBSD: ctl_transact.c,v 1.5 2002/09/20 20:54:16 mycroft Exp $");
26 #define CTL_WAIT 2 /* time to wait for a response, in seconds */
30 * SOCKDGRAM is unreliable, so we must repeat messages if we have
31 * not received an acknowledgement within a reasonable amount
35 ctl_transact(target
, msg
, type
, rp
)
36 struct in_addr target
;
42 int nready
, cc
, retries
;
46 daemon_addr
.sin_addr
= target
;
47 daemon_addr
.sin_port
= daemon_port
;
48 set
[0].fd
= ctl_sockt
;
49 set
[0].events
= POLLIN
;
52 * Keep sending the message until a response of
53 * the proper type is obtained.
56 /* resend message until a response is obtained */
57 for (retries
= MAX_RETRY
; retries
> 0; retries
-= 1) {
58 cc
= sendto(ctl_sockt
, (char *)&msg
, sizeof (msg
), 0,
59 (struct sockaddr
*)&daemon_addr
, sizeof (daemon_addr
));
60 if (cc
!= sizeof (msg
)) {
63 p_error("Error on write to talk daemon");
65 nready
= poll(set
, 1, CTL_WAIT
* 1000);
69 p_error("Error waiting for daemon response");
77 * Keep reading while there are queued messages
78 * (this is not necessary, it just saves extra
79 * request/acknowledgements being sent)
82 cc
= recv(ctl_sockt
, (char *)rp
, sizeof (*rp
), 0);
86 p_error("Error on read from talk daemon");
88 /* an immediate poll */
89 nready
= poll(set
, 1, 0);
90 } while (nready
> 0 && (
92 rp
->vers
!= TALK_VERSION
||
97 rp
->vers
!= TALK_VERSION
||
100 rp
->id_num
= ntohl(rp
->id_num
);
102 rp
->addr
.sa_family
= ntohs(rp
->addr
.sa_family
);
104 rp
->addr
.sin_family
= ntohs(rp
->addr
.sin_family
);