Enhance sysinfo decoding

* configure.ac (AC_CHECK_MEMBERS): Check for struct sysinfo.totalhigh,
struct sysinfo.freehigh, and struct sysinfo.mem_unit.
* sysinfo.c (sys_sysinfo): Treat failed umove() call as syserror().
Print totalhigh, freehigh, and mem_unit members when struct sysinfo
supports them.
This commit is contained in:
Дмитрий Левин 2014-09-29 23:29:56 +00:00
parent 57d45a2b3a
commit 82a528d96f
2 changed files with 50 additions and 17 deletions

@ -272,6 +272,10 @@ AC_CHECK_MEMBERS([struct sigevent._sigev_un._pad,
struct sigevent.__pad,
siginfo_t.si_syscall],,, [#include <signal.h>])
AC_CHECK_MEMBERS([struct sysinfo.totalhigh,
struct sysinfo.freehigh,
struct sysinfo.mem_unit],,, [#include <sys/sysinfo.h>])
AC_CHECK_TYPES([struct flock64],,, [#include <fcntl.h>])
AC_CHECK_HEADERS([libaio.h], [

@ -6,23 +6,52 @@ sys_sysinfo(struct tcb *tcp)
{
struct sysinfo si;
if (exiting(tcp)) {
if (syserror(tcp) || !verbose(tcp))
tprintf("%#lx", tcp->u_arg[0]);
else if (umove(tcp, tcp->u_arg[0], &si) < 0)
tprints("{...}");
else {
tprintf("{uptime=%lu, loads=[%lu, %lu, %lu] ",
(long) si.uptime, (long) si.loads[0],
(long) si.loads[1], (long) si.loads[2]);
tprintf("totalram=%lu, freeram=%lu, ",
(long) si.totalram, (long) si.freeram);
tprintf("sharedram=%lu, bufferram=%lu} ",
(long) si.sharedram, (long) si.bufferram);
tprintf("totalswap=%lu, freeswap=%lu, procs=%u}",
(long) si.totalswap, (long) si.freeswap,
(unsigned)si.procs);
}
if (entering(tcp))
return 0;
if (syserror(tcp) || !verbose(tcp) ||
umove(tcp, tcp->u_arg[0], &si) < 0) {
tprintf("%#lx", tcp->u_arg[0]);
} else {
tprintf("{uptime=%lu"
", loads=[%lu, %lu, %lu]"
", totalram=%lu"
", freeram=%lu"
", sharedram=%lu"
", bufferram=%lu"
", totalswap=%lu"
", freeswap=%lu"
", procs=%u"
#ifdef HAVE_STRUCT_SYSINFO_TOTALHIGH
", totalhigh=%lu"
#endif
#ifdef HAVE_STRUCT_SYSINFO_FREEHIGH
", freehigh=%lu"
#endif
#ifdef HAVE_STRUCT_SYSINFO_MEM_UNIT
", mem_unit=%u"
#endif
"}",
si.uptime
, si.loads[0], si.loads[1], si.loads[2]
, si.totalram
, si.freeram
, si.sharedram
, si.bufferram
, si.totalswap
, si.freeswap
, (unsigned) si.procs
#ifdef HAVE_STRUCT_SYSINFO_TOTALHIGH
, si.totalhigh
#endif
#ifdef HAVE_STRUCT_SYSINFO_FREEHIGH
, si.freehigh
#endif
#ifdef HAVE_STRUCT_SYSINFO_MEM_UNIT
, si.mem_unit
#endif
);
}
return 0;
}