From d5d5b1882beab9d34eca725661fa4d97109b1a40 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Tue, 13 Jan 2004 09:25:06 +0000 Subject: Tidy sftp batchmode handling, eliminate junk to stderr (bugzilla #754) and enable use of "-b -" to accept batchfile from stdin; ok markus@ --- usr.bin/ssh/sftp-int.c | 11 ++++++++--- usr.bin/ssh/sftp.1 | 9 +++++++-- usr.bin/ssh/sftp.c | 28 ++++++++++++++++------------ 3 files changed, 31 insertions(+), 17 deletions(-) (limited to 'usr.bin') diff --git a/usr.bin/ssh/sftp-int.c b/usr.bin/ssh/sftp-int.c index 749b0661d81..5e84ce80952 100644 --- a/usr.bin/ssh/sftp-int.c +++ b/usr.bin/ssh/sftp-int.c @@ -25,7 +25,7 @@ /* XXX: recursive operations */ #include "includes.h" -RCSID("$OpenBSD: sftp-int.c,v 1.65 2003/11/21 11:57:03 djm Exp $"); +RCSID("$OpenBSD: sftp-int.c,v 1.66 2004/01/13 09:25:05 djm Exp $"); #include @@ -43,6 +43,9 @@ RCSID("$OpenBSD: sftp-int.c,v 1.65 2003/11/21 11:57:03 djm Exp $"); /* File to read commands from */ extern FILE *infile; +/* Are we in batchfile mode? */ +extern int batchmode; + /* Size of buffer used when copying files */ extern size_t copy_buffer_len; @@ -1169,14 +1172,16 @@ interactive_loop(int fd_in, int fd_out, char *file1, char *file2) if (fgets(cmd, sizeof(cmd), infile) == NULL) { printf("\n"); break; - } else if (infile != stdin) /* Bluff typing */ + } + + if (batchmode) /* Echo command */ printf("%s", cmd); cp = strrchr(cmd, '\n'); if (cp) *cp = '\0'; - err = parse_dispatch_command(conn, cmd, &pwd, infile != stdin); + err = parse_dispatch_command(conn, cmd, &pwd, batchmode); if (err != 0) break; } diff --git a/usr.bin/ssh/sftp.1 b/usr.bin/ssh/sftp.1 index 8563e2bddf3..cfa2e10b32f 100644 --- a/usr.bin/ssh/sftp.1 +++ b/usr.bin/ssh/sftp.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sftp.1,v 1.49 2003/12/16 15:49:51 markus Exp $ +.\" $OpenBSD: sftp.1,v 1.50 2004/01/13 09:25:05 djm Exp $ .\" .\" Copyright (c) 2001 Damien Miller. All rights reserved. .\" @@ -99,7 +99,12 @@ Batch mode reads a series of commands from an input instead of .Em stdin . Since it lacks user interaction it should be used in conjunction with -non-interactive authentication. +non-interactive authentication. +A +.Ar batchfile +of +.Sq Ic \- +may be used to indicate standard input. .Nm will abort if any of the following commands fail: diff --git a/usr.bin/ssh/sftp.c b/usr.bin/ssh/sftp.c index 1ebcbeb7581..d0e595e0c38 100644 --- a/usr.bin/ssh/sftp.c +++ b/usr.bin/ssh/sftp.c @@ -24,7 +24,7 @@ #include "includes.h" -RCSID("$OpenBSD: sftp.c,v 1.38 2003/10/08 08:27:36 jmc Exp $"); +RCSID("$OpenBSD: sftp.c,v 1.39 2004/01/13 09:25:05 djm Exp $"); #include "buffer.h" #include "xmalloc.h" @@ -37,7 +37,8 @@ RCSID("$OpenBSD: sftp.c,v 1.38 2003/10/08 08:27:36 jmc Exp $"); #include "sftp-client.h" #include "sftp-int.h" -FILE* infile; +FILE* infile = stdin; +int batchmode = 0; size_t copy_buffer_len = 32768; size_t num_requests = 16; static pid_t sshpid = -1; @@ -134,7 +135,6 @@ main(int argc, char **argv) addargs(&args, "-oForwardAgent no"); addargs(&args, "-oClearAllForwardings yes"); ll = SYSLOG_LEVEL_INFO; - infile = stdin; /* Read from STDIN unless changed by -b */ while ((ch = getopt(argc, argv, "1hvCo:s:S:b:B:F:P:R:")) != -1) { switch (ch) { @@ -164,13 +164,15 @@ main(int argc, char **argv) ssh_program = optarg; break; case 'b': - if (infile == stdin) { - infile = fopen(optarg, "r"); - if (infile == NULL) - fatal("%s (%s).", strerror(errno), optarg); - } else - fatal("Filename already specified."); + if (batchmode) + fatal("Batch file already specified."); + + /* Allow "-" as stdin */ + if (strcmp(optarg, "-") != 0 && + (infile = fopen(optarg, "r")) == NULL) + fatal("%s (%s).", strerror(errno), optarg); showprogress = 0; + batchmode = 1; break; case 'P': sftp_direct = optarg; @@ -234,13 +236,15 @@ main(int argc, char **argv) sftp_server : "sftp")); args.list[0] = ssh_program; - fprintf(stderr, "Connecting to %s...\n", host); + if (!batchmode) + fprintf(stderr, "Connecting to %s...\n", host); connect_to_server(ssh_program, args.list, &in, &out); } else { args.list = NULL; addargs(&args, "sftp-server"); - fprintf(stderr, "Attaching to %s...\n", sftp_direct); + if (!batchmode) + fprintf(stderr, "Attaching to %s...\n", sftp_direct); connect_to_server(sftp_direct, args.list, &in, &out); } @@ -248,7 +252,7 @@ main(int argc, char **argv) close(in); close(out); - if (infile != stdin) + if (batchmode) fclose(infile); while (waitpid(sshpid, NULL, 0) == -1) -- cgit v1.2.3