On Wed, 21 Sep 2011, Loganaden Velvindron wrote:

> s/similar/A little bit like
> 
> The diff has issues with stuff like sftp 127.0.0.1. I've
> fixed it.

The way I'd like to see the sftp commandline go is to become mostly
compatible with scp(1). So:

sftp local [local...] remote:/path         # do an upload
sftp remote:/path [remote:path...] local   # do a download

-d


> 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