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)

Reply via email to