- char buf[BUFSIZ], *cp = buf;
-
- errs++;
- *cp++ = 1;
- (void) sprintf(cp, fmt, a1, a2, a3, a4, a5);
- (void) write(rem, buf, strlen(buf));
- if (iamremote == 0)
- (void) write(2, buf+1, strlen(buf+1));
+ static FILE *fp;
+
+ ++errs;
+ if (!fp && !(fp = fdopen(rem, "w")))
+ return;
+ (void)fprintf(fp, "%c", 0x01);
+ (void)fprintf(fp, fmt, a1, a2, a3);
+ (void)fflush(fp);
+ if (!iamremote)
+ (void)fprintf(stderr, fmt, a1, a2, a3);
+}
+
+nospace()
+{
+ (void)fprintf(stderr, "rcp: out of memory.\n");
+ exit(1);
+}
+
+
+usage()
+{
+#ifdef KERBEROS
+#ifdef CRYPT
+ (void)fprintf(stderr, "%s\n\t%s\n",
+ "usage: rcp [-k realm] [-px] f1 f2",
+ "or: rcp [-k realm] [-rpx] f1 ... fn directory");
+#else
+ (void)fprintf(stderr, "%s\n\t%s\n",
+ "usage: rcp [-k realm] [-p] f1 f2",
+ "or: rcp [-k realm] [-rp] f1 ... fn directory");
+#endif
+#else
+ (void)fprintf(stderr,
+ "usage: rcp [-p] f1 f2; or: rcp [-rp] f1 ... fn directory\n");
+#endif
+ exit(1);
+}
+
+#ifdef KERBEROS
+old_warning(str)
+ char *str;
+{
+ (void)fprintf(stderr, "rcp: warning: %s, using standard rcp\n", str);
+}
+
+int
+kerberos(host, bp, locuser, user)
+
+ char **host, *bp, *locuser, *user;
+{
+ struct servent *sp;
+
+again:
+ if (use_kerberos) {
+ rem = KSUCCESS;
+ errno = 0;
+ if (dest_realm == NULL)
+ dest_realm = krb_realmofhost(*host);
+
+#ifdef CRYPT
+ if (doencrypt)
+ rem = krcmd_mutual(
+ host, port,
+ user, bp, 0,
+ dest_realm,
+ &cred, schedule);
+ else
+#endif
+ rem = krcmd(
+ host, port,
+ user, bp, 0, dest_realm);
+
+ if (rem < 0) {
+ use_kerberos = 0;
+ sp = getservbyname("shell", "tcp");
+ if (sp == NULL) {
+ (void)fprintf(stderr,
+ "rcp: unknown service shell/tcp\n");
+ exit(1);
+ }
+ if (errno == ECONNREFUSED)
+ old_warning(
+ "remote host doesn't support Kerberos");
+
+ if (errno == ENOENT)
+ old_warning(
+ "Can't provide Kerberos auth data");
+ port = sp->s_port;
+ goto again;
+ }
+ } else {
+#ifdef CRYPT
+ if (doencrypt) {
+ fprintf(stderr,
+ "The -x option requires Kerberos authentication\n");
+ exit(1);
+ }
+#endif
+ rem = rcmd(host, sp->s_port, locuser, user, bp, 0);
+ }
+ return(rem);