Bugzilla – Attachment 2991 Details for
Bug 2694
sftp ls command ignores sorting flags for globbed listing
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
implement sorting for globbed ls
bz2694.diff (text/plain), 2.59 KB, created by
Damien Miller
on 2017-06-09 15:15:55 AEST
(
hide
)
Description:
implement sorting for globbed ls
Filename:
MIME Type:
Creator:
Damien Miller
Created:
2017-06-09 15:15:55 AEST
Size:
2.59 KB
patch
obsolete
>diff --git a/sftp.c b/sftp.c >index c74f252..fb7f1f3 100644 >--- a/sftp.c >+++ b/sftp.c >@@ -86,6 +86,7 @@ volatile sig_atomic_t interrupted = 0; > > /* I wish qsort() took a separate ctx for the comparison function...*/ > int sort_flag; >+glob_t *sort_glob; > > /* Context used for commandline completion */ > struct complete_ctx { >@@ -857,6 +858,28 @@ do_ls_dir(struct sftp_conn *conn, const char *path, > return (0); > } > >+static int >+sglob_comp(const void *aa, const void *bb) >+{ >+ u_int a = *(const u_int *)aa; >+ u_int b = *(const u_int *)bb; >+ const char *ap = sort_glob->gl_pathv[a]; >+ const char *bp = sort_glob->gl_pathv[b]; >+ const struct stat *as = sort_glob->gl_statv[a]; >+ const struct stat *bs = sort_glob->gl_statv[b]; >+ int rmul = sort_flag & LS_REVERSE_SORT ? -1 : 1; >+ >+#define NCMP(a,b) (a == b ? 0 : (a < b ? 1 : -1)) >+ if (sort_flag & LS_NAME_SORT) >+ return (rmul * strcmp(ap, bp)); >+ else if (sort_flag & LS_TIME_SORT) >+ return (rmul * timespeccmp(&as->st_mtim, &bs->st_mtim, <)); >+ else if (sort_flag & LS_SIZE_SORT) >+ return (rmul * NCMP(as->st_size, bs->st_size)); >+ >+ fatal("Unknown ls sort type"); >+} >+ > /* sftp ls.1 replacement which handles path globs */ > static int > do_globbed_ls(struct sftp_conn *conn, const char *path, >@@ -866,7 +889,8 @@ do_globbed_ls(struct sftp_conn *conn, const char *path, > glob_t g; > int err, r; > struct winsize ws; >- u_int i, c = 1, colspace = 0, columns = 1, m = 0, width = 80; >+ u_int i, j, nentries, *indices = NULL, c = 1; >+ u_int colspace = 0, columns = 1, m = 0, width = 80; > > memset(&g, 0, sizeof(g)); > >@@ -911,7 +935,26 @@ do_globbed_ls(struct sftp_conn *conn, const char *path, > colspace = width / columns; > } > >- for (i = 0; g.gl_pathv[i] && !interrupted; i++) { >+ /* >+ * Sorting: rather than mess with the contents of glob_t, prepare >+ * an array of indices into it and sort that. For the usual >+ * unsorted case, the indices are just the identity 1=1, 2=2, etc. >+ */ >+ for (nentries = 0; g.gl_pathv[nentries] != NULL; nentries++) >+ ; /* count entries */ >+ indices = calloc(nentries, sizeof(*indices)); >+ for (i = 0; i < nentries; i++) >+ indices[i] = i; >+ >+ if (lflag & SORT_FLAGS) { >+ sort_glob = &g; >+ sort_flag = lflag & (SORT_FLAGS|LS_REVERSE_SORT); >+ qsort(indices, nentries, sizeof(*indices), sglob_comp); >+ sort_glob = NULL; >+ } >+ >+ for (j = 0; j < nentries && !interrupted; j++) { >+ i = indices[j]; > fname = path_strip(g.gl_pathv[i], strip_path); > if (lflag & LS_LONG_VIEW) { > if (g.gl_statv[i] == NULL) { >@@ -939,6 +982,7 @@ do_globbed_ls(struct sftp_conn *conn, const char *path, > out: > if (g.gl_pathc) > globfree(&g); >+ free(indices); > > return 0; > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
dtucker
:
ok+
Actions:
View
|
Diff
Attachments on
bug 2694
: 2991