Fix libxo output from uptime command
the libxo output for uptime returned multiple 'uptime' keys, one each for number of days, hours, and minutes of uptime. This is invalid JSON. This patch makes the output the raw number of seconds, as well as adding keys for the individual unit values A string of the original output from the plain-text uptime command is also added Differential Revision: https://reviews.freebsd.org/D2063 Reviewed by: jmg Approved by: marcel Sponsored by: ScaleEngine Inc.
This commit is contained in:
parent
6c4f929517
commit
630a02daae
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=281625
@ -4,7 +4,7 @@
|
|||||||
PROG= w
|
PROG= w
|
||||||
SRCS= fmt.c pr_time.c proc_compare.c w.c
|
SRCS= fmt.c pr_time.c proc_compare.c w.c
|
||||||
MAN= w.1 uptime.1
|
MAN= w.1 uptime.1
|
||||||
LIBADD= kvm util xo
|
LIBADD= kvm sbuf util xo
|
||||||
#BINGRP= kmem
|
#BINGRP= kmem
|
||||||
#BINMODE=2555
|
#BINMODE=2555
|
||||||
LINKS= ${BINDIR}/w ${BINDIR}/uptime
|
LINKS= ${BINDIR}/w ${BINDIR}/uptime
|
||||||
|
@ -54,8 +54,10 @@ static const char sccsid[] = "@(#)w.c 8.4 (Berkeley) 4/16/94";
|
|||||||
#include <sys/proc.h>
|
#include <sys/proc.h>
|
||||||
#include <sys/user.h>
|
#include <sys/user.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/sbuf.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/tty.h>
|
#include <sys/tty.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@ -472,7 +474,9 @@ pr_header(time_t *nowp, int nusers)
|
|||||||
struct timespec tp;
|
struct timespec tp;
|
||||||
int days, hrs, i, mins, secs;
|
int days, hrs, i, mins, secs;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
struct sbuf *upbuf;
|
||||||
|
|
||||||
|
upbuf = sbuf_new_auto();
|
||||||
/*
|
/*
|
||||||
* Print time of day.
|
* Print time of day.
|
||||||
*/
|
*/
|
||||||
@ -493,21 +497,27 @@ pr_header(time_t *nowp, int nusers)
|
|||||||
mins = uptime / 60;
|
mins = uptime / 60;
|
||||||
secs = uptime % 60;
|
secs = uptime % 60;
|
||||||
xo_emit(" up");
|
xo_emit(" up");
|
||||||
xo_attr("seconds", "%lu", (unsigned long) tp.tv_sec);
|
xo_emit("{e:uptime/%lu}", (unsigned long) tp.tv_sec);
|
||||||
|
xo_emit("{e:days/%d}{e:hours/%d}{e:minutes/%d}{e:seconds/%d}", days, hrs, mins, secs);
|
||||||
|
|
||||||
if (days > 0)
|
if (days > 0)
|
||||||
xo_emit(" {:uptime/%d day%s},",
|
sbuf_printf(upbuf, " %d day%s,",
|
||||||
days, days > 1 ? "s" : "");
|
days, days > 1 ? "s" : "");
|
||||||
if (hrs > 0 && mins > 0)
|
if (hrs > 0 && mins > 0)
|
||||||
xo_emit(" {:uptime/%2d:%02d},", hrs, mins);
|
sbuf_printf(upbuf, " %2d:%02d,", hrs, mins);
|
||||||
else if (hrs > 0)
|
else if (hrs > 0)
|
||||||
xo_emit(" {:uptime/%d hr%s},",
|
sbuf_printf(upbuf, " %d hr%s,",
|
||||||
hrs, hrs > 1 ? "s" : "");
|
hrs, hrs > 1 ? "s" : "");
|
||||||
else if (mins > 0)
|
else if (mins > 0)
|
||||||
xo_emit(" {:uptime/%d min%s},",
|
sbuf_printf(upbuf, " %d min%s,",
|
||||||
mins, mins > 1 ? "s" : "");
|
mins, mins > 1 ? "s" : "");
|
||||||
else
|
else
|
||||||
xo_emit(" {:uptime/%d sec%s},",
|
sbuf_printf(upbuf, " %d sec%s,",
|
||||||
secs, secs > 1 ? "s" : "");
|
secs, secs > 1 ? "s" : "");
|
||||||
|
if (sbuf_finish(upbuf) != 0)
|
||||||
|
xo_err(1, "Could not generate output");
|
||||||
|
xo_emit("{:uptime-human/%s}", sbuf_data(upbuf));
|
||||||
|
sbuf_delete(upbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print number of users logged in to system */
|
/* Print number of users logged in to system */
|
||||||
|
Loading…
Reference in New Issue
Block a user