1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2017 Gary Mills
  24  * Copyright 1997 Sun Microsystems, Inc.  All rights reserved.
  25  * Use is subject to license terms.
  26  */
  27 
  28 /*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
  29 /*        All Rights Reserved   */
  30 
  31 /*
  32  * University Copyright- Copyright (c) 1982, 1986, 1988
  33  * The Regents of the University of California
  34  * All Rights Reserved
  35  *
  36  * University Acknowledgment- Portions of this document are derived from
  37  * software developed by the University of California, Berkeley, and its
  38  * contributors.
  39  */
  40 
  41 #include "talk.h"
  42 #include "ctl.h"
  43 #include <locale.h>
  44 #include <pwd.h>
  45 #include <sys/systeminfo.h>
  46 
  47 char *getlogin(), *ttyname(int);
  48 
  49 extern CTL_MSG msg;
  50 
  51 /*
  52  * Determine the local and remote user, tty, and machines
  53  */
  54 
  55 struct hostent *gethostbyname();
  56 
  57 void
  58 get_names(argc, argv)
  59 int argc;
  60 char *argv[];
  61 {
  62         char hostname[HOST_NAME_LENGTH + 1];
  63         char *rem_name;
  64         char *my_name;
  65         char *my_machine_name;
  66         char *rem_machine_name;
  67         char *rem_tty;
  68         char *ptr;
  69         int name_length;
  70 
  71         if (argc < 2) {
  72                 fprintf(stderr,
  73                     "Usage: talk %s\n", gettext("address [terminal]"));
  74                 exit(1);
  75         }
  76         if (!isatty(0)) {
  77                 fprintf(stderr,
  78         gettext("Standard input must be a tty, not a pipe or a file\n"));
  79                 exit(1);
  80         }
  81 
  82         if (!isatty(1)) {
  83                 fprintf(stderr,
  84         gettext("Standard output must be a tty, not a pipe or a file\n"));
  85                 exit(1);
  86         }
  87 
  88         if ((my_name = getlogin()) == NULL) {
  89         struct passwd *pass = getpwuid(getuid());
  90         if (pass != NULL)
  91                 my_name = pass->pw_name;
  92         }
  93         if (my_name == NULL) {
  94                 fprintf(stderr,
  95         gettext("Who are you?  You have no entry in /etc/utmp!  Aborting..\n"));
  96                 exit(1);
  97         }
  98 
  99         name_length = HOST_NAME_LENGTH;
 100         (void) sysinfo(SI_HOSTNAME, hostname, name_length);
 101         my_machine_name = hostname;
 102 
 103         /*
 104          * check for, and strip out, the machine name of the target
 105          */
 106 
 107         for (ptr = argv[1]; *ptr != '\0' &&
 108                          *ptr != '@' &&
 109                          *ptr != ':' &&
 110                          *ptr != '!' &&
 111                          *ptr != '.'; ptr++) {
 112         }
 113 
 114         if (*ptr == '\0') {
 115 
 116                 /* this is a local to local talk */
 117 
 118         rem_name = argv[1];
 119         rem_machine_name = my_machine_name;
 120 
 121         } else {
 122 
 123         if (*ptr == '@') {
 124                 /* user@host */
 125                 rem_name = argv[1];
 126                 rem_machine_name = ptr + 1;
 127         } else {
 128                 /* host.user or host!user or host:user */
 129                 rem_name = ptr + 1;
 130                 rem_machine_name = argv[1];
 131         }
 132         *ptr = '\0';
 133         }
 134 
 135 
 136         if (argc > 2) {
 137         rem_tty = argv[2];      /* tty name is arg 2 */
 138         } else {
 139         rem_tty = "";
 140         }
 141 
 142         get_addrs(my_machine_name, rem_machine_name);
 143 
 144         /* Load these useful values into the standard message header */
 145 
 146         msg.id_num = 0;
 147 
 148         strncpy(msg.l_name, my_name, NAME_SIZE);
 149         msg.l_name[NAME_SIZE - 1] = '\0';
 150 
 151         strncpy(msg.r_name, rem_name, NAME_SIZE);
 152         msg.r_name[NAME_SIZE - 1] = '\0';
 153 
 154         strncpy(msg.r_tty, rem_tty, TTY_SIZE);
 155         msg.r_tty[TTY_SIZE - 1] = '\0';
 156 }