Home | History | Annotate | Line # | Download | only in talk
      1 /*	$NetBSD: ctl.c,v 1.10 2012/03/20 20:34:59 matt Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1983, 1993
      5  *	The Regents of the University of California.  All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. Neither the name of the University nor the names of its contributors
     16  *    may be used to endorse or promote products derived from this software
     17  *    without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29  * SUCH DAMAGE.
     30  */
     31 
     32 #include <sys/cdefs.h>
     33 #ifndef lint
     34 #if 0
     35 static char sccsid[] = "@(#)ctl.c	8.1 (Berkeley) 6/6/93";
     36 #endif
     37 __RCSID("$NetBSD: ctl.c,v 1.10 2012/03/20 20:34:59 matt Exp $");
     38 #endif /* not lint */
     39 
     40 /*
     41  * This file handles haggling with the various talk daemons to
     42  * get a socket to talk to. sockt is opened and connected in
     43  * the progress
     44  */
     45 
     46 #include "talk.h"
     47 #include <arpa/inet.h>
     48 #include "talk_ctl.h"
     49 
     50 struct	sockaddr_in daemon_addr = { sizeof(daemon_addr), AF_INET, 0, {0}, {0} };
     51 struct	sockaddr_in ctl_addr = { sizeof(ctl_addr), AF_INET, 0, {0}, {0} };
     52 struct	sockaddr_in my_addr = { sizeof(my_addr), AF_INET, 0, {0}, {0} };
     53 
     54 	/* inet addresses of the two machines */
     55 struct	in_addr my_machine_addr;
     56 struct	in_addr his_machine_addr;
     57 
     58 u_short daemon_port;	/* port number of the talk daemon */
     59 
     60 int	ctl_sockt;
     61 int	sockt;
     62 int	invitation_waiting = 0;
     63 
     64 CTL_MSG msg;
     65 
     66 void
     67 open_sockt(void)
     68 {
     69 	socklen_t length;
     70 
     71 
     72 	(void)memset(&my_addr, 0, sizeof(my_addr));
     73 	my_addr.sin_family = AF_INET;
     74 #ifdef BSD4_4
     75 	my_addr.sin_len = sizeof(my_addr);
     76 #endif
     77 	my_addr.sin_addr = my_machine_addr;
     78 	my_addr.sin_port = 0;
     79 	sockt = socket(AF_INET, SOCK_STREAM, 0);
     80 	if (sockt == -1)
     81 		p_error("Bad socket");
     82 	if (bind(sockt, (struct sockaddr *)&my_addr, sizeof(my_addr)) != 0)
     83 		p_error("Binding local socket");
     84 	length = sizeof(my_addr);
     85 	if (getsockname(sockt, (struct sockaddr *)&my_addr, &length) == -1)
     86 		p_error("Bad address for socket");
     87 }
     88 
     89 /* open the ctl socket */
     90 void
     91 open_ctl(void)
     92 {
     93 	socklen_t length;
     94 
     95 	(void)memset(&ctl_addr, 0, sizeof(ctl_addr));
     96 	ctl_addr.sin_family = AF_INET;
     97 #ifdef BSD4_4
     98 	ctl_addr.sin_len = sizeof(my_addr);
     99 #endif
    100 	ctl_addr.sin_port = 0;
    101 	ctl_addr.sin_addr = my_machine_addr;
    102 	ctl_sockt = socket(AF_INET, SOCK_DGRAM, 0);
    103 	if (ctl_sockt == -1)
    104 		p_error("Bad socket");
    105 	if (bind(ctl_sockt,
    106 	    (struct sockaddr *)&ctl_addr, sizeof(ctl_addr)) != 0)
    107 		p_error("Couldn't bind to control socket");
    108 	length = sizeof(ctl_addr);
    109 	if (getsockname(ctl_sockt,
    110 	    (struct sockaddr *)&ctl_addr, &length) == -1)
    111 		p_error("Bad address for ctl socket");
    112 }
    113 
    114 /* print_addr is a debug print routine */
    115 void
    116 print_addr(struct sockaddr_in addr)
    117 {
    118 	int i;
    119 
    120 	printf("addr = %s, port = %o, family = %o zero = ",
    121 		inet_ntoa(addr.sin_addr), addr.sin_port, addr.sin_family);
    122 	for (i = 0; i<8;i++)
    123 	printf("%o ", (int)addr.sin_zero[i]);
    124 	putchar('\n');
    125 }
    126