This makes sftp similar to scp whereby
one can also do something like:
sftp <local_file> user@remotehost:/<dir>/
I'm too lazy to use interactive mode :-)
Index: sftp.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/sftp.c,v
retrieving revision 1.132
diff -u -p -r1.132 sftp.c
--- sftp.c 4 Dec 2010 00:18:01 -0000 1.132
+++ sftp.c 19 Sep 2011 13:57:53 -0000
@@ -25,6 +25,7 @@
#include <ctype.h>
#include <errno.h>
+#include <fcntl.h>
#include <glob.h>
#include <histedit.h>
#include <paths.h>
@@ -175,7 +176,7 @@ static const struct CMD cmds[] = {
{ NULL, -1, -1 }
};
-int interactive_loop(struct sftp_conn *, char *file1, char *file2);
+int interactive_loop(struct sftp_conn *, char *file1, char *file2, int);
/* ARGSUSED */
static void
@@ -1834,7 +1835,7 @@ complete(EditLine *el, int ch)
}
int
-interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
+interactive_loop(struct sftp_conn *conn, char *file1, char *file2, int tflag)
{
char *remote_path;
char *dir = NULL;
@@ -1889,10 +1890,19 @@ interactive_loop(struct sftp_conn *conn,
}
} else {
if (file2 == NULL)
- snprintf(cmd, sizeof cmd, "get %s", dir);
+ if (tflag == 0)
+ snprintf(cmd, sizeof cmd, "get %s",
+ dir);
+ else
+ snprintf(cmd, sizeof cmd, "put %s",
+ dir);
else
- snprintf(cmd, sizeof cmd, "get %s %s", dir,
- file2);
+ if (tflag == 0)
+ snprintf(cmd, sizeof cmd, "get %s %s",
+ dir, file2);
+ else
+ snprintf(cmd, sizeof cmd, "put %s %s",
+ dir, file2);
err = parse_dispatch_command(conn, cmd,
&remote_path, 1);
@@ -2034,12 +2044,13 @@ usage(void)
int
main(int argc, char **argv)
{
- int in, out, ch, err;
+ int in, out, ch, tflag = 0, fd, err;
char *host = NULL, *userhost, *cp, *file2 = NULL;
int debug_level = 0, sshver = 2;
char *file1 = NULL, *sftp_server = NULL;
char *ssh_program = _PATH_SSH_PROGRAM, *sftp_direct = NULL;
const char *errstr;
+ char path[MAXPATHLEN];
LogLevel ll = SYSLOG_LEVEL_INFO;
arglist args;
extern int optind;
@@ -2163,9 +2174,22 @@ main(int argc, char **argv)
if (optind == argc || argc > (optind + 2))
usage();
- userhost = xstrdup(argv[optind]);
- file2 = argv[optind+1];
-
+ if (strrchr(argv[optind], '@') != NULL) {
+ userhost = xstrdup(argv[optind]);
+ file2 = argv[optind + 1];
+ }
+ else {
+ tflag = 1;
+ userhost = xstrdup(argv[optind + 1]);
+ file2 = argv[optind];
+ if ((fd = open(file2, O_RDONLY | O_NONBLOCK, 0)) < 0) {
+ fprintf(stderr, "\n%s\n",strerror(errno));
+ _exit(1);
+ }
+ if (getcwd(path, sizeof(path)) != NULL &&
+ file2[0] != '/')
+ file2 = path_append(path, file2);
+ }
if ((host = strrchr(userhost, '@')) == NULL)
host = userhost;
else {
@@ -2219,9 +2243,10 @@ main(int argc, char **argv)
else
fprintf(stderr, "Attached to %s.\n", sftp_direct);
}
-
- err = interactive_loop(conn, file1, file2);
-
+ if (tflag == 0)
+ err = interactive_loop(conn, file1, file2, 0);
+ else
+ err = interactive_loop(conn, file2, file1, 1);
close(in);
close(out);
if (batchmode)