diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 125512ba6e7..056b1176596 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ls.c,v 1.54 2020/10/07 21:03:09 millert Exp $ */ +/* $OpenBSD: ls.c,v 1.55 2023/10/07 11:51:08 schwarze Exp $ */ /* $NetBSD: ls.c,v 1.18 1996/07/09 09:16:29 mycroft Exp $ */ /* @@ -436,6 +436,7 @@ display(FTSENT *p, FTSENT *list) unsigned long long btotal; blkcnt_t maxblock; ino_t maxinode; + unsigned int maxmajor, maxminor; int bcfile, flen, glen, ulen, maxflags, maxgroup, maxuser, maxlen; int entries, needstats; int width; @@ -449,6 +450,7 @@ display(FTSENT *p, FTSENT *list) btotal = maxblock = maxinode = maxlen = maxnlink = 0; bcfile = 0; maxuser = maxgroup = maxflags = 0; + maxmajor = maxminor = 0; maxsize = 0; for (cur = list, entries = 0; cur != NULL; cur = cur->fts_link) { if (cur->fts_info == FTS_ERR || cur->fts_info == FTS_NS) { @@ -523,9 +525,13 @@ display(FTSENT *p, FTSENT *list) (void)strlcpy(np->group, group, glen + 1); if (S_ISCHR(sp->st_mode) || - S_ISBLK(sp->st_mode)) + S_ISBLK(sp->st_mode)) { bcfile = 1; - + if (maxmajor < major(sp->st_rdev)) + maxmajor = major(sp->st_rdev); + if (maxminor < minor(sp->st_rdev)) + maxminor = minor(sp->st_rdev); + } if (f_flags) { np->flags = &np->data[ulen + 1 + glen + 1]; (void)strlcpy(np->flags, flags, flen + 1); @@ -551,7 +557,6 @@ display(FTSENT *p, FTSENT *list) d.entries = entries; d.maxlen = maxlen; if (needstats) { - d.bcfile = bcfile; d.btotal = btotal; (void)snprintf(buf, sizeof(buf), "%llu", (unsigned long long)maxblock); @@ -570,6 +575,17 @@ display(FTSENT *p, FTSENT *list) d.s_size = strlen(buf); } else d.s_size = FMT_SCALED_STRSIZE-2; /* no - or '\0' */ + d.s_major = d.s_minor = 3; + if (bcfile) { + (void)snprintf(buf, sizeof(buf), "%u", maxmajor); + d.s_major = strlen(buf); + (void)snprintf(buf, sizeof(buf), "%u", maxminor); + d.s_minor = strlen(buf); + if (d.s_size <= d.s_major + 2 + d.s_minor) + d.s_size = d.s_major + 2 + d.s_minor; + else + d.s_major = d.s_size - 2 - d.s_minor; + } d.s_user = maxuser; } diff --git a/bin/ls/ls.h b/bin/ls/ls.h index 1feebd9324a..7f654f5881e 100644 --- a/bin/ls/ls.h +++ b/bin/ls/ls.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ls.h,v 1.9 2013/05/30 16:34:32 guenther Exp $ */ +/* $OpenBSD: ls.h,v 1.10 2023/10/07 11:51:08 schwarze Exp $ */ /* $NetBSD: ls.h,v 1.7 1995/03/21 09:06:33 cgd Exp $ */ /* @@ -55,7 +55,6 @@ extern int f_typedir; /* add type character for directories */ typedef struct { FTSENT *list; unsigned long long btotal; - int bcfile; int entries; int maxlen; int s_block; @@ -64,6 +63,8 @@ typedef struct { int s_inode; int s_nlink; int s_size; + int s_major; + int s_minor; int s_user; } DISPLAY; diff --git a/bin/ls/print.c b/bin/ls/print.c index 646b4277b81..ce3b82d109b 100644 --- a/bin/ls/print.c +++ b/bin/ls/print.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print.c,v 1.39 2020/10/07 21:03:09 millert Exp $ */ +/* $OpenBSD: print.c,v 1.40 2023/10/07 11:51:08 schwarze Exp $ */ /* $NetBSD: print.c,v 1.15 1996/12/11 03:25:39 thorpej Exp $ */ /* @@ -110,12 +110,9 @@ printlong(DISPLAY *dp) if (f_flags) (void)printf("%-*s ", dp->s_flags, np->flags); if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode)) - (void)printf("%3u, %3u ", - major(sp->st_rdev), minor(sp->st_rdev)); - else if (dp->bcfile) - (void)printf("%*s%*lld ", - 8 - dp->s_size, "", dp->s_size, - (long long)sp->st_size); + (void)printf("%*u, %*u ", + dp->s_major, major(sp->st_rdev), + dp->s_minor, minor(sp->st_rdev)); else printsize(dp->s_size, sp->st_size); if (f_accesstime)