s/similar/A little bit like The diff has issues with stuff like sftp 127.0.0.1. I've fixed it.
Index: src/usr.bin/ssh/sftp.c =================================================================== RCS file: /cvs/src/usr.bin/ssh/sftp.c,v retrieving revision 1.132 diff -u -p -r1.132 sftp.c --- src/usr.bin/ssh/sftp.c 4 Dec 2010 00:18:01 -0000 1.132 +++ src/usr.bin/ssh/sftp.c 21 Sep 2011 07:30:08 -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,24 @@ 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) || + (argc == optind + 1) || + (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 +2245,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)