]> andersk Git - openssh.git/commitdiff
- djm@cvs.openbsd.org 2010/01/13 01:40:16
authordtucker <dtucker>
Wed, 13 Jan 2010 11:44:06 +0000 (11:44 +0000)
committerdtucker <dtucker>
Wed, 13 Jan 2010 11:44:06 +0000 (11:44 +0000)
     [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@

ChangeLog
sftp-common.c
sftp-common.h
sftp-server.c
sftp.1
sftp.c

index 7624812b185d1ee60b7acf4397adc74d207e30dd..d4210354e5f41ef9e6501f13d6ee5be2e5d50495 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
      [canohost.c ssh-keysign.c sshconnect2.c]
      Make HostBased authentication work with a ProxyCommand.  bz #1569, patch
      from imorgan at nas nasa gov, ok djm@
+   - 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@
 
 20100112
  - (dtucker) OpenBSD CVS Sync
index 7ebadcc53b0f4f5671fbe4f5b73e48396fc9f3cf..7393fc6a9dd91cbf0cda4ec6e7c77147a02a56d0 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-common.c,v 1.20 2006/08/03 03:34:42 deraadt Exp $ */
+/* $OpenBSD: sftp-common.c,v 1.21 2010/01/13 01:40:16 djm Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2001 Damien Miller.  All rights reserved.
@@ -36,6 +36,7 @@
 #include <string.h>
 #include <time.h>
 #include <stdarg.h>
+#include <util.h>
 
 #include "xmalloc.h"
 #include "buffer.h"
@@ -184,7 +185,7 @@ fx2txt(int status)
  * drwxr-xr-x    5 markus   markus       1024 Jan 13 18:39 .ssh
  */
 char *
-ls_file(const char *name, const struct stat *st, int remote)
+ls_file(const char *name, const struct stat *st, int remote, int si_units)
 {
        int ulen, glen, sz = 0;
        struct passwd *pw;
@@ -192,6 +193,7 @@ ls_file(const char *name, const struct stat *st, int remote)
        struct tm *ltime = localtime(&st->st_mtime);
        char *user, *group;
        char buf[1024], mode[11+1], tbuf[12+1], ubuf[11+1], gbuf[11+1];
+       char sbuf[FMT_SCALED_STRSIZE];
 
        strmode(st->st_mode, mode);
        if (!remote && (pw = getpwuid(st->st_uid)) != NULL) {
@@ -216,8 +218,15 @@ ls_file(const char *name, const struct stat *st, int remote)
                tbuf[0] = '\0';
        ulen = MAX(strlen(user), 8);
        glen = MAX(strlen(group), 8);
-       snprintf(buf, sizeof buf, "%s %3u %-*s %-*s %8llu %s %s", mode,
-           (u_int)st->st_nlink, ulen, user, glen, group,
-           (unsigned long long)st->st_size, tbuf, name);
+       if (si_units) {
+               fmt_scaled((long long)st->st_size, sbuf);
+               snprintf(buf, sizeof buf, "%s %3u %-*s %-*s %8s %s %s", mode,
+                   (u_int)st->st_nlink, ulen, user, glen, group,
+                   sbuf, tbuf, name);
+       } else {
+               snprintf(buf, sizeof buf, "%s %3u %-*s %-*s %8llu %s %s", mode,
+                   (u_int)st->st_nlink, ulen, user, glen, group,
+                   (unsigned long long)st->st_size, tbuf, name);
+       }
        return xstrdup(buf);
 }
index 9b5848462a2eaaa078edbb1bf45b6e12ae03526c..9ed86c070dd7b9fb760eab8189d8e325797c1d66 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-common.h,v 1.10 2006/08/03 03:34:42 deraadt Exp $ */
+/* $OpenBSD: sftp-common.h,v 1.11 2010/01/13 01:40:16 djm Exp $ */
 
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
@@ -46,6 +46,6 @@ void   stat_to_attrib(const struct stat *, Attrib *);
 void    attrib_to_stat(const Attrib *, struct stat *);
 Attrib *decode_attrib(Buffer *);
 void    encode_attrib(Buffer *, const Attrib *);
-char   *ls_file(const char *, const struct stat *, int);
+char   *ls_file(const char *, const struct stat *, int, int);
 
 const char *fx2txt(int);
index ab9391cfdedd28f19124115210fb685875cf2e41..a98ac2b6dd28c9074771181e93a3757d0cebda98 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-server.c,v 1.90 2010/01/09 00:20:26 djm Exp $ */
+/* $OpenBSD: sftp-server.c,v 1.91 2010/01/13 01:40:16 djm Exp $ */
 /*
  * Copyright (c) 2000-2004 Markus Friedl.  All rights reserved.
  *
@@ -940,7 +940,7 @@ process_readdir(void)
                                continue;
                        stat_to_attrib(&st, &(stats[count].attrib));
                        stats[count].name = xstrdup(dp->d_name);
-                       stats[count].long_name = ls_file(dp->d_name, &st, 0);
+                       stats[count].long_name = ls_file(dp->d_name, &st, 0, 0);
                        count++;
                        /* send up to 100 entries in one message */
                        /* XXX check packet size instead */
diff --git a/sftp.1 b/sftp.1
index 7b0f688e49d3b2535d854b940e06f448110f54d0..c426f9f646bc6d75a5f5029d63b897133ed21ae1 100644 (file)
--- a/sftp.1
+++ b/sftp.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: sftp.1,v 1.80 2010/01/09 23:04:13 dtucker Exp $
+.\" $OpenBSD: sftp.1,v 1.81 2010/01/13 01:40:16 djm Exp $
 .\"
 .\" Copyright (c) 2001 Damien Miller.  All rights reserved.
 .\"
@@ -393,7 +393,7 @@ to
 .It Ic lpwd
 Print local working directory.
 .It Xo Ic ls
-.Op Fl 1aflnrSt
+.Op Fl 1aflhnrSt
 .Op Ar path
 .Xc
 Display a remote directory listing of either
@@ -421,6 +421,11 @@ The default sort order is lexicographical.
 .It Fl l
 Display additional details including permissions
 and ownership information.
+.It Fl h
+When used with a long format option, use unit suffixes: Byte, Kilobyte,
+Megabyte, Gigabyte, Terabyte, Petabyte, and Exabyte in order to reduce
+the number of digits to four or fewer using powers of 2 for sizes (K=1024,
+M=1048576, etc.).
 .It Fl n
 Produce a long listing with user and group information presented
 numerically.
diff --git a/sftp.c b/sftp.c
index 78f8ca178401cb01a02ec8f5548abc4961b73dc4..16f84987c5d3cb35db84a3df1fba65908dfbc519 100644 (file)
--- a/sftp.c
+++ b/sftp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp.c,v 1.118 2010/01/09 11:13:02 dtucker Exp $ */
+/* $OpenBSD: sftp.c,v 1.119 2010/01/13 01:40:16 djm Exp $ */
 /*
  * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
  *
@@ -110,16 +110,17 @@ extern char *__progname;
 #define WHITESPACE " \t\r\n"
 
 /* ls flags */
-#define LS_LONG_VIEW   0x01    /* Full view ala ls -l */
-#define LS_SHORT_VIEW  0x02    /* Single row view ala ls -1 */
-#define LS_NUMERIC_VIEW        0x04    /* Long view with numeric uid/gid */
-#define LS_NAME_SORT   0x08    /* Sort by name (default) */
-#define LS_TIME_SORT   0x10    /* Sort by mtime */
-#define LS_SIZE_SORT   0x20    /* Sort by file size */
-#define LS_REVERSE_SORT        0x40    /* Reverse sort order */
-#define LS_SHOW_ALL    0x80    /* Don't skip filenames starting with '.' */
-
-#define VIEW_FLAGS     (LS_LONG_VIEW|LS_SHORT_VIEW|LS_NUMERIC_VIEW)
+#define LS_LONG_VIEW   0x0001  /* Full view ala ls -l */
+#define LS_SHORT_VIEW  0x0002  /* Single row view ala ls -1 */
+#define LS_NUMERIC_VIEW        0x0004  /* Long view with numeric uid/gid */
+#define LS_NAME_SORT   0x0008  /* Sort by name (default) */
+#define LS_TIME_SORT   0x0010  /* Sort by mtime */
+#define LS_SIZE_SORT   0x0020  /* Sort by file size */
+#define LS_REVERSE_SORT        0x0040  /* Reverse sort order */
+#define LS_SHOW_ALL    0x0080  /* Don't skip filenames starting with '.' */
+#define LS_SI_UNITS    0x0100  /* Display sizes as K, M, G, etc. */
+
+#define VIEW_FLAGS     (LS_LONG_VIEW|LS_SHORT_VIEW|LS_NUMERIC_VIEW|LS_SI_UNITS)
 #define SORT_FLAGS     (LS_NAME_SORT|LS_TIME_SORT|LS_SIZE_SORT)
 
 /* Commands for interactive mode */
@@ -383,7 +384,7 @@ parse_ls_flags(char **argv, int argc, int *lflag)
        opterr = 0;
 
        *lflag = LS_NAME_SORT;
-       while ((ch = getopt(argc, argv, "1Saflnrt")) != -1) {
+       while ((ch = getopt(argc, argv, "1Safhlnrt")) != -1) {
                switch (ch) {
                case '1':
                        *lflag &= ~VIEW_FLAGS;
@@ -399,12 +400,15 @@ parse_ls_flags(char **argv, int argc, int *lflag)
                case 'f':
                        *lflag &= ~SORT_FLAGS;
                        break;
+               case 'h':
+                       *lflag |= LS_SI_UNITS;
+                       break;
                case 'l':
-                       *lflag &= ~VIEW_FLAGS;
+                       *lflag &= ~LS_SHORT_VIEW;
                        *lflag |= LS_LONG_VIEW;
                        break;
                case 'n':
-                       *lflag &= ~VIEW_FLAGS;
+                       *lflag &= ~LS_SHORT_VIEW;
                        *lflag |= LS_NUMERIC_VIEW|LS_LONG_VIEW;
                        break;
                case 'r':
@@ -716,13 +720,14 @@ do_ls_dir(struct sftp_conn *conn, char *path, char *strip_path, int lflag)
                xfree(tmp);
 
                if (lflag & LS_LONG_VIEW) {
-                       if (lflag & LS_NUMERIC_VIEW) {
+                       if (lflag & (LS_NUMERIC_VIEW|LS_SI_UNITS)) {
                                char *lname;
                                struct stat sb;
 
                                memset(&sb, 0, sizeof(sb));
                                attrib_to_stat(&d[n]->a, &sb);
-                               lname = ls_file(fname, &sb, 1);
+                               lname = ls_file(fname, &sb, 1,
+                                   (lflag & LS_SI_UNITS));
                                printf("%s\n", lname);
                                xfree(lname);
                        } else
@@ -824,7 +829,7 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
                                a = do_lstat(conn, g.gl_pathv[i], 1);
                        if (a != NULL)
                                attrib_to_stat(a, &sb);
-                       lname = ls_file(fname, &sb, 1);
+                       lname = ls_file(fname, &sb, 1, (lflag & LS_SI_UNITS));
                        printf("%s\n", lname);
                        xfree(lname);
                } else {
This page took 0.079535 seconds and 5 git commands to generate.