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