|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)get_names.c 5.5 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include "talk.h"
23: #include <sys/param.h>
24: #include <protocols/talkd.h>
25: #include <pwd.h>
26:
27: char *getlogin();
28: char *ttyname();
29: char *rindex();
30: extern CTL_MSG msg;
31:
32: /*
33: * Determine the local and remote user, tty, and machines
34: */
35: get_names(argc, argv)
36: int argc;
37: char *argv[];
38: {
39: char hostname[MAXHOSTNAMELEN];
40: char *his_name, *my_name;
41: char *my_machine_name, *his_machine_name;
42: char *my_tty, *his_tty;
43: register char *cp;
44:
45: if (argc < 2 ) {
46: printf("Usage: talk user [ttyname]\n");
47: exit(-1);
48: }
49: if (!isatty(0)) {
50: printf("Standard input must be a tty, not a pipe or a file\n");
51: exit(-1);
52: }
53: if ((my_name = getlogin()) == NULL) {
54: struct passwd *pw;
55:
56: if ((pw = getpwuid(getuid())) == NULL) {
57: printf("You don't exist. Go away.\n");
58: exit(-1);
59: }
60: my_name = pw->pw_name;
61: }
62: gethostname(hostname, sizeof (hostname));
63: my_machine_name = hostname;
64: /* check for, and strip out, the machine name of the target */
65: for (cp = argv[1]; *cp && !any(*cp, "@:!."); cp++)
66: ;
67: if (*cp == '\0') {
68: /* this is a local to local talk */
69: his_name = argv[1];
70: his_machine_name = my_machine_name;
71: } else {
72: if (*cp++ == '@') {
73: /* user@host */
74: his_name = argv[1];
75: his_machine_name = cp;
76: } else {
77: /* host.user or host!user or host:user */
78: his_name = cp;
79: his_machine_name = argv[1];
80: }
81: *--cp = '\0';
82: }
83: if (argc > 2)
84: his_tty = argv[2]; /* tty name is arg 2 */
85: else
86: his_tty = "";
87: get_addrs(my_machine_name, his_machine_name);
88: /*
89: * Initialize the message template.
90: */
91: msg.vers = TALK_VERSION;
92: msg.addr.sa_family = htons(AF_INET);
93: msg.ctl_addr.sa_family = htons(AF_INET);
94: msg.id_num = htonl(0);
95: strncpy(msg.l_name, my_name, NAME_SIZE);
96: msg.l_name[NAME_SIZE - 1] = '\0';
97: strncpy(msg.r_name, his_name, NAME_SIZE);
98: msg.r_name[NAME_SIZE - 1] = '\0';
99: strncpy(msg.r_tty, his_tty, TTY_SIZE);
100: msg.r_tty[TTY_SIZE - 1] = '\0';
101: }
102:
103: static
104: any(c, cp)
105: register char c, *cp;
106: {
107:
108: while (*cp)
109: if (c == *cp++)
110: return (1);
111: return (0);
112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.