summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorFederico G. Schwindt <fgsch@cvs.openbsd.org>2004-12-10 03:10:43 +0000
committerFederico G. Schwindt <fgsch@cvs.openbsd.org>2004-12-10 03:10:43 +0000
commita63c0db0f36a881e43431dcd5d39acf125f53a48 (patch)
tree9f01c93befc597fcb0c8edfadce492defe3976a6 /usr.bin
parent1dd34dc7fc8e571b091530fb126f4385f4e57b6e (diff)
- fix globbed ls for paths the same lenght as the globbed path when
we have a unique matching. - fix globbed ls in case of a directory when we have a unique matching. - as a side effect, if the path does not exist error (used to silently ignore). - don't do extra do_lstat() if we only have one matching file. djm@ ok
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/ssh/sftp.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/usr.bin/ssh/sftp.c b/usr.bin/ssh/sftp.c
index da2bb921e9b..f8150600727 100644
--- a/usr.bin/ssh/sftp.c
+++ b/usr.bin/ssh/sftp.c
@@ -16,7 +16,7 @@
#include "includes.h"
-RCSID("$OpenBSD: sftp.c,v 1.59 2004/11/29 07:41:24 djm Exp $");
+RCSID("$OpenBSD: sftp.c,v 1.60 2004/12/10 03:10:42 fgsch Exp $");
#include <glob.h>
#include <histedit.h>
@@ -741,12 +741,14 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
{
glob_t g;
int i, c = 1, colspace = 0, columns = 1;
- Attrib *a;
+ Attrib *a = NULL;
memset(&g, 0, sizeof(g));
if (remote_glob(conn, path, GLOB_MARK|GLOB_NOCHECK|GLOB_BRACE,
- NULL, &g)) {
+ NULL, &g) || (g.gl_pathc && !g.gl_matchc)) {
+ if (g.gl_pathc)
+ globfree(&g);
error("Can't ls: \"%s\" not found", path);
return (-1);
}
@@ -755,19 +757,21 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
goto out;
/*
- * If the glob returns a single match, which is the same as the
- * input glob, and it is a directory, then just list its contents
+ * If the glob returns a single match and it is a directory,
+ * then just list its contents.
*/
- if (g.gl_pathc == 1 &&
- strncmp(path, g.gl_pathv[0], strlen(g.gl_pathv[0]) - 1) == 0) {
- if ((a = do_lstat(conn, path, 1)) == NULL) {
+ if (g.gl_matchc == 1) {
+ if ((a = do_lstat(conn, g.gl_pathv[0], 1)) == NULL) {
globfree(&g);
return (-1);
}
if ((a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) &&
S_ISDIR(a->perm)) {
+ int err;
+
+ err = do_ls_dir(conn, g.gl_pathv[0], strip_path, lflag);
globfree(&g);
- return (do_ls_dir(conn, path, strip_path, lflag));
+ return (err);
}
}
@@ -787,7 +791,7 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
colspace = width / columns;
}
- for (i = 0; g.gl_pathv[i] && !interrupted; i++) {
+ for (i = 0; g.gl_pathv[i] && !interrupted; i++, a = NULL) {
char *fname;
fname = path_strip(g.gl_pathv[i], strip_path);
@@ -804,7 +808,8 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
* that the server returns as well as the filenames.
*/
memset(&sb, 0, sizeof(sb));
- a = do_lstat(conn, g.gl_pathv[i], 1);
+ if (a == NULL)
+ a = do_lstat(conn, g.gl_pathv[i], 1);
if (a != NULL)
attrib_to_stat(a, &sb);
lname = ls_file(fname, &sb, 1);