summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sftp.114
-rw-r--r--sftp.c32
2 files changed, 31 insertions, 15 deletions
diff --git a/sftp.1 b/sftp.1
index 9b03280b..529be7fc 100644
--- a/sftp.1
+++ b/sftp.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: sftp.1,v 1.112 2017/10/25 06:19:46 jmc Exp $
+.\" $OpenBSD: sftp.1,v 1.113 2017/11/03 03:46:52 djm Exp $
.\"
.\" Copyright (c) 2001 Damien Miller. All rights reserved.
.\"
@@ -22,7 +22,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd $Mdocdate: October 25 2017 $
+.Dd $Mdocdate: November 3 2017 $
.Dt SFTP 1
.Os
.Sh NAME
@@ -301,9 +301,12 @@ must be escaped with backslashes
.It Ic bye
Quit
.Nm sftp .
-.It Ic cd Ar path
+.It Ic cd Op Ar path
Change remote directory to
.Ar path .
+If
+.Ar path
+is not specified, then change directory to the one the session started in.
.It Ic chgrp Ar grp Ar path
Change group of file
.Ar path
@@ -407,9 +410,12 @@ Note that
does not follow symbolic links when performing recursive transfers.
.It Ic help
Display help text.
-.It Ic lcd Ar path
+.It Ic lcd Op Ar path
Change local directory to
.Ar path .
+If
+.Ar path
+is not specified, then change directory to the local user's home directory.
.It Ic lls Op Ar ls-options Op Ar path
Display local directory listing of either
.Ar path
diff --git a/sftp.c b/sftp.c
index 9aee2faf..5ce864ee 100644
--- a/sftp.c
+++ b/sftp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp.c,v 1.181 2017/10/21 23:06:24 millert Exp $ */
+/* $OpenBSD: sftp.c,v 1.182 2017/11/03 03:46:52 djm Exp $ */
/*
* Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
*
@@ -217,8 +217,6 @@ static const struct CMD cmds[] = {
{ NULL, -1, -1 }
};
-int interactive_loop(struct sftp_conn *, char *file1, char *file2);
-
/* ARGSUSED */
static void
killchild(int signo)
@@ -1288,7 +1286,7 @@ parse_args(const char **cpp, int *ignore_errors, int *aflag,
char *cp2, **argv;
int base = 0;
long l;
- int i, cmdnum, optidx, argc;
+ int path1_mandatory = 0, i, cmdnum, optidx, argc;
/* Skip leading whitespace */
cp = cp + strspn(cp, WHITESPACE);
@@ -1378,13 +1376,17 @@ parse_args(const char **cpp, int *ignore_errors, int *aflag,
case I_RM:
case I_MKDIR:
case I_RMDIR:
+ case I_LMKDIR:
+ path1_mandatory = 1;
+ /* FALLTHROUGH */
case I_CHDIR:
case I_LCHDIR:
- case I_LMKDIR:
if ((optidx = parse_no_flags(cmd, argv, argc)) == -1)
return -1;
/* Get pathname (mandatory) */
if (argc - optidx < 1) {
+ if (!path1_mandatory)
+ break; /* return a NULL path1 */
error("You must specify a path after a %s command.",
cmd);
return -1;
@@ -1469,7 +1471,7 @@ parse_args(const char **cpp, int *ignore_errors, int *aflag,
static int
parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
- int err_abort)
+ const char *startdir, int err_abort)
{
char *path1, *path2, *tmp;
int ignore_errors = 0, aflag = 0, fflag = 0, hflag = 0,
@@ -1549,6 +1551,8 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
err = do_rmdir(conn, path1);
break;
case I_CHDIR:
+ if (path1 == NULL || *path1 == '\0')
+ path1 = xstrdup(startdir);
path1 = make_absolute(path1, *pwd);
if ((tmp = do_realpath(conn, path1)) == NULL) {
err = 1;
@@ -1597,6 +1601,8 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
err = do_df(conn, path1, hflag, iflag);
break;
case I_LCHDIR:
+ if (path1 == NULL || *path1 == '\0')
+ path1 = xstrdup("~");
tmp = tilde_expand_filename(path1, getuid());
free(path1);
path1 = tmp;
@@ -2083,11 +2089,11 @@ complete(EditLine *el, int ch)
}
#endif /* USE_LIBEDIT */
-int
+static int
interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
{
char *remote_path;
- char *dir = NULL;
+ char *dir = NULL, *startdir = NULL;
char cmd[2048];
int err, interactive;
EditLine *el = NULL;
@@ -2131,6 +2137,7 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
remote_path = do_realpath(conn, ".");
if (remote_path == NULL)
fatal("Need cwd");
+ startdir = xstrdup(remote_path);
if (file1 != NULL) {
dir = xstrdup(file1);
@@ -2141,8 +2148,9 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
mprintf("Changing to: %s\n", dir);
snprintf(cmd, sizeof cmd, "cd \"%s\"", dir);
if (parse_dispatch_command(conn, cmd,
- &remote_path, 1) != 0) {
+ &remote_path, startdir, 1) != 0) {
free(dir);
+ free(startdir);
free(remote_path);
free(conn);
return (-1);
@@ -2154,8 +2162,9 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
file2 == NULL ? "" : " ",
file2 == NULL ? "" : file2);
err = parse_dispatch_command(conn, cmd,
- &remote_path, 1);
+ &remote_path, startdir, 1);
free(dir);
+ free(startdir);
free(remote_path);
free(conn);
return (err);
@@ -2214,11 +2223,12 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
signal(SIGINT, cmd_interrupt);
err = parse_dispatch_command(conn, cmd, &remote_path,
- batchmode);
+ startdir, batchmode);
if (err != 0)
break;
}
free(remote_path);
+ free(startdir);
free(conn);
#ifdef USE_LIBEDIT