]> andersk Git - openssh.git/blobdiff - scp.c
- Checks for 64 bit int types. Problem report from Mats Fredholm
[openssh.git] / scp.c
diff --git a/scp.c b/scp.c
index 7a2f0423a1a2300b63e2a756dcae5a13dddeb46e..18e2333519d3a6bd2001a0ba29311892d29e8fd9 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -74,6 +74,12 @@ off_t totalbytes = 0;
 /* Name of current file being transferred. */
 char *curfile;
 
+/* This is set to non-zero if IPv4 is desired. */
+int IPv4 = 0;
+
+/* This is set to non-zero if IPv6 is desired. */
+int IPv6 = 0;
+
 /* This is set to non-zero to enable verbose mode. */
 int verbose_mode = 0;
 
@@ -145,6 +151,11 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout)
                args[i++] = SSH_PROGRAM;
                args[i++] = "-x";
                args[i++] = "-oFallBackToRsh no";
+               if (IPv4)
+                       args[i++] = "-4";
+               if (IPv6)
+                       args[i++] = "-6";
+               args[i++] = "-oFallBackToRsh no";
                if (verbose_mode)
                        args[i++] = "-v";
                if (compress_flag)
@@ -242,9 +253,15 @@ main(argc, argv)
        extern int optind;
 
        fflag = tflag = 0;
-       while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q")) != EOF)
+       while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q46")) != EOF)
                switch (ch) {
                /* User-visible flags. */
+               case '4':
+                       IPv4 = 1;
+                       break;
+               case '6':
+                       IPv6 = 1;
+                       break;
                case 'p':
                        pflag = 1;
                        break;
@@ -334,6 +351,17 @@ main(argc, argv)
        exit(errs != 0);
 }
 
+char *
+cleanhostname(host)
+       char *host;
+{
+       if (*host == '[' && host[strlen(host) - 1] == ']') {
+               host[strlen(host) - 1] = '\0';
+               return (host + 1);
+       } else
+               return host;
+}
+
 void
 toremote(targ, argc, argv)
        char *targ, *argv[];
@@ -372,6 +400,7 @@ toremote(targ, argc, argv)
                        bp = xmalloc(len);
                        if (host) {
                                *host++ = 0;
+                               host = cleanhostname(host);
                                suser = argv[i];
                                if (*suser == '\0')
                                        suser = pwd->pw_name;
@@ -383,13 +412,15 @@ toremote(targ, argc, argv)
                                               suser, host, cmd, src,
                                               tuser ? tuser : "", tuser ? "@" : "",
                                               thost, targ);
-                       } else
+                       } else {
+                               host = cleanhostname(argv[i]);
                                (void) sprintf(bp,
                                               "exec %s%s -x -o'FallBackToRsh no' -n %s %s %s '%s%s%s:%s'",
                                               SSH_PROGRAM, verbose_mode ? " -v" : "",
-                                              argv[i], cmd, src,
+                                              host, cmd, src,
                                               tuser ? tuser : "", tuser ? "@" : "",
                                               thost, targ);
+                       }
                        if (verbose_mode)
                                fprintf(stderr, "Executing: %s\n", bp);
                        (void) system(bp);
@@ -399,7 +430,7 @@ toremote(targ, argc, argv)
                                len = strlen(targ) + CMDNEEDS + 20;
                                bp = xmalloc(len);
                                (void) sprintf(bp, "%s -t %s", cmd, targ);
-                               host = thost;
+                               host = cleanhostname(thost);
                                if (do_cmd(host, tuser,
                                           bp, &remin, &remout) < 0)
                                        exit(1);
@@ -449,6 +480,7 @@ tolocal(argc, argv)
                        else if (!okname(suser))
                                continue;
                }
+               host = cleanhostname(host);
                len = strlen(src) + CMDNEEDS + 20;
                bp = xmalloc(len);
                (void) sprintf(bp, "%s -f %s", cmd, src);
@@ -913,7 +945,7 @@ void
 usage()
 {
        (void) fprintf(stderr,
-                      "usage: scp [-pqrvC] [-P port] [-c cipher] [-i identity] f1 f2; or:\n       scp [options] f1 ... fn directory\n");
+                      "usage: scp [-pqrvC46] [-P port] [-c cipher] [-i identity] f1 f2; or:\n       scp [options] f1 ... fn directory\n");
        exit(1);
 }
 
@@ -922,22 +954,24 @@ run_err(const char *fmt,...)
 {
        static FILE *fp;
        va_list ap;
-       va_start(ap, fmt);
 
        ++errs;
        if (fp == NULL && !(fp = fdopen(remout, "w")))
                return;
        (void) fprintf(fp, "%c", 0x01);
        (void) fprintf(fp, "scp: ");
+       va_start(ap, fmt);
        (void) vfprintf(fp, fmt, ap);
+       va_end(ap);
        (void) fprintf(fp, "\n");
        (void) fflush(fp);
 
        if (!iamremote) {
+               va_start(ap, fmt);
                vfprintf(stderr, fmt, ap);
+               va_end(ap);
                fprintf(stderr, "\n");
        }
-       va_end(ap);
 }
 
 /* Stuff below is from BSD rcp util.c. */
@@ -981,11 +1015,19 @@ char *
 colon(cp)
        char *cp;
 {
+       int flag = 0;
+
        if (*cp == ':')         /* Leading colon is part of file name. */
                return (0);
+       if (*cp == '[')
+               flag = 1;
 
        for (; *cp; ++cp) {
-               if (*cp == ':')
+               if (*cp == '@' && *(cp+1) == '[')
+                       flag = 1;
+               if (*cp == ']' && *(cp+1) == ':' && flag)
+                       return (cp+1);
+               if (*cp == ':' && !flag)
                        return (cp);
                if (*cp == '/')
                        return (0);
@@ -1025,7 +1067,7 @@ okname(cp0)
        } while (*++cp);
        return (1);
 
-bad:   fprintf(stderr, "%s: invalid user name", cp0);
+bad:   fprintf(stderr, "%s: invalid user name\n", cp0);
        return (0);
 }
 
This page took 0.036085 seconds and 4 git commands to generate.