summaryrefslogtreecommitdiff
path: root/scp.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2000-01-14 15:45:46 +1100
committerDamien Miller <djm@mindrot.org>2000-01-14 15:45:46 +1100
commit34132e54cbd221d17d373fc54f4e3f7b85727f7f (patch)
tree7c73917b1082ff91786f9e02d25b853bedd1d472 /scp.c
parent25e4256ad4f453d8a7c1866243ec1984f859b1de (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.c56
1 files changed, 48 insertions, 8 deletions
diff --git a/scp.c b/scp.c
index d54a7c854..3074ccdaa 100644
--- a/scp.c
+++ b/scp.c
@@ -45,7 +45,7 @@
45 */ 45 */
46 46
47#include "includes.h" 47#include "includes.h"
48RCSID("$Id: scp.c,v 1.15 1999/12/30 22:16:40 damien Exp $"); 48RCSID("$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. */
75char *curfile; 75char *curfile;
76 76
77/* This is set to non-zero if IPv4 is desired. */
78int IPv4 = 0;
79
80/* This is set to non-zero if IPv6 is desired. */
81int 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. */
78int verbose_mode = 0; 84int 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
354char *
355cleanhostname(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
337void 365void
338toremote(targ, argc, argv) 366toremote(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
913usage() 945usage()
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
982char * 1014char *
983colon(cp) 1015colon(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);