+tolocal(argc, argv)
+ int argc;
+ char **argv;
+{
+ int i;
+ char *bp, *host, *src, *suser;
+ char *colon(), *malloc();
+
+ for (i = 0; i < argc - 1; i++) {
+ if (!(src = colon(argv[i]))) { /* local to local */
+ if (!(bp = malloc((u_int)(strlen(_PATH_CP) +
+ strlen(argv[i]) + strlen(argv[argc - 1])) + 20)))
+ nospace();
+ (void)sprintf(bp, "%s%s%s %s %s", _PATH_CP,
+ iamrecursive ? " -r" : "", pflag ? " -p" : "",
+ argv[i], argv[argc - 1]);
+ (void)susystem(bp);
+ (void)free(bp);
+ continue;
+ }
+ *src++ = 0;
+ if (*src == 0)
+ src = ".";
+ host = index(argv[i], '@');
+ if (host) {
+ *host++ = 0;
+ suser = argv[i];
+ if (*suser == '\0')
+ suser = pwd->pw_name;
+ else if (!okname(suser))
+ continue;
+ } else {
+ host = argv[i];
+ suser = pwd->pw_name;
+ }
+ if (!(bp = malloc((u_int)(strlen(src)) + CMDNEEDS + 20)))
+ nospace();
+ (void)sprintf(bp, "%s -f %s", cmd, src);
+#ifdef KERBEROS
+ if (use_kerberos)
+ kerberos(bp, suser);
+ else
+#endif
+ rem = rcmd(&host, port, pwd->pw_name, suser, bp, 0);
+ (void)free(bp);
+ if (rem < 0)
+ continue;
+ (void)setreuid(0, userid);
+ sink(1, argv + argc - 1);
+ (void)setreuid(userid, 0);
+ (void)close(rem);
+ rem = -1;
+ }
+}
+
+#ifdef KERBEROS
+kerberos(bp, user)
+ char *bp, *user;
+{
+ struct servent *sp;
+ char *host;
+
+again: rem = KSUCCESS;
+ if (krb_realm[0] == '\0')
+ rem = krb_get_lrealm(krb_realm, 1);
+ if (rem == KSUCCESS) {
+ if (encrypt)
+ rem = krcmd_mutual(&host, port, user, bp, 0,
+ krb_realm, &cred, schedule);
+ else
+ rem = krcmd(&host, port, user, bp, 0, krb_realm);
+ } else {
+ (void)fprintf(stderr,
+ "rcp: error getting local realm %s\n", krb_err_txt[rem]);
+ exit(1);
+ }
+ if (rem < 0 && errno == ECONNREFUSED) {
+ use_kerberos = 0;
+ old_warning("remote host doesn't support Kerberos");
+ sp = getservbyname("shell", "tcp");
+ if (sp == NULL) {
+ (void)fprintf(stderr,
+ "rcp: unknown service shell/tcp\n");
+ exit(1);
+ }
+ port = sp->s_port;
+ goto again;
+ }
+}
+#endif /* KERBEROS */
+