122388Sdist /* 222388Sdist * Copyright (c) 1983 Regents of the University of California. 334373Sbostic * All rights reserved. 434373Sbostic * 542770Sbostic * %sccs.include.redist.c% 622388Sdist */ 722388Sdist 816363Skarels #ifndef lint 9*46858Sbostic static char sccsid[] = "@(#)ctl.c 5.7 (Berkeley) 03/01/91"; 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 18*46858Sbostic #include <sys/types.h> 19*46858Sbostic #include <sys/socket.h> 20*46858Sbostic #include <protocols/talkd.h> 21*46858Sbostic #include <netinet/in.h> 22*46858Sbostic #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 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"); 50*46858Sbostic if (bind(sockt, (struct sockaddr *)&my_addr, sizeof(my_addr)) != 0) 5126846Smckusick p_error("Binding local socket"); 5226846Smckusick length = sizeof(my_addr); 53*46858Sbostic if (getsockname(sockt, (struct sockaddr *)&my_addr, &length) == -1) 5426846Smckusick p_error("Bad address for socket"); 5516343Skarels } 5616343Skarels 5716363Skarels /* open the ctl socket */ 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"); 67*46858Sbostic if (bind(ctl_sockt, 68*46858Sbostic (struct sockaddr *)&ctl_addr, sizeof(ctl_addr)) != 0) 6926846Smckusick p_error("Couldn't bind to control socket"); 7026846Smckusick length = sizeof(ctl_addr); 71*46858Sbostic if (getsockname(ctl_sockt, 72*46858Sbostic (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