diff options
author | Damien Miller <djm@mindrot.org> | 2000-01-14 15:45:46 +1100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2000-01-14 15:45:46 +1100 |
commit | 34132e54cbd221d17d373fc54f4e3f7b85727f7f (patch) | |
tree | 7c73917b1082ff91786f9e02d25b853bedd1d472 /scp.c | |
parent | 25e4256ad4f453d8a7c1866243ec1984f859b1de (diff) |
- Merged OpenBSD IPv6 patch:
- [sshd.c sshd.8 sshconnect.c ssh.h ssh.c servconf.h servconf.c scp.1]
[scp.c packet.h packet.c login.c log.c canohost.c channels.c]
[hostfile.c sshd_config]
ipv6 support: mostly gethostbyname->getaddrinfo/getnameinfo, new
features: sshd allows multiple ListenAddress and Port options. note
that libwrap is not IPv6-ready. (based on patches from
fujiwara@rcac.tdi.co.jp)
- [ssh.c canohost.c]
more hints (hints.ai_socktype=SOCK_STREAM) for getaddrinfo,
from itojun@
- [channels.c]
listen on _all_ interfaces for X11-Fwd (hints.ai_flags = AI_PASSIVE)
- [packet.h]
allow auth-kerberos for IPv4 only
- [scp.1 sshd.8 servconf.h scp.c]
document -4, -6, and 'ssh -L 2022/::1/22'
- [ssh.c]
'ssh @host' is illegal (null user name), from
karsten@gedankenpolizei.de
- [sshconnect.c]
better error message
- [sshd.c]
allow auth-kerberos for IPv4 only
- Big IPv6 merge:
- Cleanup overrun in sockaddr copying on RHL 6.1
- Replacements for getaddrinfo, getnameinfo, etc based on versions
from patch from KIKUCHI Takahiro <kick@kyoto.wide.ad.jp>
- Replacement for missing structures on systems that lack IPv6
- record_login needed to know about AF_INET6 addresses
- Borrowed more code from OpenBSD: rresvport_af and requisites
Diffstat (limited to 'scp.c')
-rw-r--r-- | scp.c | 56 |
1 files changed, 48 insertions, 8 deletions
@@ -45,7 +45,7 @@ | |||
45 | */ | 45 | */ |
46 | 46 | ||
47 | #include "includes.h" | 47 | #include "includes.h" |
48 | RCSID("$Id: scp.c,v 1.15 1999/12/30 22:16:40 damien Exp $"); | 48 | RCSID("$Id: scp.c,v 1.16 2000/01/14 04:45:51 damien Exp $"); |
49 | 49 | ||
50 | #include "ssh.h" | 50 | #include "ssh.h" |
51 | #include "xmalloc.h" | 51 | #include "xmalloc.h" |
@@ -74,6 +74,12 @@ off_t totalbytes = 0; | |||
74 | /* Name of current file being transferred. */ | 74 | /* Name of current file being transferred. */ |
75 | char *curfile; | 75 | char *curfile; |
76 | 76 | ||
77 | /* This is set to non-zero if IPv4 is desired. */ | ||
78 | int IPv4 = 0; | ||
79 | |||
80 | /* This is set to non-zero if IPv6 is desired. */ | ||
81 | int IPv6 = 0; | ||
82 | |||
77 | /* This is set to non-zero to enable verbose mode. */ | 83 | /* This is set to non-zero to enable verbose mode. */ |
78 | int verbose_mode = 0; | 84 | int verbose_mode = 0; |
79 | 85 | ||
@@ -145,6 +151,11 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout) | |||
145 | args[i++] = SSH_PROGRAM; | 151 | args[i++] = SSH_PROGRAM; |
146 | args[i++] = "-x"; | 152 | args[i++] = "-x"; |
147 | args[i++] = "-oFallBackToRsh no"; | 153 | args[i++] = "-oFallBackToRsh no"; |
154 | if (IPv4) | ||
155 | args[i++] = "-4"; | ||
156 | if (IPv6) | ||
157 | args[i++] = "-6"; | ||
158 | args[i++] = "-oFallBackToRsh no"; | ||
148 | if (verbose_mode) | 159 | if (verbose_mode) |
149 | args[i++] = "-v"; | 160 | args[i++] = "-v"; |
150 | if (compress_flag) | 161 | if (compress_flag) |
@@ -242,9 +253,15 @@ main(argc, argv) | |||
242 | extern int optind; | 253 | extern int optind; |
243 | 254 | ||
244 | fflag = tflag = 0; | 255 | fflag = tflag = 0; |
245 | while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q")) != EOF) | 256 | while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q46")) != EOF) |
246 | switch (ch) { | 257 | switch (ch) { |
247 | /* User-visible flags. */ | 258 | /* User-visible flags. */ |
259 | case '4': | ||
260 | IPv4 = 1; | ||
261 | break; | ||
262 | case '6': | ||
263 | IPv6 = 1; | ||
264 | break; | ||
248 | case 'p': | 265 | case 'p': |
249 | pflag = 1; | 266 | pflag = 1; |
250 | break; | 267 | break; |
@@ -334,6 +351,17 @@ main(argc, argv) | |||
334 | exit(errs != 0); | 351 | exit(errs != 0); |
335 | } | 352 | } |
336 | 353 | ||
354 | char * | ||
355 | cleanhostname(host) | ||
356 | char *host; | ||
357 | { | ||
358 | if (*host == '[' && host[strlen(host) - 1] == ']') { | ||
359 | host[strlen(host) - 1] = '\0'; | ||
360 | return (host + 1); | ||
361 | } else | ||
362 | return host; | ||
363 | } | ||
364 | |||
337 | void | 365 | void |
338 | toremote(targ, argc, argv) | 366 | toremote(targ, argc, argv) |
339 | char *targ, *argv[]; | 367 | char *targ, *argv[]; |
@@ -372,6 +400,7 @@ toremote(targ, argc, argv) | |||
372 | bp = xmalloc(len); | 400 | bp = xmalloc(len); |
373 | if (host) { | 401 | if (host) { |
374 | *host++ = 0; | 402 | *host++ = 0; |
403 | host = cleanhostname(host); | ||
375 | suser = argv[i]; | 404 | suser = argv[i]; |
376 | if (*suser == '\0') | 405 | if (*suser == '\0') |
377 | suser = pwd->pw_name; | 406 | suser = pwd->pw_name; |
@@ -383,13 +412,15 @@ toremote(targ, argc, argv) | |||
383 | suser, host, cmd, src, | 412 | suser, host, cmd, src, |
384 | tuser ? tuser : "", tuser ? "@" : "", | 413 | tuser ? tuser : "", tuser ? "@" : "", |
385 | thost, targ); | 414 | thost, targ); |
386 | } else | 415 | } else { |
416 | host = cleanhostname(argv[i]); | ||
387 | (void) sprintf(bp, | 417 | (void) sprintf(bp, |
388 | "exec %s%s -x -o'FallBackToRsh no' -n %s %s %s '%s%s%s:%s'", | 418 | "exec %s%s -x -o'FallBackToRsh no' -n %s %s %s '%s%s%s:%s'", |
389 | SSH_PROGRAM, verbose_mode ? " -v" : "", | 419 | SSH_PROGRAM, verbose_mode ? " -v" : "", |
390 | argv[i], cmd, src, | 420 | host, cmd, src, |
391 | tuser ? tuser : "", tuser ? "@" : "", | 421 | tuser ? tuser : "", tuser ? "@" : "", |
392 | thost, targ); | 422 | thost, targ); |
423 | } | ||
393 | if (verbose_mode) | 424 | if (verbose_mode) |
394 | fprintf(stderr, "Executing: %s\n", bp); | 425 | fprintf(stderr, "Executing: %s\n", bp); |
395 | (void) system(bp); | 426 | (void) system(bp); |
@@ -399,7 +430,7 @@ toremote(targ, argc, argv) | |||
399 | len = strlen(targ) + CMDNEEDS + 20; | 430 | len = strlen(targ) + CMDNEEDS + 20; |
400 | bp = xmalloc(len); | 431 | bp = xmalloc(len); |
401 | (void) sprintf(bp, "%s -t %s", cmd, targ); | 432 | (void) sprintf(bp, "%s -t %s", cmd, targ); |
402 | host = thost; | 433 | host = cleanhostname(thost); |
403 | if (do_cmd(host, tuser, | 434 | if (do_cmd(host, tuser, |
404 | bp, &remin, &remout) < 0) | 435 | bp, &remin, &remout) < 0) |
405 | exit(1); | 436 | exit(1); |
@@ -449,6 +480,7 @@ tolocal(argc, argv) | |||
449 | else if (!okname(suser)) | 480 | else if (!okname(suser)) |
450 | continue; | 481 | continue; |
451 | } | 482 | } |
483 | host = cleanhostname(host); | ||
452 | len = strlen(src) + CMDNEEDS + 20; | 484 | len = strlen(src) + CMDNEEDS + 20; |
453 | bp = xmalloc(len); | 485 | bp = xmalloc(len); |
454 | (void) sprintf(bp, "%s -f %s", cmd, src); | 486 | (void) sprintf(bp, "%s -f %s", cmd, src); |
@@ -913,7 +945,7 @@ void | |||
913 | usage() | 945 | usage() |
914 | { | 946 | { |
915 | (void) fprintf(stderr, | 947 | (void) fprintf(stderr, |
916 | "usage: scp [-pqrvC] [-P port] [-c cipher] [-i identity] f1 f2; or:\n scp [options] f1 ... fn directory\n"); | 948 | "usage: scp [-pqrvC46] [-P port] [-c cipher] [-i identity] f1 f2; or:\n scp [options] f1 ... fn directory\n"); |
917 | exit(1); | 949 | exit(1); |
918 | } | 950 | } |
919 | 951 | ||
@@ -976,18 +1008,26 @@ run_err(const char *fmt,...) | |||
976 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 1008 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
977 | * SUCH DAMAGE. | 1009 | * SUCH DAMAGE. |
978 | * | 1010 | * |
979 | * $Id: scp.c,v 1.15 1999/12/30 22:16:40 damien Exp $ | 1011 | * $Id: scp.c,v 1.16 2000/01/14 04:45:51 damien Exp $ |
980 | */ | 1012 | */ |
981 | 1013 | ||
982 | char * | 1014 | char * |
983 | colon(cp) | 1015 | colon(cp) |
984 | char *cp; | 1016 | char *cp; |
985 | { | 1017 | { |
1018 | int flag = 0; | ||
1019 | |||
986 | if (*cp == ':') /* Leading colon is part of file name. */ | 1020 | if (*cp == ':') /* Leading colon is part of file name. */ |
987 | return (0); | 1021 | return (0); |
1022 | if (*cp == '[') | ||
1023 | flag = 1; | ||
988 | 1024 | ||
989 | for (; *cp; ++cp) { | 1025 | for (; *cp; ++cp) { |
990 | if (*cp == ':') | 1026 | if (*cp == '@' && *(cp+1) == '[') |
1027 | flag = 1; | ||
1028 | if (*cp == ']' && *(cp+1) == ':' && flag) | ||
1029 | return (cp+1); | ||
1030 | if (*cp == ':' && !flag) | ||
991 | return (cp); | 1031 | return (cp); |
992 | if (*cp == '/') | 1032 | if (*cp == '/') |
993 | return (0); | 1033 | return (0); |