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 1997 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27/*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
28/*	  All Rights Reserved  	*/
29
30/*
31 * University Copyright- Copyright (c) 1982, 1986, 1988
32 * The Regents of the University of California
33 * All Rights Reserved
34 *
35 * University Acknowledgment- Portions of this document are derived from
36 * software developed by the University of California, Berkeley, and its
37 * contributors.
38 */
39
40#pragma ident	"%Z%%M%	%I%	%E% SMI"
41
42#include "talk.h"
43#include "ctl.h"
44#include <locale.h>
45#include <pwd.h>
46#include <sys/systeminfo.h>
47
48char *getlogin(), *ttyname(int);
49
50extern CTL_MSG msg;
51
52/*
53 * Determine the local and remote user, tty, and machines
54 */
55
56struct hostent *gethostbyname();
57
58void
59get_names(argc, argv)
60int argc;
61char *argv[];
62{
63	char hostname[HOST_NAME_LENGTH + 1];
64	char *rem_name;
65	char *my_name;
66	char *my_machine_name;
67	char *rem_machine_name;
68	char *my_tty;
69	char *rem_tty;
70	char *ptr;
71	int name_length;
72
73	if (argc < 2) {
74		fprintf(stderr,
75		    "Usage: talk %s\n", gettext("address [terminal]"));
76		exit(1);
77	}
78	if (!isatty(0)) {
79		fprintf(stderr,
80	gettext("Standard input must be a tty, not a pipe or a file\n"));
81		exit(1);
82	}
83
84	if (!isatty(1)) {
85		fprintf(stderr,
86	gettext("Standard output must be a tty, not a pipe or a file\n"));
87		exit(1);
88	}
89
90	if ((my_name = getlogin()) == NULL) {
91	struct passwd *pass = getpwuid(getuid());
92	if (pass != NULL)
93		my_name = pass->pw_name;
94	}
95	if (my_name == NULL) {
96		fprintf(stderr,
97	gettext("Who are you?  You have no entry in /etc/utmp!  Aborting..\n"));
98		exit(1);
99	}
100
101	name_length = HOST_NAME_LENGTH;
102	(void) sysinfo(SI_HOSTNAME, hostname, name_length);
103	my_machine_name = hostname;
104
105	my_tty = strrchr(ttyname(0), '/') + 1;
106
107	/*
108	 * check for, and strip out, the machine name of the target
109	 */
110
111	for (ptr = argv[1]; *ptr != '\0' &&
112			 *ptr != '@' &&
113			 *ptr != ':' &&
114			 *ptr != '!' &&
115			 *ptr != '.'; ptr++) {
116	}
117
118	if (*ptr == '\0') {
119
120		/* this is a local to local talk */
121
122	rem_name = argv[1];
123	rem_machine_name = my_machine_name;
124
125	} else {
126
127	if (*ptr == '@') {
128		/* user@host */
129		rem_name = argv[1];
130		rem_machine_name = ptr + 1;
131	} else {
132		/* host.user or host!user or host:user */
133		rem_name = ptr + 1;
134		rem_machine_name = argv[1];
135	}
136	*ptr = '\0';
137	}
138
139
140	if (argc > 2) {
141	rem_tty = argv[2];	/* tty name is arg 2 */
142	} else {
143	rem_tty = "";
144	}
145
146	get_addrs(my_machine_name, rem_machine_name);
147
148	/* Load these useful values into the standard message header */
149
150	msg.id_num = 0;
151
152	strncpy(msg.l_name, my_name, NAME_SIZE);
153	msg.l_name[NAME_SIZE - 1] = '\0';
154
155	strncpy(msg.r_name, rem_name, NAME_SIZE);
156	msg.r_name[NAME_SIZE - 1] = '\0';
157
158	strncpy(msg.r_tty, rem_tty, TTY_SIZE);
159	msg.r_tty[TTY_SIZE - 1] = '\0';
160}
161