source: trunk/third/talk/talk/ctl_transact.c @ 10543

Revision 10543, 4.0 KB checked in by ghudson, 27 years ago (diff)
Remove sa_ in oldsockaddr field names to avoid conflict with IRIX 6.3 macros.
Line 
1/*      $NetBSD: ctl_transact.c,v 1.3 1994/12/09 02:14:12 jtc Exp $     */
2
3/*
4 * Copyright (c) 1983, 1993
5 *      The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *      This product includes software developed by the University of
18 *      California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 *    may be used to endorse or promote products derived from this software
21 *    without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36#ifndef lint
37#if 0
38static char sccsid[] = "@(#)ctl_transact.c      8.1 (Berkeley) 6/6/93";
39#endif
40static char rcsid[] = "$NetBSD: ctl_transact.c,v 1.3 1994/12/09 02:14:12 jtc Exp $";
41#endif /* not lint */
42
43#include <sys/types.h>
44#include <sys/socket.h>
45#include <sys/time.h>
46#include <netinet/in.h>
47#include <protocols/talkd.h>
48#include <errno.h>
49#include "talk_ctl.h"
50
51#define CTL_WAIT 2      /* time to wait for a response, in seconds */
52
53/*
54 * SOCKDGRAM is unreliable, so we must repeat messages if we have
55 * not recieved an acknowledgement within a reasonable amount
56 * of time
57 */
58ctl_transact(target, msg, type, rp)
59        struct in_addr target;
60        CTL_MSG msg;
61        int type;
62        CTL_RESPONSE *rp;
63{
64        int read_mask, ctl_mask, nready, cc;
65        struct timeval wait;
66
67        msg.type = type;
68        daemon_addr.sin_family = AF_INET;
69        daemon_addr.sin_addr = target;
70        daemon_addr.sin_port = daemon_port;
71        ctl_mask = 1 << ctl_sockt;
72
73        /*
74         * Keep sending the message until a response of
75         * the proper type is obtained.
76         */
77        do {
78                wait.tv_sec = CTL_WAIT;
79                wait.tv_usec = 0;
80                /* resend message until a response is obtained */
81                do {
82                        cc = sendto(ctl_sockt, (char *)&msg, sizeof (msg), 0,
83                            (struct sockaddr *)&daemon_addr,
84                            sizeof (daemon_addr));
85                        if (cc != sizeof (msg)) {
86                                if (errno == EINTR)
87                                        continue;
88                                p_error("Error on write to talk daemon");
89                        }
90                        read_mask = ctl_mask;
91                        nready = select(32, &read_mask, 0, 0, &wait);
92                        if (nready < 0) {
93                                if (errno == EINTR)
94                                        continue;
95                                p_error("Error waiting for daemon response");
96                        }
97                } while (nready == 0);
98                /*
99                 * Keep reading while there are queued messages
100                 * (this is not necessary, it just saves extra
101                 * request/acknowledgements being sent)
102                 */
103                do {
104                        cc = recv(ctl_sockt, (char *)rp, sizeof (*rp), 0);
105                        if (cc < 0) {
106                                if (errno == EINTR)
107                                        continue;
108                                p_error("Error on read from talk daemon");
109                        }
110                        read_mask = ctl_mask;
111                        /* an immediate poll */
112                        timerclear(&wait);
113                        nready = select(32, &read_mask, 0, 0, &wait);
114                } while (nready > 0 && (rp->vers != TALK_VERSION ||
115                    rp->type != type));
116        } while (rp->vers != TALK_VERSION || rp->type != type);
117        rp->id_num = ntohl(rp->id_num);
118        rp->addr.family = ntohs(rp->addr.family);
119}
Note: See TracBrowser for help on using the repository browser.