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