summaryrefslogtreecommitdiff
path: root/sftp.c
diff options
context:
space:
mode:
authorDarren Tucker <dtucker@zip.com.au>2010-01-13 22:44:06 +1100
committerDarren Tucker <dtucker@zip.com.au>2010-01-13 22:44:06 +1100
commit2901e2daebe3a0890209f31d05d5bb9338cbed5b (patch)
tree8165aef201520ede26777b48b3c9e777245e2616 /sftp.c
parentdaaa4500519627abee7c6d1969bc33df6572c1e8 (diff)
- djm@cvs.openbsd.org 2010/01/13 01:40:16
[sftp.c sftp-server.c sftp.1 sftp-common.c sftp-common.h] support '-h' (human-readable units) for sftp's ls command, just like ls(1); ok dtucker@
Diffstat (limited to 'sftp.c')
-rw-r--r--sftp.c39
1 files changed, 22 insertions, 17 deletions
diff --git a/sftp.c b/sftp.c
index 78f8ca178..16f84987c 100644
--- a/sftp.c
+++ b/sftp.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: sftp.c,v 1.118 2010/01/09 11:13:02 dtucker Exp $ */ 1/* $OpenBSD: sftp.c,v 1.119 2010/01/13 01:40:16 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> 3 * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
4 * 4 *
@@ -110,16 +110,17 @@ extern char *__progname;
110#define WHITESPACE " \t\r\n" 110#define WHITESPACE " \t\r\n"
111 111
112/* ls flags */ 112/* ls flags */
113#define LS_LONG_VIEW 0x01 /* Full view ala ls -l */ 113#define LS_LONG_VIEW 0x0001 /* Full view ala ls -l */
114#define LS_SHORT_VIEW 0x02 /* Single row view ala ls -1 */ 114#define LS_SHORT_VIEW 0x0002 /* Single row view ala ls -1 */
115#define LS_NUMERIC_VIEW 0x04 /* Long view with numeric uid/gid */ 115#define LS_NUMERIC_VIEW 0x0004 /* Long view with numeric uid/gid */
116#define LS_NAME_SORT 0x08 /* Sort by name (default) */ 116#define LS_NAME_SORT 0x0008 /* Sort by name (default) */
117#define LS_TIME_SORT 0x10 /* Sort by mtime */ 117#define LS_TIME_SORT 0x0010 /* Sort by mtime */
118#define LS_SIZE_SORT 0x20 /* Sort by file size */ 118#define LS_SIZE_SORT 0x0020 /* Sort by file size */
119#define LS_REVERSE_SORT 0x40 /* Reverse sort order */ 119#define LS_REVERSE_SORT 0x0040 /* Reverse sort order */
120#define LS_SHOW_ALL 0x80 /* Don't skip filenames starting with '.' */ 120#define LS_SHOW_ALL 0x0080 /* Don't skip filenames starting with '.' */
121 121#define LS_SI_UNITS 0x0100 /* Display sizes as K, M, G, etc. */
122#define VIEW_FLAGS (LS_LONG_VIEW|LS_SHORT_VIEW|LS_NUMERIC_VIEW) 122
123#define VIEW_FLAGS (LS_LONG_VIEW|LS_SHORT_VIEW|LS_NUMERIC_VIEW|LS_SI_UNITS)
123#define SORT_FLAGS (LS_NAME_SORT|LS_TIME_SORT|LS_SIZE_SORT) 124#define SORT_FLAGS (LS_NAME_SORT|LS_TIME_SORT|LS_SIZE_SORT)
124 125
125/* Commands for interactive mode */ 126/* Commands for interactive mode */
@@ -383,7 +384,7 @@ parse_ls_flags(char **argv, int argc, int *lflag)
383 opterr = 0; 384 opterr = 0;
384 385
385 *lflag = LS_NAME_SORT; 386 *lflag = LS_NAME_SORT;
386 while ((ch = getopt(argc, argv, "1Saflnrt")) != -1) { 387 while ((ch = getopt(argc, argv, "1Safhlnrt")) != -1) {
387 switch (ch) { 388 switch (ch) {
388 case '1': 389 case '1':
389 *lflag &= ~VIEW_FLAGS; 390 *lflag &= ~VIEW_FLAGS;
@@ -399,12 +400,15 @@ parse_ls_flags(char **argv, int argc, int *lflag)
399 case 'f': 400 case 'f':
400 *lflag &= ~SORT_FLAGS; 401 *lflag &= ~SORT_FLAGS;
401 break; 402 break;
403 case 'h':
404 *lflag |= LS_SI_UNITS;
405 break;
402 case 'l': 406 case 'l':
403 *lflag &= ~VIEW_FLAGS; 407 *lflag &= ~LS_SHORT_VIEW;
404 *lflag |= LS_LONG_VIEW; 408 *lflag |= LS_LONG_VIEW;
405 break; 409 break;
406 case 'n': 410 case 'n':
407 *lflag &= ~VIEW_FLAGS; 411 *lflag &= ~LS_SHORT_VIEW;
408 *lflag |= LS_NUMERIC_VIEW|LS_LONG_VIEW; 412 *lflag |= LS_NUMERIC_VIEW|LS_LONG_VIEW;
409 break; 413 break;
410 case 'r': 414 case 'r':
@@ -716,13 +720,14 @@ do_ls_dir(struct sftp_conn *conn, char *path, char *strip_path, int lflag)
716 xfree(tmp); 720 xfree(tmp);
717 721
718 if (lflag & LS_LONG_VIEW) { 722 if (lflag & LS_LONG_VIEW) {
719 if (lflag & LS_NUMERIC_VIEW) { 723 if (lflag & (LS_NUMERIC_VIEW|LS_SI_UNITS)) {
720 char *lname; 724 char *lname;
721 struct stat sb; 725 struct stat sb;
722 726
723 memset(&sb, 0, sizeof(sb)); 727 memset(&sb, 0, sizeof(sb));
724 attrib_to_stat(&d[n]->a, &sb); 728 attrib_to_stat(&d[n]->a, &sb);
725 lname = ls_file(fname, &sb, 1); 729 lname = ls_file(fname, &sb, 1,
730 (lflag & LS_SI_UNITS));
726 printf("%s\n", lname); 731 printf("%s\n", lname);
727 xfree(lname); 732 xfree(lname);
728 } else 733 } else
@@ -824,7 +829,7 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
824 a = do_lstat(conn, g.gl_pathv[i], 1); 829 a = do_lstat(conn, g.gl_pathv[i], 1);
825 if (a != NULL) 830 if (a != NULL)
826 attrib_to_stat(a, &sb); 831 attrib_to_stat(a, &sb);
827 lname = ls_file(fname, &sb, 1); 832 lname = ls_file(fname, &sb, 1, (lflag & LS_SI_UNITS));
828 printf("%s\n", lname); 833 printf("%s\n", lname);
829 xfree(lname); 834 xfree(lname);
830 } else { 835 } else {