xref: /csrg-svn/usr.bin/talk/ctl.c (revision 37106)
122388Sdist /*
222388Sdist  * Copyright (c) 1983 Regents of the University of California.
334373Sbostic  * All rights reserved.
434373Sbostic  *
534373Sbostic  * Redistribution and use in source and binary forms are permitted
634900Sbostic  * provided that the above copyright notice and this paragraph are
734900Sbostic  * duplicated in all such forms and that any documentation,
834900Sbostic  * advertising materials, and other materials related to such
934900Sbostic  * distribution and use acknowledge that the software was developed
1034900Sbostic  * by the University of California, Berkeley.  The name of the
1134900Sbostic  * University may not be used to endorse or promote products derived
1234900Sbostic  * from this software without specific prior written permission.
1334900Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1434900Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1534900Sbostic  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1622388Sdist  */
1722388Sdist 
1816363Skarels #ifndef lint
19*37106Ssklower static char sccsid[] = "@(#)ctl.c	5.5 (Berkeley) 03/08/89";
2034373Sbostic #endif /* not lint */
2116343Skarels 
2216363Skarels /*
2316363Skarels  * This file handles haggling with the various talk daemons to
2416363Skarels  * get a socket to talk to. sockt is opened and connected in
2516363Skarels  * the progress
2616343Skarels  */
2716343Skarels 
2816343Skarels #include "talk_ctl.h"
2916343Skarels 
30*37106Ssklower struct	sockaddr_in daemon_addr = { sizeof(daemon_addr), AF_INET };
31*37106Ssklower struct	sockaddr_in ctl_addr = { sizeof(ctl_addr), AF_INET };
32*37106Ssklower struct	sockaddr_in my_addr = { sizeof(my_addr), AF_INET };
3316343Skarels 
3426846Smckusick 	/* inet addresses of the two machines */
3516363Skarels struct	in_addr my_machine_addr;
3616363Skarels struct	in_addr his_machine_addr;
3716343Skarels 
3816343Skarels u_short daemon_port;	/* port number of the talk daemon */
3916343Skarels 
4016363Skarels int	ctl_sockt;
4116363Skarels int	sockt;
4216363Skarels int	invitation_waiting = 0;
4316343Skarels 
4416343Skarels CTL_MSG msg;
4516343Skarels 
4616343Skarels open_sockt()
4716343Skarels {
4826846Smckusick 	int length;
4916343Skarels 
5026846Smckusick 	my_addr.sin_addr = my_machine_addr;
5126846Smckusick 	my_addr.sin_port = 0;
5226846Smckusick 	sockt = socket(AF_INET, SOCK_STREAM, 0);
5326846Smckusick 	if (sockt <= 0)
5426846Smckusick 		p_error("Bad socket");
5526846Smckusick 	if (bind(sockt, &my_addr, sizeof(my_addr)) != 0)
5626846Smckusick 		p_error("Binding local socket");
5726846Smckusick 	length = sizeof(my_addr);
5826846Smckusick 	if (getsockname(sockt, &my_addr, &length) == -1)
5926846Smckusick 		p_error("Bad address for socket");
6016343Skarels }
6116343Skarels 
6216363Skarels /* open the ctl socket */
6316343Skarels open_ctl()
6416343Skarels {
6526846Smckusick 	int length;
6616343Skarels 
6726846Smckusick 	ctl_addr.sin_port = 0;
6826846Smckusick 	ctl_addr.sin_addr = my_machine_addr;
6926846Smckusick 	ctl_sockt = socket(AF_INET, SOCK_DGRAM, 0);
7026846Smckusick 	if (ctl_sockt <= 0)
7126846Smckusick 		p_error("Bad socket");
7226846Smckusick 	if (bind(ctl_sockt, &ctl_addr, sizeof(ctl_addr), 0) != 0)
7326846Smckusick 		p_error("Couldn't bind to control socket");
7426846Smckusick 	length = sizeof(ctl_addr);
7526846Smckusick 	if (getsockname(ctl_sockt, &ctl_addr, &length) == -1)
7626846Smckusick 		p_error("Bad address for ctl socket");
7716343Skarels }
7816343Skarels 
7916343Skarels /* print_addr is a debug print routine */
8016343Skarels print_addr(addr)
8126846Smckusick 	struct sockaddr_in addr;
8216343Skarels {
8326846Smckusick 	int i;
8416343Skarels 
8526846Smckusick 	printf("addr = %x, port = %o, family = %o zero = ",
8626846Smckusick 		addr.sin_addr, addr.sin_port, addr.sin_family);
8726846Smckusick 	for (i = 0; i<8;i++)
8816343Skarels 	printf("%o ", (int)addr.sin_zero[i]);
8926846Smckusick 	putchar('\n');
9016343Skarels }
91