xref: /csrg-svn/usr.bin/talk/ctl.c (revision 62301)
122388Sdist /*
2*62301Sbostic  * Copyright (c) 1983, 1993
3*62301Sbostic  *	The Regents of the University of California.  All rights reserved.
434373Sbostic  *
542770Sbostic  * %sccs.include.redist.c%
622388Sdist  */
722388Sdist 
816363Skarels #ifndef lint
9*62301Sbostic static char sccsid[] = "@(#)ctl.c	8.1 (Berkeley) 06/06/93";
1034373Sbostic #endif /* not lint */
1116343Skarels 
1216363Skarels /*
1316363Skarels  * This file handles haggling with the various talk daemons to
1416363Skarels  * get a socket to talk to. sockt is opened and connected in
1516363Skarels  * the progress
1616343Skarels  */
1716343Skarels 
1846858Sbostic #include <sys/types.h>
1946858Sbostic #include <sys/socket.h>
2046858Sbostic #include <protocols/talkd.h>
2146858Sbostic #include <netinet/in.h>
2246858Sbostic #include "talk.h"
2316343Skarels #include "talk_ctl.h"
2416343Skarels 
2537106Ssklower struct	sockaddr_in daemon_addr = { sizeof(daemon_addr), AF_INET };
2637106Ssklower struct	sockaddr_in ctl_addr = { sizeof(ctl_addr), AF_INET };
2737106Ssklower struct	sockaddr_in my_addr = { sizeof(my_addr), AF_INET };
2816343Skarels 
2926846Smckusick 	/* inet addresses of the two machines */
3016363Skarels struct	in_addr my_machine_addr;
3116363Skarels struct	in_addr his_machine_addr;
3216343Skarels 
3316343Skarels u_short daemon_port;	/* port number of the talk daemon */
3416343Skarels 
3516363Skarels int	ctl_sockt;
3616363Skarels int	sockt;
3716363Skarels int	invitation_waiting = 0;
3816343Skarels 
3916343Skarels CTL_MSG msg;
4016343Skarels 
open_sockt()4116343Skarels open_sockt()
4216343Skarels {
4326846Smckusick 	int length;
4416343Skarels 
4526846Smckusick 	my_addr.sin_addr = my_machine_addr;
4626846Smckusick 	my_addr.sin_port = 0;
4726846Smckusick 	sockt = socket(AF_INET, SOCK_STREAM, 0);
4826846Smckusick 	if (sockt <= 0)
4926846Smckusick 		p_error("Bad socket");
5046858Sbostic 	if (bind(sockt, (struct sockaddr *)&my_addr, sizeof(my_addr)) != 0)
5126846Smckusick 		p_error("Binding local socket");
5226846Smckusick 	length = sizeof(my_addr);
5346858Sbostic 	if (getsockname(sockt, (struct sockaddr *)&my_addr, &length) == -1)
5426846Smckusick 		p_error("Bad address for socket");
5516343Skarels }
5616343Skarels 
5716363Skarels /* open the ctl socket */
open_ctl()5816343Skarels open_ctl()
5916343Skarels {
6026846Smckusick 	int length;
6116343Skarels 
6226846Smckusick 	ctl_addr.sin_port = 0;
6326846Smckusick 	ctl_addr.sin_addr = my_machine_addr;
6426846Smckusick 	ctl_sockt = socket(AF_INET, SOCK_DGRAM, 0);
6526846Smckusick 	if (ctl_sockt <= 0)
6626846Smckusick 		p_error("Bad socket");
6746858Sbostic 	if (bind(ctl_sockt,
6846858Sbostic 	    (struct sockaddr *)&ctl_addr, sizeof(ctl_addr)) != 0)
6926846Smckusick 		p_error("Couldn't bind to control socket");
7026846Smckusick 	length = sizeof(ctl_addr);
7146858Sbostic 	if (getsockname(ctl_sockt,
7246858Sbostic 	    (struct sockaddr *)&ctl_addr, &length) == -1)
7326846Smckusick 		p_error("Bad address for ctl socket");
7416343Skarels }
7516343Skarels 
7616343Skarels /* print_addr is a debug print routine */
7716343Skarels print_addr(addr)
7826846Smckusick 	struct sockaddr_in addr;
7916343Skarels {
8026846Smckusick 	int i;
8116343Skarels 
8226846Smckusick 	printf("addr = %x, port = %o, family = %o zero = ",
8326846Smckusick 		addr.sin_addr, addr.sin_port, addr.sin_family);
8426846Smckusick 	for (i = 0; i<8;i++)
8516343Skarels 	printf("%o ", (int)addr.sin_zero[i]);
8626846Smckusick 	putchar('\n');
8716343Skarels }
88