From owner-svn-src-stable@FreeBSD.ORG Wed Feb 24 15:27:32 2010 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 632971065672; Wed, 24 Feb 2010 15:27:32 +0000 (UTC) (envelope-from jh@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 518F48FC18; Wed, 24 Feb 2010 15:27:32 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o1OFRVCX025837; Wed, 24 Feb 2010 15:27:32 GMT (envelope-from jh@svn.freebsd.org) Received: (from jh@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o1OFRV9P025833; Wed, 24 Feb 2010 15:27:31 GMT (envelope-from jh@svn.freebsd.org) Message-Id: <201002241527.o1OFRV9P025833@svn.freebsd.org> From: Jaakko Heinonen Date: Wed, 24 Feb 2010 15:27:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r204277 - stable/8/bin/ls X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Feb 2010 15:27:32 -0000 Author: jh Date: Wed Feb 24 15:27:31 2010 New Revision: 204277 URL: http://svn.freebsd.org/changeset/base/204277 Log: MFC r202945: Fixes for ls(1) long format (-l) output: - Allow -h option to work if the listing contains at least one device file. - Align major and minor device numbers correctly to the size field. PR: bin/125678 Modified: stable/8/bin/ls/ls.c stable/8/bin/ls/ls.h stable/8/bin/ls/print.c Directory Properties: stable/8/bin/ls/ (props changed) Modified: stable/8/bin/ls/ls.c ============================================================================== --- stable/8/bin/ls/ls.c Wed Feb 24 14:19:56 2010 (r204276) +++ stable/8/bin/ls/ls.c Wed Feb 24 15:27:31 2010 (r204277) @@ -559,7 +559,8 @@ display(const FTSENT *p, FTSENT *list, i long maxblock; u_long btotal, labelstrlen, maxinode, maxlen, maxnlink; u_long maxlabelstr; - int bcfile, maxflags; + u_int devstrlen; + int maxflags; gid_t maxgroup; uid_t maxuser; size_t flen, ulen, glen; @@ -651,7 +652,7 @@ display(const FTSENT *p, FTSENT *list, i MAKENINES(maxsize); free(jinitmax); } - bcfile = 0; + devstrlen = 0; flags = NULL; for (cur = list, entries = 0; cur; cur = cur->fts_link) { if (cur->fts_info == FTS_ERR || cur->fts_info == FTS_NS) { @@ -791,9 +792,15 @@ label_out: np->group = &np->data[ulen + 1]; (void)strcpy(np->group, group); - if (S_ISCHR(sp->st_mode) || - S_ISBLK(sp->st_mode)) - bcfile = 1; + if ((S_ISCHR(sp->st_mode) || + S_ISBLK(sp->st_mode)) && + devstrlen < DEVSTR_HEX_LEN) { + if (minor(sp->st_rdev) > 255 || + minor(sp->st_rdev) < 0) + devstrlen = DEVSTR_HEX_LEN; + else + devstrlen = DEVSTR_LEN; + } if (f_flags) { np->flags = &np->data[ulen + glen + 2]; @@ -825,7 +832,6 @@ label_out: d.entries = entries; d.maxlen = maxlen; if (needstats) { - d.bcfile = bcfile; d.btotal = btotal; (void)snprintf(buf, sizeof(buf), "%lu", maxblock); d.s_block = strlen(buf); @@ -836,8 +842,14 @@ label_out: d.s_inode = strlen(buf); (void)snprintf(buf, sizeof(buf), "%lu", maxnlink); d.s_nlink = strlen(buf); - (void)snprintf(buf, sizeof(buf), "%ju", maxsize); - d.s_size = strlen(buf); + if (f_humanval) + d.s_size = HUMANVALSTR_LEN; + else { + (void)snprintf(buf, sizeof(buf), "%ju", maxsize); + d.s_size = strlen(buf); + } + if (d.s_size < devstrlen) + d.s_size = devstrlen; d.s_user = maxuser; } printfcn(&d); Modified: stable/8/bin/ls/ls.h ============================================================================== --- stable/8/bin/ls/ls.h Wed Feb 24 14:19:56 2010 (r204276) +++ stable/8/bin/ls/ls.h Wed Feb 24 15:27:31 2010 (r204277) @@ -35,6 +35,10 @@ #define NO_PRINT 1 +#define HUMANVALSTR_LEN 5 +#define DEVSTR_LEN 8 +#define DEVSTR_HEX_LEN 15 + extern long blocksize; /* block size units */ extern int f_accesstime; /* use time of last access */ @@ -62,7 +66,6 @@ extern int f_color; /* add type in colo typedef struct { FTSENT *list; u_long btotal; - int bcfile; int entries; int maxlen; u_int s_block; Modified: stable/8/bin/ls/print.c ============================================================================== --- stable/8/bin/ls/print.c Wed Feb 24 14:19:56 2010 (r204276) +++ stable/8/bin/ls/print.c Wed Feb 24 15:27:31 2010 (r204277) @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include "extern.h" static int printaname(const FTSENT *, u_long, u_long); +static void printdev(size_t, dev_t); static void printlink(const FTSENT *); static void printtime(time_t); static int printtype(u_int); @@ -165,16 +166,7 @@ printlong(const DISPLAY *dp) if (f_label) (void)printf("%-*s ", dp->s_label, np->label); if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode)) - if (minor(sp->st_rdev) > 255 || minor(sp->st_rdev) < 0) - (void)printf("%3d, 0x%08x ", - major(sp->st_rdev), - (u_int)minor(sp->st_rdev)); - else - (void)printf("%3d, %3d ", - major(sp->st_rdev), minor(sp->st_rdev)); - else if (dp->bcfile) - (void)printf("%*s%*jd ", - 8 - dp->s_size, "", dp->s_size, sp->st_size); + printdev(dp->s_size, sp->st_rdev); else printsize(dp->s_size, sp->st_size); if (f_accesstime) @@ -353,6 +345,24 @@ printaname(const FTSENT *p, u_long inode return (chcnt); } +/* + * Print device special file major and minor numbers. + */ +static void +printdev(size_t width, dev_t dev) +{ + char buf[DEVSTR_HEX_LEN + 1]; + + if (minor(dev) > 255 || minor(dev) < 0) + (void)snprintf(buf, sizeof(buf), "%3d, 0x%08x", + major(dev), (u_int)minor(dev)); + else + (void)snprintf(buf, sizeof(buf), "%3d, %3d", + major(dev), minor(dev)); + + (void)printf("%*s ", (u_int)width, buf); +} + static void printtime(time_t ftime) { @@ -592,11 +602,15 @@ printsize(size_t width, off_t bytes) { if (f_humanval) { - char buf[5]; + /* + * Reserve one space before the size and allocate room for + * the trailing '\0'. + */ + char buf[HUMANVALSTR_LEN - 1 + 1]; humanize_number(buf, sizeof(buf), (int64_t)bytes, "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); - (void)printf("%5s ", buf); + (void)printf("%*s ", (u_int)width, buf); } else (void)printf("%*jd ", (u_int)width, bytes); }