diff options
Diffstat (limited to 'src/minutils/s6ps_statparse.c')
-rw-r--r-- | src/minutils/s6ps_statparse.c | 125 |
1 files changed, 65 insertions, 60 deletions
diff --git a/src/minutils/s6ps_statparse.c b/src/minutils/s6ps_statparse.c index 229ed11..0b1b261 100644 --- a/src/minutils/s6ps_statparse.c +++ b/src/minutils/s6ps_statparse.c @@ -14,40 +14,29 @@ is still smaller than scanf (no floating point parsing etc.) */ -#define STATVARS 41 +#define STATVARS 49 typedef size_t scanfunc_t (char const *, void *) ; typedef scanfunc_t *scanfunc_t_ref ; -static size_t f32 (char const *s, void *u32) -{ - uint32_t *u = u32 ; - return uint32_scan(s, u) ; -} - static size_t f64 (char const *s, void *u64) { uint64_t *u = u64 ; return uint64_scan(s, u) ; } -static size_t fint (char const *s, void *i) -{ - int *d = i ; - return int_scan(s, d) ; -} - -static size_t fpid (char const *s, void *p) -{ - pid_t *pid = p ; - return pid_scan(s, pid) ; -} +#define DEFUN(name, type) \ +static size_t name (char const *s, void *p) \ +{ \ + uint64_t u ; \ + size_t len = uint64_scan(s, &u) ; \ + *(type *)p = u ; \ + return len ; \ +} \ -static size_t fdev (char const *s, void *p) -{ - dev_t *d = p ; - return dev_scan(s, d) ; -} +DEFUN(fint, int) +DEFUN(fpid, pid_t) +DEFUN(fdev, dev_t) static scanfunc_t_ref scanfuncs[STATVARS] = { @@ -56,19 +45,19 @@ static scanfunc_t_ref scanfuncs[STATVARS] = &fpid, /* session */ &fdev, /* tty_nr */ &fpid, /* tpgid */ - &f32, /* flags */ - &f32, /* minflt */ - &f32, /* cminflt */ - &f32, /* majflt */ - &f32, /* cmajflt */ + &f64, /* flags */ + &f64, /* minflt */ + &f64, /* cminflt */ + &f64, /* majflt */ + &f64, /* cmajflt */ &f64, /* utime */ &f64, /* stime */ &f64, /* cutime */ &f64, /* cstime */ &fint, /* priority */ &fint, /* nice */ - &f32, /* num_threads */ - &f32, /* itrealvalue */ + &f64, /* num_threads */ + &f64, /* itrealvalue */ &f64, /* starttime */ &f64, /* vsize */ &f64, /* rss */ @@ -78,26 +67,34 @@ static scanfunc_t_ref scanfuncs[STATVARS] = &f64, /* startstack */ &f64, /* kstkesp */ &f64, /* kstkeip */ - &f32, /* signal */ - &f32, /* blocked */ - &f32, /* sigignore */ - &f32, /* sigcatch */ + &f64, /* signal */ + &f64, /* blocked */ + &f64, /* sigignore */ + &f64, /* sigcatch */ &f64, /* wchan */ - &f32, /* nswap */ - &f32, /* cnswap */ - &f32, /* exit_signal */ - &f32, /* processor */ - &f32, /* rt_priority */ - &f32, /* policy */ + &f64, /* nswap */ + &f64, /* cnswap */ + &fint, /* exit_signal */ + &f64, /* processor */ + &f64, /* rt_priority */ + &f64, /* policy */ &f64, /* delayacct_blkio_ticks */ - &f32, /* guest_time */ - &f32 /* cguest_time */ + &f64, /* guest_time */ + &f64, /* cguest_time */ + &f64, /* start_data */ + &f64, /* end_data */ + &f64, /* start_brk */ + &f64, /* arg_start */ + &f64, /* arg_end */ + &f64, /* env_start */ + &f64, /* env_end */ + &fint /* exit_code */ } ; int s6ps_statparse (pscan_t *p) { uint64_t dummy64 ; - uint32_t dummy32 ; + int dummyint ; size_t pos = 0 ; void *scanresults[STATVARS] = { @@ -106,11 +103,11 @@ int s6ps_statparse (pscan_t *p) &p->session, &p->ttynr, &p->tpgid, - &dummy32, - &dummy32, - &dummy32, - &dummy32, - &dummy32, + &dummy64, + &dummy64, + &dummy64, + &dummy64, + &dummy64, &p->utime, &p->stime, &p->cutime, @@ -118,7 +115,7 @@ int s6ps_statparse (pscan_t *p) &p->prio, &p->nice, &p->threads, - &dummy32, + &dummy64, &p->start, &p->vsize, &p->rss, @@ -128,27 +125,35 @@ int s6ps_statparse (pscan_t *p) &dummy64, &dummy64, &dummy64, - &dummy32, - &dummy32, - &dummy32, - &dummy32, + &dummy64, + &dummy64, + &dummy64, + &dummy64, &p->wchan, - &dummy32, - &dummy32, - &dummy32, + &dummy64, + &dummy64, + &dummy64, &p->cpuno, &p->rtprio, &p->policy, &dummy64, - &dummy32, - &dummy32 + &dummy64, + &dummy64, + &dummy64, + &dummy64, + &dummy64, + &dummy64, + &dummy64, + &dummy64, + &dummy64, + &dummyint } ; unsigned int i = 0 ; if (!p->statlen) return 0 ; - pos = uint32_scan(p->data.s, &dummy32) ; + pos = uint64_scan(p->data.s, &dummy64) ; if (!pos) return 0 ; - if (dummy32 != p->pid) return 0 ; + if (dummy64 != p->pid) return 0 ; if (pos + 5 + p->commlen > p->statlen) return 0 ; if (p->data.s[pos++] != ' ') return 0 ; if (p->data.s[pos++] != '(') return 0 ; |