xref: /original-bsd/usr.bin/talk/ctl.c (revision 6cca134b)
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[] = "@(#)ctl.c	5.4 (Berkeley) 06/29/88";
20 #endif /* not lint */
21 
22 /*
23  * This file handles haggling with the various talk daemons to
24  * get a socket to talk to. sockt is opened and connected in
25  * the progress
26  */
27 
28 #include "talk_ctl.h"
29 
30 struct	sockaddr_in daemon_addr = { AF_INET };
31 struct	sockaddr_in ctl_addr = { AF_INET };
32 struct	sockaddr_in my_addr = { AF_INET };
33 
34 	/* inet addresses of the two machines */
35 struct	in_addr my_machine_addr;
36 struct	in_addr his_machine_addr;
37 
38 u_short daemon_port;	/* port number of the talk daemon */
39 
40 int	ctl_sockt;
41 int	sockt;
42 int	invitation_waiting = 0;
43 
44 CTL_MSG msg;
45 
46 open_sockt()
47 {
48 	int length;
49 
50 	my_addr.sin_addr = my_machine_addr;
51 	my_addr.sin_port = 0;
52 	sockt = socket(AF_INET, SOCK_STREAM, 0);
53 	if (sockt <= 0)
54 		p_error("Bad socket");
55 	if (bind(sockt, &my_addr, sizeof(my_addr)) != 0)
56 		p_error("Binding local socket");
57 	length = sizeof(my_addr);
58 	if (getsockname(sockt, &my_addr, &length) == -1)
59 		p_error("Bad address for socket");
60 }
61 
62 /* open the ctl socket */
63 open_ctl()
64 {
65 	int length;
66 
67 	ctl_addr.sin_port = 0;
68 	ctl_addr.sin_addr = my_machine_addr;
69 	ctl_sockt = socket(AF_INET, SOCK_DGRAM, 0);
70 	if (ctl_sockt <= 0)
71 		p_error("Bad socket");
72 	if (bind(ctl_sockt, &ctl_addr, sizeof(ctl_addr), 0) != 0)
73 		p_error("Couldn't bind to control socket");
74 	length = sizeof(ctl_addr);
75 	if (getsockname(ctl_sockt, &ctl_addr, &length) == -1)
76 		p_error("Bad address for ctl socket");
77 }
78 
79 /* print_addr is a debug print routine */
80 print_addr(addr)
81 	struct sockaddr_in addr;
82 {
83 	int i;
84 
85 	printf("addr = %x, port = %o, family = %o zero = ",
86 		addr.sin_addr, addr.sin_port, addr.sin_family);
87 	for (i = 0; i<8;i++)
88 	printf("%o ", (int)addr.sin_zero[i]);
89 	putchar('\n');
90 }
91