|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)look_up.c 5.4 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include "talk_ctl.h"
23:
24: /*
25: * See if the local daemon has an invitation for us.
26: */
27: check_local()
28: {
29: CTL_RESPONSE response;
30: register CTL_RESPONSE *rp = &response;
31:
32: /* the rest of msg was set up in get_names */
33: msg.ctl_addr = *(struct sockaddr *)&ctl_addr;
34: msg.ctl_addr.sa_family = htons(msg.ctl_addr.sa_family);
35: /* must be initiating a talk */
36: if (!look_for_invite(rp))
37: return (0);
38: /*
39: * There was an invitation waiting for us,
40: * so connect with the other (hopefully waiting) party
41: */
42: current_state = "Waiting to connect with caller";
43: do {
44: if (rp->addr.sa_family != AF_INET)
45: p_error("Response uses invalid network address");
46: errno = 0;
47: if (connect(sockt, &rp->addr, sizeof (rp->addr)) != -1)
48: return (1);
49: } while (errno == EINTR);
50: if (errno == ECONNREFUSED) {
51: /*
52: * The caller gave up, but his invitation somehow
53: * was not cleared. Clear it and initiate an
54: * invitation. (We know there are no newer invitations,
55: * the talkd works LIFO.)
56: */
57: ctl_transact(his_machine_addr, msg, DELETE, rp);
58: close(sockt);
59: open_sockt();
60: return (0);
61: }
62: p_error("Unable to connect with initiator");
63: /*NOTREACHED*/
64: }
65:
66: /*
67: * Look for an invitation on 'machine'
68: */
69: look_for_invite(rp)
70: CTL_RESPONSE *rp;
71: {
72: struct in_addr machine_addr;
73:
74: current_state = "Checking for invitation on caller's machine";
75: ctl_transact(his_machine_addr, msg, LOOK_UP, rp);
76: /* the switch is for later options, such as multiple invitations */
77: switch (rp->answer) {
78:
79: case SUCCESS:
80: msg.id_num = htonl(rp->id_num);
81: return (1);
82:
83: default:
84: /* there wasn't an invitation waiting for us */
85: return (0);
86: }
87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.