sftp upload diff similar to scp

2011-09-19 Thread elitter.net
It's annoying to upload using interactive mode.

This diff works like scp.
sftp localfile user@host:dir

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 -   1.132
+++ sftp.c  19 Sep 2011 13:57:53 -
@@ -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)



Re: sftp upload diff similar to scp

2011-09-19 Thread Christiano F. Haesbaert
Not sure if I got this, but why not using scp then ?

On 19 September 2011 14:52, elitter.net logana...@elitter.net wrote:
 It's annoying to upload using interactive mode.

 This diff works like scp.
 sftp localfile user@host:dir

 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 -   1.132
 +++ sftp.c  19 Sep 2011 13:57:53 -
 @@ -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)



Re: sftp upload diff similar to scp

2011-09-19 Thread Loganaden Velvindron
SFTP is better designed IMHO.

I agree that from a user's perspective, it doesn't really
matter much :-)


On Mon, Sep 19, 2011 at 11:29 PM, Christiano F. Haesbaert
haesba...@haesbaert.org wrote:
 Not sure if I got this, but why not using scp then ?

 On 19 September 2011 14:52, elitter.net logana...@elitter.net wrote:
 It's annoying to upload using interactive mode.

 This diff works like scp.
 sftp localfile user@host:dir

 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 -   1.132
 +++ sftp.c  19 Sep 2011 13:57:53 -
 @@ -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)





--
`` Real men run current !''



Re: sftp upload diff similar to scp

2011-09-19 Thread Stuart Henderson
On 2011/09/19 16:29, Christiano F. Haesbaert wrote:
 Not sure if I got this, but why not using scp then ?

You might need to use the sftp protocol rather than scp with some
servers.

 On 19 September 2011 14:52, elitter.net logana...@elitter.net wrote:
  It's annoying to upload using interactive mode.
 
  This diff works like scp.
  sftp localfile user@host:dir

I think this should probably to go the openssh bugzilla.