svn commit: r359798 - stable/11/usr.bin/ruptime
Takahashi Yoshihiro
nyan at FreeBSD.org
Sat Apr 11 07:37:10 UTC 2020
Author: nyan
Date: Sat Apr 11 07:37:10 2020
New Revision: 359798
URL: https://svnweb.freebsd.org/changeset/base/359798
Log:
MFC: r314640 (by bde)
> Fix formatting. ruptime output on FreeBSD cluster machines annoyed me
> by usually being double-spaced due to auto-wrap at column 80.
>
> r212771 increased width of the hostname field from 12 to 25. This was
> supposed to allow for 80-column output with all 3 load averages taking
> 5 characters each, but it actually gave width exactly 80 and thus worse
> than useless auto-wrap in that case. 3 wide load average fields are
> unusual, but later expansion of another field gave the auto-wrap with
> just 2 wide load average fields.
>
> Change to dynamic field widths for all fields except the uptime. This
> also fixes the formatting of high (above 9999) user counts and not
> very high (above 9.99) load averages. The formatting for numbers now
> breaks at 99999.99, but scientific notation should be used starting
> well below that.
>
> The field width for the uptime remains hard-coded to work consistently
> for uptimes less than 10000 days, but this gives too much space for
> small uptimes. Punctuation between fields could be improved in many
> ways, for example by removing it.
Modified:
stable/11/usr.bin/ruptime/ruptime.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/usr.bin/ruptime/ruptime.c
==============================================================================
--- stable/11/usr.bin/ruptime/ruptime.c Sat Apr 11 07:37:08 2020 (r359797)
+++ stable/11/usr.bin/ruptime/ruptime.c Sat Apr 11 07:37:10 2020 (r359798)
@@ -69,6 +69,7 @@ static DIR *dirp;
static int hscmp(const void *, const void *);
static char *interval(time_t, const char *);
+static int iwidth(int);
static int lcmp(const void *, const void *);
static void ruptime(const char *, int, int (*)(const void *, const void *));
static int tcmp(const void *, const void *);
@@ -143,6 +144,21 @@ interval(time_t tval, const char *updown)
return (resbuf);
}
+/* Width to print a small nonnegative integer. */
+static int
+iwidth(int w)
+{
+ if (w < 10)
+ return (1);
+ if (w < 100)
+ return (2);
+ if (w < 1000)
+ return (3);
+ if (w < 10000)
+ return (4);
+ return (5);
+}
+
#define HS(a) ((const struct hs *)(a))
/* Alphabetical comparison. */
@@ -176,14 +192,17 @@ ruptime(const char *host, int aflg, int (*cmp)(const v
struct whod *wd;
struct whoent *we;
struct dirent *dp;
- const char *hostname;
- int fd, i, maxloadav;
+ int fd, hostnamewidth, i, loadavwidth[3], userswidth, w;
size_t hspace;
ssize_t cc;
rewinddir(dirp);
hsp = NULL;
- maxloadav = -1;
+ hostnamewidth = 0;
+ loadavwidth[0] = 4;
+ loadavwidth[1] = 4;
+ loadavwidth[2] = 4;
+ userswidth = 1;
(void)time(&now);
for (nhosts = hspace = 0; (dp = readdir(dirp)) != NULL;) {
if (dp->d_ino == 0 || strncmp(dp->d_name, "whod.", 5) != 0)
@@ -206,22 +225,25 @@ ruptime(const char *host, int aflg, int (*cmp)(const v
if (cc < (ssize_t)WHDRSIZE)
continue;
- if (host != NULL) {
- hostname = wd->wd_hostname;
- if (strcasecmp(hostname, host) != 0)
- continue;
- }
+ if (host != NULL && strcasecmp(wd->wd_hostname, host) != 0)
+ continue;
if (LEFTEARTH(wd->wd_recvtime))
continue;
- for (i = 0; i < 2; i++)
- if (wd->wd_loadav[i] > maxloadav)
- maxloadav = wd->wd_loadav[i];
+ if (hostnamewidth < (int)strlen(wd->wd_hostname))
+ hostnamewidth = (int)strlen(wd->wd_hostname);
+ for (i = 0; i < 3; i++) {
+ w = iwidth(wd->wd_loadav[i] / 100) + 3;
+ if (loadavwidth[i] < w)
+ loadavwidth[i] = w;
+ }
for (hsp->hs_nusers = 0, we = &wd->wd_we[0];
(char *)(we + 1) <= (char *)wd + cc; we++)
if (aflg || we->we_idle < 3600)
++hsp->hs_nusers;
+ if (userswidth < iwidth(hsp->hs_nusers))
+ userswidth = iwidth(hsp->hs_nusers);
++hsp;
++nhosts;
}
@@ -233,27 +255,28 @@ ruptime(const char *host, int aflg, int (*cmp)(const v
}
qsort(hs, nhosts, sizeof(hs[0]), cmp);
+ w = userswidth + loadavwidth[0] + loadavwidth[1] + loadavwidth[2];
+ if (hostnamewidth + w > 41)
+ hostnamewidth = 41 - w; /* limit to 79 cols */
for (i = 0; i < (int)nhosts; i++) {
hsp = &hs[i];
wd = &hsp->hs_wd;
if (ISDOWN(hsp)) {
- (void)printf("%-25.25s%s\n", wd->wd_hostname,
+ (void)printf("%-*.*s%s\n",
+ hostnamewidth, hostnamewidth, wd->wd_hostname,
interval(now - hsp->hs_wd.wd_recvtime, "down"));
continue;
}
(void)printf(
- "%-25.25s%s, %4d user%s load %*.2f, %*.2f, %*.2f\n",
- wd->wd_hostname,
+ "%-*.*s %s, %*d user%s load %*.2f, %*.2f, %*.2f\n",
+ hostnamewidth, hostnamewidth, wd->wd_hostname,
interval((time_t)wd->wd_sendtime -
(time_t)wd->wd_boottime, " up"),
- hsp->hs_nusers,
+ userswidth, hsp->hs_nusers,
hsp->hs_nusers == 1 ? ", " : "s,",
- maxloadav >= 1000 ? 5 : 4,
- wd->wd_loadav[0] / 100.0,
- maxloadav >= 1000 ? 5 : 4,
- wd->wd_loadav[1] / 100.0,
- maxloadav >= 1000 ? 5 : 4,
- wd->wd_loadav[2] / 100.0);
+ loadavwidth[0], wd->wd_loadav[0] / 100.0,
+ loadavwidth[1], wd->wd_loadav[1] / 100.0,
+ loadavwidth[2], wd->wd_loadav[2] / 100.0);
}
free(hs);
hs = NULL;
More information about the svn-src-all
mailing list