FreeBSD/usr.bin/talk/io.c
/*
 * The routine to do the actual talking
 */
The routine to do the actual talking
The routine to do the actual talking
void
talk(void)
{
	struct hostent *hp, *hp2;
	struct pollfd fds[2];
	int nb;
	wchar_t buf[BUFSIZ];
	char **addr, *his_machine_name;
	FILE *sockfp;
	his_machine_name = NULL;
	hp = gethostbyaddr((const char *)&his_machine_addr.s_addr,
	    sizeof(his_machine_addr.s_addr), AF_INET);
	if (hp != NULL) {
		hp2 = gethostbyname(hp->h_name);
		if (hp2 != NULL && hp2->h_addrtype == AF_INET &&
		    hp2->h_length == sizeof(his_machine_addr))
			for (addr = hp2->h_addr_list; *addr != NULL; addr++)
				if (memcmp(*addr, &his_machine_addr,
				    sizeof(his_machine_addr)) == 0) {
					his_machine_name = strdup(hp->h_name);
					break;
				}
	}
	if (his_machine_name == NULL)
		his_machine_name = strdup(inet_ntoa(his_machine_addr));
	snprintf((char *)buf, sizeof(buf), "Connection established with %s@%s.",
	    msg.r_name, his_machine_name);
	free(his_machine_name);
	message((char *)buf);
	write(STDOUT_FILENO, "\007\007\007", 3);
	current_line = 0;
	if ((sockfp = fdopen(sockt, "w+")) == NULL)
		p_error("fdopen");
	setvbuf(sockfp, NULL, _IONBF, 0);
	setvbuf(stdin, NULL, _IONBF, 0);
	for (;;) {
		fds[0].fd = fileno(stdin);
		fds[0].events = POLLIN;
		fds[1].fd = sockt;
		fds[1].events = POLLIN;
		nb = poll(fds, 2, INFTIM);
		if (gotwinch) {
			resize_display();
			gotwinch = 0;
		}
		if (nb <= 0) {
			if (errno == EINTR)
				continue;
			p_error("Unexpected error from poll");
			quit();
		}
		if (fds[1].revents & POLLIN) {
			wint_t w;
			w = fgetwc(sockfp);
			if (w == WEOF) {
				message("Connection closed. Exiting");
				quit();
			}
			display(&his_win, &w);
		}
		if (fds[0].revents & POLLIN) {
			wint_t w;
			if ((w = getwchar()) != WEOF) {
				display(&my_win, &w);
				(void )fputwc(w, sockfp);
				(void )fflush(sockfp);
			}
		}
	}
}
void talk ( void ) { struct hostent * hp , * hp2 ; struct pollfd fds [ 2 ] ; int nb ; wchar_t buf [ BUFSIZ ] ; char * * addr , * his_machine_name ; FILE * sockfp ; his_machine_name = NULL ; hp = gethostbyaddr ( ( const char * ) & his_machine_addr . s_addr , sizeof ( his_machine_addr . s_addr ) , AF_INET ) ; if ( hp != NULL ) { hp2 = gethostbyname ( hp -> h_name ) ; if ( hp2 != NULL && hp2 -> h_addrtype == AF_INET && hp2 -> h_length == sizeof ( his_machine_addr ) ) for ( addr = hp2 -> h_addr_list ; * addr != NULL ; addr ++ ) if ( memcmp ( * addr , & his_machine_addr , sizeof ( his_machine_addr ) ) == 0 ) { his_machine_name = strdup ( hp -> h_name ) ; break ; } } if ( his_machine_name == NULL ) his_machine_name = strdup ( inet_ntoa ( his_machine_addr ) ) ; snprintf ( ( char * ) buf , sizeof ( buf ) , " " , msg . r_name , his_machine_name ) ; free ( his_machine_name ) ; message ( ( char * ) buf ) ; write ( STDOUT_FILENO , " \007 \007 \007 " , 3 ) ; current_line = 0 ; if ( ( sockfp = fdopen ( sockt , " " ) ) == NULL ) p_error ( " " ) ; setvbuf ( sockfp , NULL , _IONBF , 0 ) ; setvbuf ( stdin , NULL , _IONBF , 0 ) ; for ( ; ; ) { fds [ 0 ] . fd = fileno ( stdin ) ; fds [ 0 ] . events = POLLIN ; fds [ 1 ] . fd = sockt ; fds [ 1 ] . events = POLLIN ; nb = poll ( fds , 2 , INFTIM ) ; if ( gotwinch ) { resize_display ( ) ; gotwinch = 0 ; } if ( nb <= 0 ) { if ( errno == EINTR ) continue ; p_error ( " " ) ; quit ( ) ; } if ( fds [ 1 ] . revents & POLLIN ) { wint_t w ; w = fgetwc ( sockfp ) ; if ( w == WEOF ) { message ( " " ) ; quit ( ) ; } display ( & his_win , & w ) ; } if ( fds [ 0 ] . revents & POLLIN ) { wint_t w ; if ( ( w = getwchar ( ) ) != WEOF ) { display ( & my_win , & w ) ; ( void ) fputwc ( w , sockfp ) ; ( void ) fflush ( sockfp ) ; } } } }
The routine to do the actual talking
The routine to do the actual talking
/*
	 * Wait on both the other process (sockt) and standard input.
	 */ /* Panic, we don't know what happened. */ /* There is data on sockt. */