Annotation of src/usr.bin/talk/ctl_transact.c, Revision 1.13
1.13 ! mestre 1: /* $OpenBSD: ctl_transact.c,v 1.12 2010/08/12 23:31:29 tedu Exp $ */
1.1 deraadt 2: /* $NetBSD: ctl_transact.c,v 1.3 1994/12/09 02:14:12 jtc Exp $ */
3:
4: /*
5: * Copyright (c) 1983, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
1.8 millert 16: * 3. Neither the name of the University nor the names of its contributors
1.1 deraadt 17: * may be used to endorse or promote products derived from this software
18: * without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30: * SUCH DAMAGE.
31: */
32:
1.13 ! mestre 33: #include <sys/socket.h>
! 34: #include <netinet/in.h>
! 35:
1.1 deraadt 36: #include <errno.h>
1.9 deraadt 37: #include <poll.h>
1.13 ! mestre 38:
! 39: #include "talk.h"
1.1 deraadt 40: #include "talk_ctl.h"
41:
42: #define CTL_WAIT 2 /* time to wait for a response, in seconds */
43:
44: /*
45: * SOCKDGRAM is unreliable, so we must repeat messages if we have
1.4 pjanzen 46: * not received an acknowledgement within a reasonable amount
1.1 deraadt 47: * of time
48: */
1.4 pjanzen 49: void
1.12 tedu 50: ctl_transact(struct in_addr target, CTL_MSG msg, int type, CTL_RESPONSE *rp)
1.1 deraadt 51: {
1.9 deraadt 52: struct pollfd pfd[1];
1.4 pjanzen 53: int nready, cc;
1.1 deraadt 54:
55: msg.type = type;
56: daemon_addr.sin_addr = target;
57: daemon_addr.sin_port = daemon_port;
1.9 deraadt 58: pfd[0].fd = ctl_sockt;
59: pfd[0].events = POLLIN;
1.1 deraadt 60:
61: /*
62: * Keep sending the message until a response of
63: * the proper type is obtained.
64: */
65: do {
66: /* resend message until a response is obtained */
67: do {
68: cc = sendto(ctl_sockt, (char *)&msg, sizeof (msg), 0,
69: (struct sockaddr *)&daemon_addr,
70: sizeof (daemon_addr));
71: if (cc != sizeof (msg)) {
72: if (errno == EINTR)
73: continue;
1.6 millert 74: quit("Error on write to talk daemon", 1);
1.1 deraadt 75: }
1.9 deraadt 76: nready = poll(pfd, 1, CTL_WAIT * 1000);
1.1 deraadt 77: if (nready < 0) {
78: if (errno == EINTR)
79: continue;
1.6 millert 80: quit("Error waiting for daemon response", 1);
1.1 deraadt 81: }
82: } while (nready == 0);
83: /*
1.5 millert 84: * Keep reading while there are queued messages
1.1 deraadt 85: * (this is not necessary, it just saves extra
86: * request/acknowledgements being sent)
87: */
88: do {
89: cc = recv(ctl_sockt, (char *)rp, sizeof (*rp), 0);
90: if (cc < 0) {
91: if (errno == EINTR)
92: continue;
1.6 millert 93: quit("Error on read from talk daemon", 1);
1.1 deraadt 94: }
1.9 deraadt 95: nready = poll(pfd, 1, 0);
1.1 deraadt 96: } while (nready > 0 && (rp->vers != TALK_VERSION ||
97: rp->type != type));
98: } while (rp->vers != TALK_VERSION || rp->type != type);
99: rp->id_num = ntohl(rp->id_num);
100: }