Annotation of src/usr.bin/talk/ctl.c, Revision 1.7
1.7 ! millert 1: /* $OpenBSD: ctl.c,v 1.6 2002/06/02 22:29:19 deraadt Exp $ */
1.1 deraadt 2: /* $NetBSD: ctl.c,v 1.3 1994/12/09 02:14:10 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.7 ! 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:
33: #ifndef lint
34: #if 0
35: static char sccsid[] = "@(#)ctl.c 8.1 (Berkeley) 6/6/93";
36: #endif
1.7 ! millert 37: static char rcsid[] = "$OpenBSD: ctl.c,v 1.6 2002/06/02 22:29:19 deraadt Exp $";
1.1 deraadt 38: #endif /* not lint */
39:
40: /*
41: * This file handles haggling with the various talk daemons to
42: * get a socket to talk to. sockt is opened and connected in
43: * the progress
44: */
45:
46: #include "talk.h"
1.3 pjanzen 47: #include <arpa/inet.h>
1.1 deraadt 48: #include "talk_ctl.h"
49:
50: struct sockaddr_in daemon_addr = { sizeof(daemon_addr), AF_INET };
51: struct sockaddr_in ctl_addr = { sizeof(ctl_addr), AF_INET };
52: struct sockaddr_in my_addr = { sizeof(my_addr), AF_INET };
53:
54: /* inet addresses of the two machines */
55: struct in_addr my_machine_addr;
56: struct in_addr his_machine_addr;
57:
58: u_short daemon_port; /* port number of the talk daemon */
59:
60: int ctl_sockt;
61: int sockt;
62: int invitation_waiting = 0;
63:
64: CTL_MSG msg;
65:
1.3 pjanzen 66: void
1.1 deraadt 67: open_sockt()
68: {
69: int length;
70:
71: my_addr.sin_addr = my_machine_addr;
72: my_addr.sin_port = 0;
73: sockt = socket(AF_INET, SOCK_STREAM, 0);
74: if (sockt <= 0)
1.5 millert 75: quit("Bad socket", 1);
1.1 deraadt 76: if (bind(sockt, (struct sockaddr *)&my_addr, sizeof(my_addr)) != 0)
1.5 millert 77: quit("Binding local socket", 1);
1.1 deraadt 78: length = sizeof(my_addr);
79: if (getsockname(sockt, (struct sockaddr *)&my_addr, &length) == -1)
1.5 millert 80: quit("Bad address for socket", 1);
1.1 deraadt 81: }
82:
83: /* open the ctl socket */
1.3 pjanzen 84: void
1.4 millert 85: open_ctl()
1.1 deraadt 86: {
87: int length;
88:
89: ctl_addr.sin_port = 0;
90: ctl_addr.sin_addr = my_machine_addr;
91: ctl_sockt = socket(AF_INET, SOCK_DGRAM, 0);
92: if (ctl_sockt <= 0)
1.5 millert 93: quit("Bad socket", 1);
1.1 deraadt 94: if (bind(ctl_sockt,
95: (struct sockaddr *)&ctl_addr, sizeof(ctl_addr)) != 0)
1.5 millert 96: quit("Couldn't bind to control socket", 1);
1.1 deraadt 97: length = sizeof(ctl_addr);
98: if (getsockname(ctl_sockt,
99: (struct sockaddr *)&ctl_addr, &length) == -1)
1.5 millert 100: quit("Bad address for ctl socket", 1);
1.1 deraadt 101: }
102:
103: /* print_addr is a debug print routine */
1.3 pjanzen 104: void
1.1 deraadt 105: print_addr(addr)
106: struct sockaddr_in addr;
107: {
108: int i;
109:
1.3 pjanzen 110: printf("addr = %s, port = %o, family = %o zero = ",
111: inet_ntoa(addr.sin_addr), addr.sin_port, addr.sin_family);
1.6 deraadt 112: for (i = 0; i < 8; i++)
113: printf("%o ", (int)addr.sin_zero[i]);
1.1 deraadt 114: putchar('\n');
115: }