[sftp.c]
     - 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
This commit is contained in:
Darren Tucker 2004-12-11 13:37:22 +11:00
parent 56c9598e5e
commit 596dcfa21f
2 changed files with 26 additions and 12 deletions

View File

@ -3,6 +3,15 @@
- markus@cvs.openbsd.org 2004/12/06 16:00:43 - markus@cvs.openbsd.org 2004/12/06 16:00:43
[bufaux.c] [bufaux.c]
use 0x00 not \0 since buf[] is a bignum use 0x00 not \0 since buf[] is a bignum
- fgsch@cvs.openbsd.org 2004/12/10 03:10:42
[sftp.c]
- 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
20041208 20041208
- (tim) [configure.ac] Comment some non obvious platforms in the - (tim) [configure.ac] Comment some non obvious platforms in the
@ -1933,4 +1942,4 @@
- (djm) Trim deprecated options from INSTALL. Mention UsePAM - (djm) Trim deprecated options from INSTALL. Mention UsePAM
- (djm) Fix quote handling in sftp; Patch from admorten AT umich.edu - (djm) Fix quote handling in sftp; Patch from admorten AT umich.edu
$Id: ChangeLog,v 1.3601 2004/12/11 02:34:56 dtucker Exp $ $Id: ChangeLog,v 1.3602 2004/12/11 02:37:22 dtucker Exp $

27
sftp.c
View File

@ -16,7 +16,7 @@
#include "includes.h" #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 $");
#ifdef USE_LIBEDIT #ifdef USE_LIBEDIT
#include <histedit.h> #include <histedit.h>
@ -746,12 +746,14 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
{ {
glob_t g; glob_t g;
int i, c = 1, colspace = 0, columns = 1; int i, c = 1, colspace = 0, columns = 1;
Attrib *a; Attrib *a = NULL;
memset(&g, 0, sizeof(g)); memset(&g, 0, sizeof(g));
if (remote_glob(conn, path, GLOB_MARK|GLOB_NOCHECK|GLOB_BRACE, 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); error("Can't ls: \"%s\" not found", path);
return (-1); return (-1);
} }
@ -760,19 +762,21 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
goto out; goto out;
/* /*
* If the glob returns a single match, which is the same as the * If the glob returns a single match and it is a directory,
* input glob, and it is a directory, then just list its contents * then just list its contents.
*/ */
if (g.gl_pathc == 1 && if (g.gl_matchc == 1) {
strncmp(path, g.gl_pathv[0], strlen(g.gl_pathv[0]) - 1) == 0) { if ((a = do_lstat(conn, g.gl_pathv[0], 1)) == NULL) {
if ((a = do_lstat(conn, path, 1)) == NULL) {
globfree(&g); globfree(&g);
return (-1); return (-1);
} }
if ((a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) && if ((a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) &&
S_ISDIR(a->perm)) { S_ISDIR(a->perm)) {
int err;
err = do_ls_dir(conn, g.gl_pathv[0], strip_path, lflag);
globfree(&g); globfree(&g);
return (do_ls_dir(conn, path, strip_path, lflag)); return (err);
} }
} }
@ -792,7 +796,7 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
colspace = width / columns; 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; char *fname;
fname = path_strip(g.gl_pathv[i], strip_path); fname = path_strip(g.gl_pathv[i], strip_path);
@ -809,7 +813,8 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
* that the server returns as well as the filenames. * that the server returns as well as the filenames.
*/ */
memset(&sb, 0, sizeof(sb)); 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) if (a != NULL)
attrib_to_stat(a, &sb); attrib_to_stat(a, &sb);
lname = ls_file(fname, &sb, 1); lname = ls_file(fname, &sb, 1);