From 5b57d28ffb6e1ef86b50f7d05d977826eae89bfe Mon Sep 17 00:00:00 2001 From: Kiyoshi Aman Date: Fri, 1 Feb 2019 22:55:37 +0000 Subject: initial population --- usr.bin/talk/ctl.c | 125 ++++++++++++++++++++++++++++ usr.bin/talk/ctl_transact.c | 108 ++++++++++++++++++++++++ usr.bin/talk/display.c | 195 ++++++++++++++++++++++++++++++++++++++++++++ usr.bin/talk/get_addrs.c | 81 ++++++++++++++++++ usr.bin/talk/get_names.c | 124 ++++++++++++++++++++++++++++ usr.bin/talk/init_disp.c | 153 ++++++++++++++++++++++++++++++++++ usr.bin/talk/invite.c | 190 ++++++++++++++++++++++++++++++++++++++++++ usr.bin/talk/io.c | 139 +++++++++++++++++++++++++++++++ usr.bin/talk/look_up.c | 119 +++++++++++++++++++++++++++ usr.bin/talk/msgs.c | 82 +++++++++++++++++++ usr.bin/talk/talk.1 | 143 ++++++++++++++++++++++++++++++++ usr.bin/talk/talk.c | 79 ++++++++++++++++++ usr.bin/talk/talk.h | 89 ++++++++++++++++++++ usr.bin/talk/talk_ctl.h | 41 ++++++++++ 14 files changed, 1668 insertions(+) create mode 100644 usr.bin/talk/ctl.c create mode 100644 usr.bin/talk/ctl_transact.c create mode 100644 usr.bin/talk/display.c create mode 100644 usr.bin/talk/get_addrs.c create mode 100644 usr.bin/talk/get_names.c create mode 100644 usr.bin/talk/init_disp.c create mode 100644 usr.bin/talk/invite.c create mode 100644 usr.bin/talk/io.c create mode 100644 usr.bin/talk/look_up.c create mode 100644 usr.bin/talk/msgs.c create mode 100644 usr.bin/talk/talk.1 create mode 100644 usr.bin/talk/talk.c create mode 100644 usr.bin/talk/talk.h create mode 100644 usr.bin/talk/talk_ctl.h (limited to 'usr.bin/talk') diff --git a/usr.bin/talk/ctl.c b/usr.bin/talk/ctl.c new file mode 100644 index 0000000..ef6f924 --- /dev/null +++ b/usr.bin/talk/ctl.c @@ -0,0 +1,125 @@ +/* $NetBSD: ctl.c,v 1.10 2012/03/20 20:34:59 matt Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)ctl.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: ctl.c,v 1.10 2012/03/20 20:34:59 matt Exp $"); +#endif /* not lint */ + +/* + * This file handles haggling with the various talk daemons to + * get a socket to talk to. sockt is opened and connected in + * the progress + */ + +#include "talk.h" +#include +#include "talk_ctl.h" + +struct sockaddr_in daemon_addr = { sizeof(daemon_addr), AF_INET, 0, {0}, {0} }; +struct sockaddr_in ctl_addr = { sizeof(ctl_addr), AF_INET, 0, {0}, {0} }; +struct sockaddr_in my_addr = { sizeof(my_addr), AF_INET, 0, {0}, {0} }; + + /* inet addresses of the two machines */ +struct in_addr my_machine_addr; +struct in_addr his_machine_addr; + +u_short daemon_port; /* port number of the talk daemon */ + +int ctl_sockt; +int sockt; +int invitation_waiting = 0; + +CTL_MSG msg; + +void +open_sockt(void) +{ + socklen_t length; + + + (void)memset(&my_addr, 0, sizeof(my_addr)); + my_addr.sin_family = AF_INET; +#ifdef BSD4_4 + my_addr.sin_len = sizeof(my_addr); +#endif + my_addr.sin_addr = my_machine_addr; + my_addr.sin_port = 0; + sockt = socket(AF_INET, SOCK_STREAM, 0); + if (sockt == -1) + p_error("Bad socket"); + if (bind(sockt, (struct sockaddr *)&my_addr, sizeof(my_addr)) != 0) + p_error("Binding local socket"); + length = sizeof(my_addr); + if (getsockname(sockt, (struct sockaddr *)&my_addr, &length) == -1) + p_error("Bad address for socket"); +} + +/* open the ctl socket */ +void +open_ctl(void) +{ + socklen_t length; + + (void)memset(&ctl_addr, 0, sizeof(ctl_addr)); + ctl_addr.sin_family = AF_INET; +#ifdef BSD4_4 + ctl_addr.sin_len = sizeof(my_addr); +#endif + ctl_addr.sin_port = 0; + ctl_addr.sin_addr = my_machine_addr; + ctl_sockt = socket(AF_INET, SOCK_DGRAM, 0); + if (ctl_sockt == -1) + p_error("Bad socket"); + if (bind(ctl_sockt, + (struct sockaddr *)&ctl_addr, sizeof(ctl_addr)) != 0) + p_error("Couldn't bind to control socket"); + length = sizeof(ctl_addr); + if (getsockname(ctl_sockt, + (struct sockaddr *)&ctl_addr, &length) == -1) + p_error("Bad address for ctl socket"); +} + +/* print_addr is a debug print routine */ +void +print_addr(struct sockaddr_in addr) +{ + int i; + + printf("addr = %s, port = %o, family = %o zero = ", + inet_ntoa(addr.sin_addr), addr.sin_port, addr.sin_family); + for (i = 0; i<8;i++) + printf("%o ", (int)addr.sin_zero[i]); + putchar('\n'); +} diff --git a/usr.bin/talk/ctl_transact.c b/usr.bin/talk/ctl_transact.c new file mode 100644 index 0000000..4d0613f --- /dev/null +++ b/usr.bin/talk/ctl_transact.c @@ -0,0 +1,108 @@ +/* $NetBSD: ctl_transact.c,v 1.11 2011/09/06 18:32:03 joerg Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)ctl_transact.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: ctl_transact.c,v 1.11 2011/09/06 18:32:03 joerg Exp $"); +#endif /* not lint */ + +#include "talk.h" +#include +#include +#include +#include +#include "talk_ctl.h" + +#define CTL_WAIT 2 /* time to wait for a response, in seconds */ + +/* + * SOCKDGRAM is unreliable, so we must repeat messages if we have + * not received an acknowledgement within a reasonable amount + * of time + */ +void +ctl_transact(struct in_addr target, CTL_MSG tmsg, int type, CTL_RESPONSE *rp) +{ + struct pollfd set[1]; + int nready, cc; + + nready = 0; + tmsg.type = type; + daemon_addr.sin_addr = target; + daemon_addr.sin_port = daemon_port; + set[0].fd = ctl_sockt; + set[0].events = POLLIN; + + /* + * Keep sending the message until a response of + * the proper type is obtained. + */ + do { + /* resend message until a response is obtained */ + do { + cc = sendto(ctl_sockt, (char *)&tmsg, sizeof (tmsg), 0, + (struct sockaddr *)&daemon_addr, + sizeof (daemon_addr)); + if (cc != sizeof (tmsg)) { + if (errno == EINTR) + continue; + p_error("Error on write to talk daemon"); + } + nready = poll(set, 1, CTL_WAIT * 1000); + if (nready < 0) { + if (errno == EINTR) + continue; + p_error("Error waiting for daemon response"); + } + } while (nready == 0); + /* + * Keep reading while there are queued messages + * (this is not necessary, it just saves extra + * request/acknowledgements being sent) + */ + do { + cc = recv(ctl_sockt, (char *)rp, sizeof (*rp), 0); + if (cc < 0) { + if (errno == EINTR) + continue; + p_error("Error on read from talk daemon"); + } + /* an immediate poll */ + nready = poll(set, 1, 0); + } while (nready > 0 && (rp->vers != TALK_VERSION || + rp->type != type)); + } while (rp->vers != TALK_VERSION || rp->type != type); + rp->id_num = ntohl(rp->id_num); + rp->addr.sa_family = ntohs(rp->addr.sa_family); +} diff --git a/usr.bin/talk/display.c b/usr.bin/talk/display.c new file mode 100644 index 0000000..7017f3f --- /dev/null +++ b/usr.bin/talk/display.c @@ -0,0 +1,195 @@ +/* $NetBSD: display.c,v 1.9 2011/09/06 18:32:03 joerg Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)display.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: display.c,v 1.9 2011/09/06 18:32:03 joerg Exp $"); +#endif /* not lint */ + +/* + * The window 'manager', initializes curses and handles the actual + * displaying of text + */ +#include "talk.h" +#include + +xwin_t my_win; +xwin_t his_win; +WINDOW *line_win; + +int curses_initialized = 0; + +/* + * max HAS to be a function, it is called with + * a argument of the form --foo at least once. + */ +int +max(int a, int b) +{ + + return (a > b ? a : b); +} + +/* + * Display some text on somebody's window, processing some control + * characters while we are at it. + */ +void +display(xwin_t *win, char *text, int size) +{ + int i; + char cch; + + for (i = 0; i < size; i++) { + if (*text == '\n') { + xscroll(win, 0); + text++; + continue; + } + /* erase character */ + if (*text == win->cerase) { + wmove(win->x_win, win->x_line, max(--win->x_col, 0)); + getyx(win->x_win, win->x_line, win->x_col); + waddch(win->x_win, ' '); + wmove(win->x_win, win->x_line, win->x_col); + getyx(win->x_win, win->x_line, win->x_col); + text++; + continue; + } + /* + * On word erase search backwards until we find + * the beginning of a word or the beginning of + * the line. + */ + if (*text == win->werase) { + int endcol, xcol, j, c; + + endcol = win->x_col; + xcol = endcol - 1; + while (xcol >= 0) { + c = readwin(win->x_win, win->x_line, xcol); + if (c != ' ') + break; + xcol--; + } + while (xcol >= 0) { + c = readwin(win->x_win, win->x_line, xcol); + if (c == ' ') + break; + xcol--; + } + wmove(win->x_win, win->x_line, xcol + 1); + for (j = xcol + 1; j < endcol; j++) + waddch(win->x_win, ' '); + wmove(win->x_win, win->x_line, xcol + 1); + getyx(win->x_win, win->x_line, win->x_col); + text++; + continue; + } + /* line kill */ + if (*text == win->kill) { + wmove(win->x_win, win->x_line, 0); + wclrtoeol(win->x_win); + getyx(win->x_win, win->x_line, win->x_col); + text++; + continue; + } + if (*text == '\f') { + if (win == &my_win) + wrefresh(curscr); + text++; + continue; + } + if (*text == '\07') { + beep(); + text++; + continue; + } + if (win->x_col == COLS-1) { + /* check for wraparound */ + xscroll(win, 0); + } + if ( !isprint((u_char)*text) && *text != '\t') { + waddch(win->x_win, '^'); + getyx(win->x_win, win->x_line, win->x_col); + if (win->x_col == COLS-1) /* check for wraparound */ + xscroll(win, 0); + cch = (*text & 63) + 64; + waddch(win->x_win, cch); + } else + waddch(win->x_win, *text); + getyx(win->x_win, win->x_line, win->x_col); + text++; + } + wrefresh(win->x_win); +} + +/* + * Read the character at the indicated position in win + */ +int +readwin(WINDOW *win, int line, int col) +{ + int oldline, oldcol; + int c; + + getyx(win, oldline, oldcol); + wmove(win, line, col); + c = winch(win); + wmove(win, oldline, oldcol); + return (c); +} + +/* + * Scroll a window, blanking out the line following the current line + * so that the current position is obvious + */ +void +xscroll(xwin_t *win, int flag) +{ + + if (flag == -1) { + wmove(win->x_win, 0, 0); + win->x_line = 0; + win->x_col = 0; + return; + } + win->x_line = (win->x_line + 1) % win->x_nlines; + win->x_col = 0; + wmove(win->x_win, win->x_line, win->x_col); + wclrtoeol(win->x_win); + wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col); + wclrtoeol(win->x_win); + wmove(win->x_win, win->x_line, win->x_col); +} diff --git a/usr.bin/talk/get_addrs.c b/usr.bin/talk/get_addrs.c new file mode 100644 index 0000000..f381cc7 --- /dev/null +++ b/usr.bin/talk/get_addrs.c @@ -0,0 +1,81 @@ +/* $NetBSD: get_addrs.c,v 1.12 2015/06/16 22:54:11 christos Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)get_addrs.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: get_addrs.c,v 1.12 2015/06/16 22:54:11 christos Exp $"); +#endif /* not lint */ + +#include "talk.h" +#include +#include +#include +#include +#include +#include "talk_ctl.h" + +void +get_addrs(const char *my_machine_name, const char *his_machine_name) +{ + struct hostent *hp; + struct servent *sp; + + msg.pid = htonl(getpid()); + /* + * If the callee is on-machine, just use loopback + * otherwise do a lookup... + */ + if (strcmp(his_machine_name, my_machine_name) != 0) { + /* look up the address of the local host */ + hp = gethostbyname(my_machine_name); + if (hp == NULL) + errx(EXIT_FAILURE, "%s: %s", my_machine_name, + hstrerror(h_errno)); + memcpy(&my_machine_addr, hp->h_addr, sizeof(my_machine_addr)); + hp = gethostbyname(his_machine_name); + if (hp == NULL) + errx(EXIT_FAILURE, "%s: %s", his_machine_name, + hstrerror(h_errno)); + memcpy(&his_machine_addr, hp->h_addr, sizeof(his_machine_addr)); + } else + his_machine_addr.s_addr = my_machine_addr.s_addr = + htonl(INADDR_LOOPBACK); + + /* find the server's port */ + sp = getservbyname("ntalk", "udp"); + if (sp == 0) + errx(EXIT_FAILURE, "%s/%s: service is not registered.", + "ntalk", "udp"); + daemon_port = sp->s_port; +} diff --git a/usr.bin/talk/get_names.c b/usr.bin/talk/get_names.c new file mode 100644 index 0000000..5400548 --- /dev/null +++ b/usr.bin/talk/get_names.c @@ -0,0 +1,124 @@ +/* $NetBSD: get_names.c,v 1.16 2012/12/29 23:44:23 christos Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)get_names.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: get_names.c,v 1.16 2012/12/29 23:44:23 christos Exp $"); +#endif /* not lint */ + +#include "talk.h" +#include +#include +#include +#include +#include +#include + +extern CTL_MSG msg; + +/* + * Determine the local and remote user, tty, and machines + */ +void +get_names(int argc, char *argv[]) +{ + char hostname[MAXHOSTNAMELEN + 1]; + const char *his_name, *my_name; + const char *my_machine_name, *his_machine_name; + const char *his_tty; + char *cp; + char *names; + + if (argc < 2 ) { + fprintf(stderr, "Usage: %s user [ttyname]\n", getprogname()); + exit(1); + } + if (!isatty(0)) + errx(EXIT_FAILURE, "Standard input must be a tty, " + "not a pipe or a file"); + if ((my_name = getlogin()) == NULL) { + struct passwd *pw; + + if ((pw = getpwuid(getuid())) == NULL) + errx(EXIT_FAILURE, "You don't exist. Go away."); + my_name = pw->pw_name; + } + if ((cp = getenv("TALKHOST")) != NULL) + (void)estrlcpy(hostname, cp, sizeof(hostname)); + else { + if (gethostname(hostname, sizeof(hostname)) == -1) + err(EXIT_FAILURE, "gethostname"); + hostname[sizeof(hostname) - 1] = '\0'; + } + my_machine_name = hostname; + /* check for, and strip out, the machine name of the target */ + names = strdup(argv[1]); + for (cp = names; *cp && !strchr("@:!.", *cp); cp++) + ; + if (*cp == '\0') { + /* this is a local to local talk */ + his_name = names; + his_machine_name = my_machine_name; + } else { + if (*cp++ == '@') { + /* user@host */ + his_name = names; + his_machine_name = cp; + } else { + /* host.user or host!user or host:user */ + his_name = cp; + his_machine_name = names; + } + *--cp = '\0'; + } + if (argc > 2) + his_tty = argv[2]; /* tty name is arg 2 */ + else + his_tty = ""; + get_addrs(my_machine_name, his_machine_name); + /* + * Initialize the message template. + */ + msg.vers = TALK_VERSION; + msg.addr.sa_family = htons(AF_INET); + msg.ctl_addr.sa_family = htons(AF_INET); + msg.id_num = htonl(0); + strncpy(msg.l_name, my_name, NAME_SIZE); + msg.l_name[NAME_SIZE - 1] = '\0'; + strncpy(msg.r_name, his_name, NAME_SIZE); + msg.r_name[NAME_SIZE - 1] = '\0'; + strncpy(msg.r_tty, his_tty, TTY_SIZE); + msg.r_tty[TTY_SIZE - 1] = '\0'; + free(names); +} diff --git a/usr.bin/talk/init_disp.c b/usr.bin/talk/init_disp.c new file mode 100644 index 0000000..a006705 --- /dev/null +++ b/usr.bin/talk/init_disp.c @@ -0,0 +1,153 @@ +/* $NetBSD: init_disp.c,v 1.12 2011/09/06 18:32:03 joerg Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)init_disp.c 8.2 (Berkeley) 2/16/94"; +#endif +__RCSID("$NetBSD: init_disp.c,v 1.12 2011/09/06 18:32:03 joerg Exp $"); +#endif /* not lint */ + +/* + * Initialization code for the display package, + * as well as the signal handling routines. + */ + +#include "talk.h" +#include +#include +#include +#include +#include +#include +#include + +/* + * Set up curses, catch the appropriate signals, + * and build the various windows. + */ +void +init_display(void) +{ + struct sigaction sa; + + if (initscr() == NULL) + errx(1, "Terminal type unset or lacking necessary features."); + (void)sigaction(SIGTSTP, NULL, &sa); + sigaddset(&sa.sa_mask, SIGALRM); + (void)sigaction(SIGTSTP, &sa, NULL); + curses_initialized = 1; + clear(); + refresh(); + noecho(); + cbreak(); + signal(SIGINT, sig_sent); + signal(SIGPIPE, sig_sent); + /* curses takes care of ^Z */ + my_win.x_nlines = LINES / 2; + my_win.x_ncols = COLS; + my_win.x_win = newwin(my_win.x_nlines, my_win.x_ncols, 0, 0); + scrollok(my_win.x_win, FALSE); + wclear(my_win.x_win); + + his_win.x_nlines = LINES / 2 - 1; + his_win.x_ncols = COLS; + his_win.x_win = newwin(his_win.x_nlines, his_win.x_ncols, + my_win.x_nlines+1, 0); + scrollok(his_win.x_win, FALSE); + wclear(his_win.x_win); + + line_win = newwin(1, COLS, my_win.x_nlines, 0); + box(line_win, '-', '-'); + wrefresh(line_win); + /* let them know we are working on it */ + current_state = "No connection yet"; +} + +/* + * Trade edit characters with the other talk. By agreement + * the first three characters each talk transmits after + * connection are the three edit characters. + */ +void +set_edit_chars(void) +{ + char buf[3]; + int cc; + struct termios tty; + + tcgetattr(0, &tty); + my_win.cerase = tty.c_cc[VERASE]; + my_win.kill = tty.c_cc[VKILL]; + if (tty.c_cc[VWERASE] == (unsigned char) -1) + my_win.werase = '\027'; /* control W */ + else + my_win.werase = tty.c_cc[VWERASE]; + buf[0] = my_win.cerase; + buf[1] = my_win.kill; + buf[2] = my_win.werase; + cc = write(sockt, buf, sizeof(buf)); + if (cc != sizeof(buf) ) + p_error("Lost the connection"); + cc = read(sockt, buf, sizeof(buf)); + if (cc != sizeof(buf) ) + p_error("Lost the connection"); + his_win.cerase = buf[0]; + his_win.kill = buf[1]; + his_win.werase = buf[2]; +} + +void +sig_sent(int dummy) +{ + + message("Connection closing. Exiting"); + quit(); +} + +/* + * All done talking...hang up the phone and reset terminal thingy's + */ +void +quit(void) +{ + + if (curses_initialized) { + wmove(his_win.x_win, his_win.x_nlines-1, 0); + wclrtoeol(his_win.x_win); + wrefresh(his_win.x_win); + endwin(); + } + if (invitation_waiting) + send_delete(); + exit(0); +} diff --git a/usr.bin/talk/invite.c b/usr.bin/talk/invite.c new file mode 100644 index 0000000..680744c --- /dev/null +++ b/usr.bin/talk/invite.c @@ -0,0 +1,190 @@ +/* $NetBSD: invite.c,v 1.10 2012/12/29 23:44:23 christos Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)invite.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: invite.c,v 1.10 2012/12/29 23:44:23 christos Exp $"); +#endif /* not lint */ + +#include "talk.h" +#include +#include +#include +#include +#include +#include +#include "talk_ctl.h" + +/* + * There wasn't an invitation waiting, so send a request containing + * our sockt address to the remote talk daemon so it can invite + * him + */ + +/* + * The msg.id's for the invitations + * on the local and remote machines. + * These are used to delete the + * invitations. + */ +static int local_id, remote_id; +static jmp_buf invitebuf; + +void +invite_remote(void) +{ + int new_sockt; + struct itimerval itimer; + CTL_RESPONSE response; + + itimer.it_value.tv_sec = RING_WAIT; + itimer.it_value.tv_usec = 0; + itimer.it_interval = itimer.it_value; + if (listen(sockt, 5) != 0) + p_error("Error on attempt to listen for caller"); +#ifdef MSG_EOR + /* copy new style sockaddr to old, swap family (short in old) */ + msg.addr = *(struct talkd_sockaddr *)(void *)&my_addr; + msg.addr.sa_family = htons(my_addr.sin_family); +#else + msg.addr = *(struct sockaddr *)&my_addr; +#endif + msg.id_num = htonl(-1); /* an impossible id_num */ + invitation_waiting = 1; + announce_invite(); + /* + * Shut off the automatic messages for a while, + * so we can use the interrupt timer to resend the invitation + */ + end_msgs(); + setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); + message("Waiting for your party to respond"); + signal(SIGALRM, re_invite); + (void) setjmp(invitebuf); + while ((new_sockt = accept(sockt, 0, 0)) < 0) { + if (errno == EINTR) + continue; + p_error("Unable to connect with your party"); + } + close(sockt); + sockt = new_sockt; + + /* + * Have the daemons delete the invitations now that we + * have connected. + */ + current_state = "Waiting for your party to respond"; + start_msgs(); + + msg.id_num = htonl(local_id); + ctl_transact(my_machine_addr, msg, DELETE, &response); + msg.id_num = htonl(remote_id); + ctl_transact(his_machine_addr, msg, DELETE, &response); + invitation_waiting = 0; +} + +/* + * Routine called on interrupt to re-invite the callee + */ +void +re_invite(int dummy) +{ + + message("Ringing your party again"); + current_line++; + /* force a re-announce */ + msg.id_num = htonl(remote_id + 1); + announce_invite(); + longjmp(invitebuf, 1); +} + +static const char *answers[] = { + "answer #0", /* SUCCESS */ + "Your party is not logged on", /* NOT_HERE */ + "Target machine is too confused to talk to us", /* FAILED */ + "Target machine does not recognize us", /* MACHINE_UNKNOWN */ + "Your party is refusing messages", /* PERMISSION_REFUSED */ + "Target machine can not handle remote talk", /* UNKNOWN_REQUEST */ + "Target machine indicates protocol mismatch", /* BADVERSION */ + "Target machine indicates protocol botch (addr)",/* BADADDR */ + "Target machine indicates protocol botch (ctl_addr)",/* BADCTLADDR */ +}; +#define NANSWERS (sizeof (answers) / sizeof (answers[0])) + +/* + * Transmit the invitation and process the response + */ +void +announce_invite(void) +{ + CTL_RESPONSE response; + + current_state = "Trying to connect to your party's talk daemon"; + ctl_transact(his_machine_addr, msg, ANNOUNCE, &response); + remote_id = response.id_num; + if (response.answer != SUCCESS) { + if (response.answer < NANSWERS) + message(answers[response.answer]); + quit(); + } + /* leave the actual invitation on my talk daemon */ + ctl_transact(my_machine_addr, msg, LEAVE_INVITE, &response); + local_id = response.id_num; +} + +/* + * Tell the daemon to remove your invitation + */ +void +send_delete(void) +{ + + msg.type = DELETE; + /* + * This is just a extra clean up, so just send it + * and don't wait for an answer + */ + msg.id_num = htonl(remote_id); + daemon_addr.sin_addr = his_machine_addr; + if (sendto(ctl_sockt, &msg, sizeof (msg), 0, + (struct sockaddr *)&daemon_addr, + sizeof (daemon_addr)) != sizeof(msg)) + warn("send_delete (remote)"); + msg.id_num = htonl(local_id); + daemon_addr.sin_addr = my_machine_addr; + if (sendto(ctl_sockt, &msg, sizeof (msg), 0, + (struct sockaddr *)&daemon_addr, + sizeof (daemon_addr)) != sizeof (msg)) + warn("send_delete (local)"); +} diff --git a/usr.bin/talk/io.c b/usr.bin/talk/io.c new file mode 100644 index 0000000..f789f57 --- /dev/null +++ b/usr.bin/talk/io.c @@ -0,0 +1,139 @@ +/* $NetBSD: io.c,v 1.14 2011/09/06 18:32:03 joerg Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)io.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: io.c,v 1.14 2011/09/06 18:32:03 joerg Exp $"); +#endif /* not lint */ + +/* + * This file contains the I/O handling and the exchange of + * edit characters. This connection itself is established in + * ctl.c + */ + +#include "talk.h" +#include +#include +#include +#include +#include +#include +#include + +#define A_LONG_TIME 1000000 + +/* + * The routine to do the actual talking + */ +void +talk(void) +{ + struct pollfd set[2]; + int nb; + char buf[BUFSIZ]; + + message("Connection established\007\007\007"); + current_line = 0; + + /* + * Wait on both the other process (sockt_mask) and + * standard input ( STDIN_MASK ) + */ + set[0].fd = sockt; + set[0].events = POLLIN; + set[1].fd = fileno(stdin); + set[1].events = POLLIN; + for (;;) { + nb = poll(set, 2, A_LONG_TIME * 1000); + if (nb <= 0) { + if (errno == EINTR) + continue; + /* panic, we don't know what happened */ + p_error("Unexpected error from poll"); + quit(); + } + if (set[0].revents & POLLIN) { + /* There is data on sockt */ + nb = read(sockt, buf, sizeof buf); + if (nb <= 0) { + message("Connection closed. Exiting"); + quit(); + } + display(&his_win, buf, nb); + } + if (set[1].revents & POLLIN) { + /* + * We can't make the tty non_blocking, because + * curses's output routines would screw up + */ + ioctl(0, FIONREAD, (void *) &nb); + nb = read(0, buf, nb); + display(&my_win, buf, nb); + /* might lose data here because sockt is non-blocking */ + if (nb > 0) + write(sockt, buf, nb); + } + } +} + +/* + * p_error prints the system error message on the standard location + * on the screen and then exits. (i.e. a curses version of perror) + */ +void +p_error(const char *string) +{ + wmove(my_win.x_win, current_line%my_win.x_nlines, 0); + wprintw(my_win.x_win, "[%s : %s (%d)]\n", + string, strerror(errno), errno); + wrefresh(my_win.x_win); + move(LINES-1, 0); + refresh(); + quit(); +} + +/* + * Display string in the standard location + */ +void +message(const char *string) +{ + wmove(my_win.x_win, current_line % my_win.x_nlines, 0); + wprintw(my_win.x_win, "[%s]", string); + wclrtoeol(my_win.x_win); + current_line++; + wmove(my_win.x_win, current_line % my_win.x_nlines, 0); + wrefresh(my_win.x_win); +} diff --git a/usr.bin/talk/look_up.c b/usr.bin/talk/look_up.c new file mode 100644 index 0000000..1ff3d79 --- /dev/null +++ b/usr.bin/talk/look_up.c @@ -0,0 +1,119 @@ +/* $NetBSD: look_up.c,v 1.8 2012/03/20 20:34:59 matt Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)look_up.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: look_up.c,v 1.8 2012/03/20 20:34:59 matt Exp $"); +#endif /* not lint */ + +#include "talk.h" +#include +#include +#include "talk_ctl.h" + +/* + * See if the local daemon has an invitation for us. + */ +int +check_local(void) +{ + CTL_RESPONSE response; + CTL_RESPONSE *rp = &response; + struct sockaddr addr; + + /* the rest of msg was set up in get_names */ +#ifdef MSG_EOR + /* copy new style sockaddr to old, swap family (short in old) */ + msg.ctl_addr = *(struct talkd_sockaddr *)(void *)&ctl_addr; + msg.ctl_addr.sa_family = htons(ctl_addr.sin_family); +#else + msg.ctl_addr = *(struct sockaddr *)&ctl_addr; +#endif + /* must be initiating a talk */ + if (!look_for_invite(rp)) + return (0); + /* + * There was an invitation waiting for us, + * so connect with the other (hopefully waiting) party + */ + current_state = "Waiting to connect with caller"; + do { + if (rp->addr.sa_family != AF_INET) + p_error("Response uses invalid network address"); + + (void)memcpy(&addr, &rp->addr.sa_family, sizeof(addr)); + addr.sa_family = rp->addr.sa_family; + addr.sa_len = sizeof(addr); + + errno = 0; + if (connect(sockt, &addr, sizeof(addr)) != -1) + return (1); + } while (errno == EINTR); + if (errno == ECONNREFUSED) { + /* + * The caller gave up, but his invitation somehow + * was not cleared. Clear it and initiate an + * invitation. (We know there are no newer invitations, + * the talkd works LIFO.) + */ + ctl_transact(his_machine_addr, msg, DELETE, rp); + close(sockt); + open_sockt(); + return (0); + } + p_error("Unable to connect with initiator"); + /*NOTREACHED*/ + return (0); +} + +/* + * Look for an invitation on 'machine' + */ +int +look_for_invite(CTL_RESPONSE *rp) +{ + current_state = "Checking for invitation on caller's machine"; + ctl_transact(his_machine_addr, msg, LOOK_UP, rp); + /* the switch is for later options, such as multiple invitations */ + switch (rp->answer) { + + case SUCCESS: + msg.id_num = htonl(rp->id_num); + return (1); + + default: + /* there wasn't an invitation waiting for us */ + return (0); + } +} diff --git a/usr.bin/talk/msgs.c b/usr.bin/talk/msgs.c new file mode 100644 index 0000000..bb84843 --- /dev/null +++ b/usr.bin/talk/msgs.c @@ -0,0 +1,82 @@ +/* $NetBSD: msgs.c,v 1.7 2011/09/06 18:32:03 joerg Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +#if 0 +static char sccsid[] = "@(#)msgs.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: msgs.c,v 1.7 2011/09/06 18:32:03 joerg Exp $"); +#endif /* not lint */ + +/* + * A package to display what is happening every MSG_INTERVAL seconds + * if we are slow connecting. + */ + +#include +#include +#include +#include "talk.h" + +#define MSG_INTERVAL 4 + +const char *current_state; +int current_line = 0; + +void +disp_msg(int dummy) +{ + message(current_state); +} + +void +start_msgs(void) +{ + struct itimerval itimer; + + message(current_state); + signal(SIGALRM, disp_msg); + itimer.it_value.tv_sec = itimer.it_interval.tv_sec = MSG_INTERVAL; + itimer.it_value.tv_usec = itimer.it_interval.tv_usec = 0; + setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); +} + +void +end_msgs(void) +{ + struct itimerval itimer; + + timerclear(&itimer.it_value); + timerclear(&itimer.it_interval); + setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); + signal(SIGALRM, SIG_DFL); +} diff --git a/usr.bin/talk/talk.1 b/usr.bin/talk/talk.1 new file mode 100644 index 0000000..20d3ee2 --- /dev/null +++ b/usr.bin/talk/talk.1 @@ -0,0 +1,143 @@ +.\" $NetBSD: talk.1,v 1.9 2007/01/08 17:10:59 christos Exp $ +.\" +.\" Copyright (c) 1983, 1990, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)talk.1 8.1 (Berkeley) 6/6/93 +.\" +.Dd January 7, 2007 +.Dt TALK 1 +.Os +.Sh NAME +.Nm talk +.Nd talk to another user +.Sh SYNOPSIS +.Nm +.Ar person +.Op Ar ttyname +.Sh DESCRIPTION +.Nm +is a visual communication program which copies lines from your +terminal to that of another user. +.Pp +Options available: +.Bl -tag -width ttyname +.It Ar person +If you wish to talk to someone on your own machine, then +.Ar person +is just the person's login name. +If you wish to talk to a user on another host, then +.Ar person +is of the form +.Ql user@host . +.It Ar ttyname +If you wish to talk to a user who is logged in more than once, the +.Ar ttyname +argument may be used to indicate the appropriate terminal +name, where +.Ar ttyname +is of the form +.Ql ttyXX . +.El +.Pp +When first called, +.Nm +sends the message +.Bd -literal -offset indent -compact +Message from TalkDaemon@his_machine... +talk: connection requested by your_name@your_machine. +talk: respond with: talk your_name@your_machine +.Ed +.Pp +to the user you wish to talk to. +At this point, the recipient +of the message should reply by typing +.Pp +.Dl talk \ your_name@your_machine +.Pp +It doesn't matter from which machine the recipient replies, as +long as his login-name is the same. +Once communication is established, +the two parties may type simultaneously, with their output appearing +in separate windows. +Typing control-L +.Ql ^L +will cause the screen to +be reprinted, while your erase, kill, and word kill characters will +behave normally. +To exit, just type your interrupt character; +.Nm +then moves the cursor to the bottom of the screen and restores the +terminal to its previous state. +.Pp +Permission to talk may be denied or granted by use of the +.Xr mesg 1 +command. +At the outset talking is allowed. +Certain commands, in +particular +.Xr nroff 1 +and +.Xr pr 1 , +disallow messages in order to +prevent messy output. +.Sh ENVIRONMENT +If the +.Ev TALKHOST +environment variable is set, its value is used as the +.Ar hostname +the +.Nm +packets appear to be originating from. +This is useful if you wish to talk to someone on another machine and +your internal hostname does not resolve to the address of your +external interface as seen from the other machine. +.Sh FILES +.Bl -tag -width /var/run/utmp -compact +.It Pa /etc/hosts +to find the recipient's machine +.It Pa /var/run/utmp +to find the recipient's tty +.El +.Sh SEE ALSO +.Xr mail 1 , +.Xr mesg 1 , +.Xr who 1 , +.Xr write 1 +.Sh HISTORY +The +.Nm +command appeared in +.Bx 4.2 . +.Sh BUGS +The version of +.Nm +released with +.Bx 4.3 +uses a protocol that +is incompatible with the protocol used in the version released with +.Bx 4.2 . diff --git a/usr.bin/talk/talk.c b/usr.bin/talk/talk.c new file mode 100644 index 0000000..2d71253 --- /dev/null +++ b/usr.bin/talk/talk.c @@ -0,0 +1,79 @@ +/* $NetBSD: talk.c,v 1.8 2011/09/06 18:32:03 joerg Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +__COPYRIGHT("@(#) Copyright (c) 1983, 1993\ + The Regents of the University of California. All rights reserved."); +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)talk.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: talk.c,v 1.8 2011/09/06 18:32:03 joerg Exp $"); +#endif /* not lint */ + +#include "talk.h" +#include + +/* + * talk: A visual form of write. Using sockets, a two way + * connection is set up between the two people talking. + * With the aid of curses, the screen is split into two + * windows, and each users text is added to the window, + * one character at a time... + * + * Written by Kipp Hickman + * + * Modified to run under 4.1a by Clem Cole and Peter Moore + * Modified to run between hosts by Peter Moore, 8/19/82 + * Modified to run under 4.1c by Peter Moore 3/17/83 + */ + +int +main(int argc, char *argv[]) +{ + setlocale(LC_ALL, ""); + + get_names(argc, argv); + init_display(); + open_ctl(); + open_sockt(); + start_msgs(); + if (!check_local()) + invite_remote(); + end_msgs(); + set_edit_chars(); + talk(); + /* NOTREACHED */ + return (0); +} diff --git a/usr.bin/talk/talk.h b/usr.bin/talk/talk.h new file mode 100644 index 0000000..77cfac7 --- /dev/null +++ b/usr.bin/talk/talk.h @@ -0,0 +1,89 @@ +/* $NetBSD: talk.h,v 1.9 2011/09/06 18:32:03 joerg Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)talk.h 8.1 (Berkeley) 6/6/93 + */ + +#include +#include +#include +#include +#include +#include +#include + +extern int sockt; +extern int curses_initialized; +extern int invitation_waiting; + +extern const char *current_state; +extern int current_line; + +typedef struct xwin { + WINDOW *x_win; + int x_nlines; + int x_ncols; + int x_line; + int x_col; + char kill; + char cerase; + char werase; +} xwin_t; + +extern xwin_t my_win; +extern xwin_t his_win; +extern WINDOW *line_win; + +void announce_invite(void); +int check_local(void); +void ctl_transact(struct in_addr, CTL_MSG, int, CTL_RESPONSE *); +void display(xwin_t *, char *, int); +void disp_msg(int); +void end_msgs(void); +void get_addrs(const char *, const char *); +void get_names(int, char **); +void init_display(void); +void invite_remote(void); +int look_for_invite(CTL_RESPONSE *); +int max(int, int); +void message(const char *); +void open_ctl(void); +void open_sockt(void); +void print_addr(struct sockaddr_in); +void p_error(const char *) __dead; +void quit(void) __dead; +int readwin(WINDOW *, int, int); +void re_invite(int) __dead; +void send_delete(void); +void set_edit_chars(void); +void sig_sent(int) __dead; +void start_msgs(void); +void talk(void) __dead; +void xscroll(xwin_t *, int); diff --git a/usr.bin/talk/talk_ctl.h b/usr.bin/talk/talk_ctl.h new file mode 100644 index 0000000..e4bab52 --- /dev/null +++ b/usr.bin/talk/talk_ctl.h @@ -0,0 +1,41 @@ +/* $NetBSD: talk_ctl.h,v 1.4 2003/08/07 11:16:05 agc Exp $ */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)talk_ctl.h 8.1 (Berkeley) 6/6/93 + */ + +extern struct sockaddr_in daemon_addr; +extern struct sockaddr_in ctl_addr; +extern struct sockaddr_in my_addr; +extern struct in_addr my_machine_addr; +extern struct in_addr his_machine_addr; +extern u_short daemon_port; +extern int ctl_sockt; +extern CTL_MSG msg; -- cgit v1.2.3-60-g2f50