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 }