date and time created 88/12/22 13:04:38 by sam
[unix-history] / usr / src / usr.bin / talk / get_names.c
index 31df536..48c40ba 100644 (file)
@@ -1,15 +1,33 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)get_names.c        1.2 (Berkeley) %G%";
-#endif
+static char sccsid[] = "@(#)get_names.c        5.5 (Berkeley) %G%";
+#endif /* not lint */
 
 #include "talk.h"
 
 #include "talk.h"
-#include "ctl.h"
+#include <sys/param.h>
+#include <protocols/talkd.h>
+#include <pwd.h>
 
 
-char *getlogin(), *ttyname(), *rindex();
-
-extern CTL_MSG msg;
-
-struct hostent *gethostbyname();
+char   *getlogin();
+char   *ttyname();
+char   *rindex();
+extern CTL_MSG msg;
 
 /*
  * Determine the local and remote user, tty, and machines
 
 /*
  * Determine the local and remote user, tty, and machines
@@ -18,58 +36,62 @@ get_names(argc, argv)
        int argc;
        char *argv[];
 {
        int argc;
        char *argv[];
 {
-       char hostname[HOST_NAME_LENGTH];
-       char *his_name;
-       char *my_name;
-       char *my_machine_name;
-       char *his_machine_name;
-       char *my_tty;
-       char *his_tty;
-       char *ptr;
+       char hostname[MAXHOSTNAMELEN];
+       char *his_name, *my_name;
+       char *my_machine_name, *his_machine_name;
+       char *my_tty, *his_tty;
+       register char *cp;
 
        if (argc < 2 ) {
 
        if (argc < 2 ) {
-               printf("Usage:  talk user [ttyname]\n");
+               printf("Usage: talk user [ttyname]\n");
                exit(-1);
        }
        if (!isatty(0)) {
                printf("Standard input must be a tty, not a pipe or a file\n");
                exit(-1);
        }
                exit(-1);
        }
        if (!isatty(0)) {
                printf("Standard input must be a tty, not a pipe or a file\n");
                exit(-1);
        }
-       my_name = getlogin();
-       if (my_name == NULL) {
-               printf("You don't exist. Go away.\n");
-               exit(-1);
+       if ((my_name = getlogin()) == NULL) {
+               struct passwd *pw;
+
+               if ((pw = getpwuid(getuid())) == NULL) {
+                       printf("You don't exist. Go away.\n");
+                       exit(-1);
+               }
+               my_name = pw->pw_name;
        }
        gethostname(hostname, sizeof (hostname));
        my_machine_name = hostname;
        }
        gethostname(hostname, sizeof (hostname));
        my_machine_name = hostname;
-       my_tty = rindex(ttyname(0), '/') + 1;
        /* check for, and strip out, the machine name of the target */
        /* check for, and strip out, the machine name of the target */
-       for (ptr = argv[1]; *ptr != '\0' && *ptr != '@' && *ptr != ':' &&
-           *ptr != '!' && *ptr != '.'; ptr++)
+       for (cp = argv[1]; *cp && !any(*cp, "@:!."); cp++)
                ;
                ;
-       if (*ptr == '\0') {
+       if (*cp == '\0') {
                /* this is a local to local talk */
                his_name = argv[1];
                his_machine_name = my_machine_name;
        } else {
                /* this is a local to local talk */
                his_name = argv[1];
                his_machine_name = my_machine_name;
        } else {
-               if (*ptr == '@') {
+               if (*cp++ == '@') {
                        /* user@host */
                        his_name = argv[1];
                        /* user@host */
                        his_name = argv[1];
-                       his_machine_name = ptr + 1;
+                       his_machine_name = cp;
                } else {
                        /* host.user or host!user or host:user */
                } else {
                        /* host.user or host!user or host:user */
-                       his_name = ptr + 1;
+                       his_name = cp;
                        his_machine_name = argv[1];
                }
                        his_machine_name = argv[1];
                }
-               *ptr = '\0';
+               *--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);
        }
        if (argc > 2)
                his_tty = argv[2];      /* tty name is arg 2 */
        else
                his_tty = "";
        get_addrs(my_machine_name, his_machine_name);
-       /* Load these useful values into the standard message header */
-       msg.id_num = 0;
+       /*
+        * 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);
        strncpy(msg.l_name, my_name, NAME_SIZE);
        msg.l_name[NAME_SIZE - 1] = '\0';
        strncpy(msg.r_name, his_name, NAME_SIZE);
@@ -77,3 +99,14 @@ get_names(argc, argv)
        strncpy(msg.r_tty, his_tty, TTY_SIZE);
        msg.r_tty[TTY_SIZE - 1] = '\0';
 }
        strncpy(msg.r_tty, his_tty, TTY_SIZE);
        msg.r_tty[TTY_SIZE - 1] = '\0';
 }
+
+static
+any(c, cp)
+       register char c, *cp;
+{
+
+       while (*cp)
+               if (c == *cp++)
+                       return (1);
+       return (0);
+}