library: cleanup of library includes

The includes used to define a lot of things a library include
should not. It was also a bit messy what was exposed in the library
and what was not.

get_pid_digits -> procps_pid_length and exported correctly

MALLOC attribute move into relevant .c files
NORETURN attribute moved to relevant .c, not used in library
PURE attribute removed, it wasn't used
KLONG/KLF/STRTOUKL were fixed for long, so now just use long

HIDDEN attribute removed. It was for 3 functions. The PROCPS_EXPORT
seems to do the same (opposite) thing.

likely/unlikely removed from most places, its highly debateable
this does anything useful as CPUs have gotten smarter about branches.

Re-arranged the includes, ALL external programs should just #include
<proc/procps.h> then proc/procps.h includes headers for files that
have exported functions. procps.h and the headers it includes should
not use items that are not exportable (e.g. hidden functions or
macros) they go in procps-private.h
This commit is contained in:
Craig Small 2016-04-16 17:03:57 +10:00
parent d15a8901d2
commit ccb6ae8de1
38 changed files with 137 additions and 181 deletions

4
free.c
View File

@ -41,9 +41,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <proc/sysinfo.h> #include <proc/procps.h>
#include <proc/version.h>
#include <proc/meminfo.h>
#ifndef SIZE_MAX #ifndef SIZE_MAX
#define SIZE_MAX 32 #define SIZE_MAX 32

View File

@ -49,9 +49,7 @@
#include "nls.h" #include "nls.h"
#include "signals.h" #include "signals.h"
#include "xalloc.h" #include "xalloc.h"
#include <proc/pids.h> #include <proc/procps.h>
#include <proc/namespace.h>
#include <proc/devname.h>
enum pids_item Items[] = { enum pids_item Items[] = {
PROCPS_PIDS_ID_PID, PROCPS_PIDS_ID_PID,

View File

@ -27,9 +27,7 @@
#include "fileutils.h" #include "fileutils.h"
#include "nls.h" #include "nls.h"
#include "xalloc.h" #include "xalloc.h"
//#include "proc/readproc.h" #include <proc/procps.h>
#include <proc/pids.h>
#include "proc/version.h" /* procps_version */
#define grow_size(x) (x = x * 5 / 4 + 1024) #define grow_size(x) (x = x * 5 / 4 + 1024)

19
pmap.c
View File

@ -35,8 +35,7 @@
#include "fileutils.h" #include "fileutils.h"
#include "nls.h" #include "nls.h"
#include "xalloc.h" #include "xalloc.h"
#include "proc/version.h" #include <proc/procps.h>
#include <proc/pids.h>
enum pids_item Pid_items[] = { enum pids_item Pid_items[] = {
PROCPS_PIDS_ID_PID, PROCPS_PIDS_ID_TGID, PROCPS_PIDS_ID_PID, PROCPS_PIDS_ID_TGID,
@ -176,7 +175,7 @@ static void discover_shm_minor(void)
unsigned long start, end; unsigned long start, end;
unsigned long long file_offset, inode; unsigned long long file_offset, inode;
unsigned dev_major, dev_minor; unsigned dev_major, dev_minor;
sscanf(mapbuf_b, "%" KLF "x-%" KLF "x %31s %llx %x:%x %llu", &start, sscanf(mapbuf_b, "%lx-%lx %31s %llx %x:%x %llu", &start,
&end, perms, &file_offset, &dev_major, &dev_minor, &end, perms, &file_offset, &dev_major, &dev_minor,
&inode); &inode);
tmp = strchr(mapbuf_b, '\n'); tmp = strchr(mapbuf_b, '\n');
@ -373,7 +372,7 @@ static void print_extended_maps (FILE *f)
mapbuf); mapbuf);
} }
strcpy(listnode->value_str, value_str); strcpy(listnode->value_str, value_str);
sscanf(value_str, "%"KLF"u", &listnode->value); sscanf(value_str, "%lu", &listnode->value);
if (firstmapping == 2) { if (firstmapping == 2) {
listnode->total += listnode->value; listnode->total += listnode->value;
if (q_option) { if (q_option) {
@ -614,7 +613,7 @@ static int one_proc (struct pids_stack *p)
} }
if (strncmp("Swap", smap_key, 4) == 0) { if (strncmp("Swap", smap_key, 4) == 0) {
/*doesn't matter as long as last */ /*doesn't matter as long as last */
printf("%0*" KLF "x %*lu %*llu %*llu %*s %s\n", printf("%0*lx %*lu %*llu %*llu %*s %s\n",
maxw1, start, maxw1, start,
maxw2, (unsigned long)(diff >> 10), maxw2, (unsigned long)(diff >> 10),
maxw3, rss, maxw3, rss,
@ -630,7 +629,7 @@ static int one_proc (struct pids_stack *p)
continue; continue;
} }
} }
sscanf(mapbuf, "%" KLF "x-%" KLF "x %31s %llx %x:%x %llu", &start, sscanf(mapbuf, "%lx-%lx %31s %llx %x:%x %llu", &start,
&end, perms, &file_offset, &dev_major, &dev_minor, &end, perms, &file_offset, &dev_major, &dev_minor,
&inode); &inode);
@ -677,7 +676,7 @@ static int one_proc (struct pids_stack *p)
const char *cp = const char *cp =
mapping_name(p, start, diff, mapbuf, map_desc_showpath, dev_major, mapping_name(p, start, diff, mapbuf, map_desc_showpath, dev_major,
dev_minor, inode); dev_minor, inode);
printf("%0*" KLF "x %*lu %*s %0*llx %*.*s%03x:%05x %s\n", printf("%0*lx %*lu %*s %0*llx %*.*s%03x:%05x %s\n",
maxw1, start, maxw1, start,
maxw2, (unsigned long)(diff >> 10), maxw2, (unsigned long)(diff >> 10),
maxw3, perms, maxw3, perms,
@ -690,7 +689,7 @@ static int one_proc (struct pids_stack *p)
mapping_name(p, start, diff, mapbuf, map_desc_showpath, dev_major, mapping_name(p, start, diff, mapbuf, map_desc_showpath, dev_major,
dev_minor, inode); dev_minor, inode);
printf((sizeof(long) == 8) printf((sizeof(long) == 8)
? "%016" KLF "x %6luK %s %s\n" ? "%016lx %6luK %s %s\n"
: "%08lx %6luK %s %s\n", : "%08lx %6luK %s %s\n",
start, (unsigned long)(diff >> 10), perms, cp); start, (unsigned long)(diff >> 10), perms, cp);
} }
@ -757,9 +756,9 @@ static void range_arguments(char *optarg)
else else
arg2 = arg1; arg2 = arg1;
if (arg1 && *arg1) if (arg1 && *arg1)
range_low = STRTOUKL(arg1, &arg1, 16); range_low = strtoul(arg1, &arg1, 16);
if (*arg2) if (*arg2)
range_high = STRTOUKL(arg2, &arg2, 16); range_high = strtoul(arg2, &arg2, 16);
if (arg1 && (*arg1 || *arg2)) if (arg1 && (*arg1 || *arg2))
xerrx(EXIT_FAILURE, "%s: '%s'", _("failed to parse argument"), xerrx(EXIT_FAILURE, "%s: '%s'", _("failed to parse argument"),
optarg); optarg);

View File

@ -25,6 +25,10 @@
#include "alloc.h" #include "alloc.h"
typedef void (*message_fn)(const char *__restrict, ...) __attribute__((format(printf,1,2)));
/* change xalloc_err_handler to override the default fprintf(stderr... */
extern message_fn xalloc_err_handler;
static void xdefault_error(const char *restrict fmts, ...) __attribute__((format(printf,1,2))); static void xdefault_error(const char *restrict fmts, ...) __attribute__((format(printf,1,2)));
static void xdefault_error(const char *restrict fmts, ...) { static void xdefault_error(const char *restrict fmts, ...) {
va_list va; va_list va;

View File

@ -1,12 +1,11 @@
#ifndef PROCPS_PROC_ALLOC_H #ifndef PROCPS_PROC_ALLOC_H
#define PROCPS_PROC_ALLOC_H #define PROCPS_PROC_ALLOC_H
#include <proc/procps.h> #include <features.h>
__BEGIN_DECLS __BEGIN_DECLS
/* change xalloc_err_handler to override the default fprintf(stderr... */ #define MALLOC __attribute__ ((__malloc__))
extern message_fn xalloc_err_handler;
extern void *xcalloc(unsigned int size) MALLOC; extern void *xcalloc(unsigned int size) MALLOC;
extern void *xmalloc(size_t size) MALLOC; extern void *xmalloc(size_t size) MALLOC;

View File

@ -1,7 +1,7 @@
#ifndef PROC_DEVNAME_H #ifndef PROC_DEVNAME_H
#define PROC_DEVNAME_H #define PROC_DEVNAME_H
#include <proc/procps.h> #include <features.h>
__BEGIN_DECLS __BEGIN_DECLS

View File

@ -22,7 +22,7 @@
#ifndef PROC_DISKSTAT_H #ifndef PROC_DISKSTAT_H
#define PROC_DISKSTAT_H #define PROC_DISKSTAT_H
#include <proc/procps.h> #include <features.h>
__BEGIN_DECLS __BEGIN_DECLS

View File

@ -1,8 +1,8 @@
#ifndef PROCPS_PROC_ESCAPE_H #ifndef PROCPS_PROC_ESCAPE_H
#define PROCPS_PROC_ESCAPE_H #define PROCPS_PROC_ESCAPE_H
#include <proc/procps.h>
#include <proc/readproc.h> #include <proc/readproc.h>
#include <features.h>
__BEGIN_DECLS __BEGIN_DECLS

View File

@ -7,7 +7,6 @@ global:
escape_strlist; escape_strlist;
escaped_copy; escaped_copy;
fatal_proc_unmounted; fatal_proc_unmounted;
get_pid_digits;
look_up_our_self; look_up_our_self;
lookup_wchan; lookup_wchan;
openproc; openproc;
@ -40,6 +39,7 @@ global:
procps_ns_get_name; procps_ns_get_name;
procps_ns_get_id; procps_ns_get_id;
procps_ns_read_pid; procps_ns_read_pid;
procps_pid_length;
procps_pids_new; procps_pids_new;
procps_pids_read_next; procps_pids_read_next;
procps_pids_read_open; procps_pids_read_open;

View File

@ -23,7 +23,7 @@
#ifndef PROC_MEMINFO_H #ifndef PROC_MEMINFO_H
#define PROC_MEMINFO_H #define PROC_MEMINFO_H
#include <proc/procps.h> #include <features.h>
__BEGIN_DECLS __BEGIN_DECLS

View File

@ -23,8 +23,6 @@
#ifndef PROC_NAMESPACE_H #ifndef PROC_NAMESPACE_H
#define PROC_NAMESPACE_H #define PROC_NAMESPACE_H
#include <proc/procps.h>
__BEGIN_DECLS __BEGIN_DECLS
enum namespace_type { enum namespace_type {

View File

@ -23,6 +23,7 @@
#ifndef _PROC_PIDS_H #ifndef _PROC_PIDS_H
#define _PROC_PIDS_H #define _PROC_PIDS_H
#include <features.h>
__BEGIN_DECLS __BEGIN_DECLS
enum pids_item { enum pids_item {

View File

@ -20,6 +20,11 @@
#include <proc/procps.h> #include <proc/procps.h>
#define FUNCTION __attribute__((__const__)) // no access to global mem, even via ptr, and no side effect
#define PROCPS_EXPORT __attribute__ ((visibility("default"))) #define PROCPS_EXPORT __attribute__ ((visibility("default")))
#define STRINGIFY_ARG(a) #a
#define STRINGIFY(a) STRINGIFY_ARG(a)
#endif #endif

View File

@ -1,59 +1,35 @@
/*
* libprocps - Library to read proc filesystem
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef PROCPS_PROC_PROCPS_H #ifndef PROCPS_PROC_PROCPS_H
#define PROCPS_PROC_PROCPS_H #define PROCPS_PROC_PROCPS_H
#include <features.h> /* includes that show public exports go here */
#include <proc/diskstat.h>
#define KLONG long #include <proc/escape.h>
#define KLF "l" #include <proc/meminfo.h>
#define STRTOUKL strtoul #include <proc/namespace.h>
#include <proc/pids.h>
// since gcc-2.5 #include <proc/readproc.h>
#define NORETURN __attribute__((__noreturn__)) #include <proc/readstat.h>
#define FUNCTION __attribute__((__const__)) // no access to global mem, even via ptr, and no side effect #include <proc/slab.h>
#include <proc/sysinfo.h>
#if __GNUC__ > 2 || __GNUC_MINOR__ >= 96 #include <proc/version.h>
// won't alias anything, and aligned enough for anything #include <proc/vmstat.h>
#define MALLOC __attribute__ ((__malloc__)) #include <proc/uptime.h>
// no side effect, may read globals
#define PURE __attribute__ ((__pure__))
// tell gcc what to expect: if(unlikely(err)) die(err);
#define likely(x) __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)
#define expected(x,y) __builtin_expect((x),(y))
#else
#define MALLOC
#define PURE
#define likely(x) (x)
#define unlikely(x) (x)
#define expected(x,y) (x)
#endif
#ifdef SHARED
# if SHARED==1 && (__GNUC__ > 2 || __GNUC_MINOR__ >= 96)
# define LABEL_OFFSET
# endif
#endif
#define STRINGIFY_ARG(a) #a
#define STRINGIFY(a) STRINGIFY_ARG(a)
// marks old junk, to warn non-procps-ng library users
#if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3
#define OBSOLETE __attribute__((deprecated))
#else
#define OBSOLETE
#endif
// Like HIDDEN, but for an alias that gets created.
// In gcc-3.2 there is an alias+hidden conflict.
// Many will have patched this bug, but oh well.
#if ( __GNUC__ == 3 && __GNUC_MINOR__ > 2 ) || __GNUC__ > 3
#define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x),visibility("hidden")))
#else
#define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x)))
#endif
typedef void (*message_fn)(const char *__restrict, ...) __attribute__((format(printf,1,2)));
#endif #endif

View File

@ -1,8 +1,8 @@
#ifndef PROCPS_PROC_PWCACHE_H #ifndef PROCPS_PROC_PWCACHE_H
#define PROCPS_PROC_PWCACHE_H #define PROCPS_PROC_PWCACHE_H
#include <features.h>
#include <sys/types.h> #include <sys/types.h>
#include <proc/procps.h>
__BEGIN_DECLS __BEGIN_DECLS

View File

@ -42,6 +42,10 @@
#endif #endif
#include <proc/namespace.h> #include <proc/namespace.h>
#define likely(x) __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)
#define expected(x,y) __builtin_expect((x),(y))
// sometimes it's easier to do this manually, w/o gcc helping // sometimes it's easier to do this manually, w/o gcc helping
#ifdef PROF #ifdef PROF
extern void __cyg_profile_func_enter(void*,void*); extern void __cyg_profile_func_enter(void*,void*);
@ -550,9 +554,9 @@ ENTER(0x160);
"%llu " /* start_time */ "%llu " /* start_time */
"%lu " "%lu "
"%ld " "%ld "
"%lu %"KLF"u %"KLF"u %"KLF"u %"KLF"u %"KLF"u " "%lu %lu %lu %lu %lu %lu "
"%*s %*s %*s %*s " /* discard, no RT signals & Linux 2.1 used hex */ "%*s %*s %*s %*s " /* discard, no RT signals & Linux 2.1 used hex */
"%"KLF"u %*u %*u " "%lu %*u %*u "
"%d %d " "%d %d "
"%lu %lu", "%lu %lu",
&P->state, &P->state,
@ -906,7 +910,7 @@ static proc_t* simple_readproc(PROCTAB *restrict const PT, proc_t *restrict cons
// if multithreaded, some values are crap // if multithreaded, some values are crap
if(p->nlwp > 1){ if(p->nlwp > 1){
p->wchan = (KLONG)~0ull; p->wchan = ~0ul;
} }
/* some number->text resolving which is time consuming */ /* some number->text resolving which is time consuming */
@ -1403,9 +1407,6 @@ void look_up_our_self(proc_t *p) {
free(ub.buf); free(ub.buf);
} }
HIDDEN_ALIAS(readproc);
HIDDEN_ALIAS(readtask);
HIDDEN_ALIAS(readeither);
/* Convenient wrapper around openproc and readproc to slurp in the whole process /* Convenient wrapper around openproc and readproc to slurp in the whole process
* table subset satisfying the constraints of flags and the optional PID list. * table subset satisfying the constraints of flags and the optional PID list.
@ -1439,7 +1440,7 @@ proc_t** readproctab(unsigned flags, ...) {
return 0; return 0;
do { /* read table: */ do { /* read table: */
tab = xrealloc(tab, (n+1)*sizeof(proc_t*));/* realloc as we go, using */ tab = xrealloc(tab, (n+1)*sizeof(proc_t*));/* realloc as we go, using */
tab[n] = readproc_direct(PT, NULL); /* final null to terminate */ tab[n] = readproc(PT, NULL); /* final null to terminate */
} while (tab[n++]); /* stop when NULL reached */ } while (tab[n++]); /* stop when NULL reached */
closeproc(PT); closeproc(PT);
return tab; return tab;
@ -1473,7 +1474,7 @@ proc_data_t *readproctab2(int(*want_proc)(proc_t *buf), int(*want_task)(proc_t *
n_proc_alloc = n_proc_alloc*5/4+30; // grow by over 25% n_proc_alloc = n_proc_alloc*5/4+30; // grow by over 25%
ptab = xrealloc(ptab,sizeof(proc_t*)*n_proc_alloc); ptab = xrealloc(ptab,sizeof(proc_t*)*n_proc_alloc);
} }
tmp = readproc_direct(PT, data+n_used); tmp = readproc(PT, data+n_used);
if(!tmp) break; if(!tmp) break;
if(!want_proc(tmp)) continue; if(!want_proc(tmp)) continue;
ptab[n_proc++] = (proc_t*)(n_used++); ptab[n_proc++] = (proc_t*)(n_used++);
@ -1493,7 +1494,7 @@ proc_data_t *readproctab2(int(*want_proc)(proc_t *buf), int(*want_task)(proc_t *
n_task_alloc = n_task_alloc*5/4+1; // grow by over 25% n_task_alloc = n_task_alloc*5/4+1; // grow by over 25%
ttab = xrealloc(ttab,sizeof(proc_t*)*n_task_alloc); ttab = xrealloc(ttab,sizeof(proc_t*)*n_task_alloc);
} }
t = readtask_direct(PT, tmp, data+n_used); t = readtask(PT, tmp, data+n_used);
if(!t) break; if(!t) break;
if(!want_task(t)) continue; if(!want_task(t)) continue;
ttab[n_task++] = (proc_t*)(n_used++); ttab[n_task++] = (proc_t*)(n_used++);
@ -1533,7 +1534,7 @@ proc_data_t *readproctab3 (int(*want_task)(proc_t *buf), PROCTAB *restrict const
} }
// let this next guy allocate the necessary proc_t storage // let this next guy allocate the necessary proc_t storage
// (or recycle it) since he can't tolerate realloc relocations // (or recycle it) since he can't tolerate realloc relocations
if (!(p = readeither_direct(PT,p))) break; if (!(p = readeither(PT,p))) break;
if (want_task(p)) { if (want_task(p)) {
tab[n_used++] = p; tab[n_used++] = p;
p = NULL; p = NULL;

View File

@ -10,8 +10,7 @@
// in the file COPYING // in the file COPYING
#include <proc/procps.h> // #include <proc/pwcache.h>
#include <proc/pwcache.h>
#include <proc/namespace.h> #include <proc/namespace.h>
#define SIGNAL_STRING #define SIGNAL_STRING
@ -93,7 +92,7 @@ typedef struct proc_t {
sigcatch, // status mask of caught signals sigcatch, // status mask of caught signals
_sigpnd; // status mask of PER TASK pending signals _sigpnd; // status mask of PER TASK pending signals
#endif #endif
unsigned KLONG unsigned long
start_code, // stat address of beginning of code segment start_code, // stat address of beginning of code segment
end_code, // stat address of end of code segment end_code, // stat address of end of code segment
start_stack, // stat address of the bottom of stack for the process start_stack, // stat address of the bottom of stack for the process

View File

@ -22,6 +22,8 @@
#ifndef _PROC_SLAB_H #ifndef _PROC_SLAB_H
#define _PROC_SLAB_H #define _PROC_SLAB_H
#include <features.h>
__BEGIN_DECLS __BEGIN_DECLS
enum slabs_item { enum slabs_item {

View File

@ -173,34 +173,36 @@ unsigned int getslabinfo (struct slab_cache **slab){
return cSlab; return cSlab;
} }
/////////////////////////////////////////////////////////////////////////// #define PROCFS_PID_MAX "/proc/sys/kernel/pid_max"
#define DEFAULT_PID_LENGTH 5
unsigned get_pid_digits(void){ /*
char pidbuf[24]; * procps_pid_length
char *endp; *
long rc; * Return the length of the maximum possible pid.
int fd; *
static unsigned ret; * Returns either the strlen of PROCFS_PID_MAX or the
* best-guess DEFAULT_PID_LENGTH
*/
PROCPS_EXPORT unsigned int procps_pid_length(void)
{
FILE *fp;
char pidbuf[24];
char *endp;
unsigned long int max_pid;
static int pid_length=0;
if(ret) goto out; if (pid_length)
ret = 5; return pid_length;
fd = open("/proc/sys/kernel/pid_max", O_RDONLY);
if(fd==-1) goto out; pid_length = DEFAULT_PID_LENGTH;
rc = read(fd, pidbuf, sizeof pidbuf); if ((fp = fopen(PROCFS_PID_MAX, "r")) != NULL) {
close(fd); if (fgets(buf, 24, fp) != NULL) {
if(rc<3) goto out; pid_length = strlen(buf);
pidbuf[rc] = '\0'; }
rc = strtol(pidbuf,&endp,10); fclose(fp);
if(rc<42) goto out; }
if(*endp && *endp!='\n') goto out; return pid_length;
rc--; // the pid_max value is really the max PID plus 1
ret = 0;
while(rc){
rc /= 10;
ret++;
}
out:
return ret;
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////

View File

@ -2,8 +2,8 @@
#define PROC_SYSINFO_H #define PROC_SYSINFO_H
#include <sys/types.h> #include <sys/types.h>
#include <dirent.h> #include <dirent.h>
#include <proc/procps.h>
#include <features.h>
__BEGIN_DECLS __BEGIN_DECLS
extern int have_privs; /* boolean, true if setuid or similar */ extern int have_privs; /* boolean, true if setuid or similar */
@ -11,6 +11,7 @@ extern int have_privs; /* boolean, true if setuid or similar */
long procps_cpu_count(void); long procps_cpu_count(void);
long procps_hertz_get(void); long procps_hertz_get(void);
int procps_loadavg(double *av1, double *av5, double *av15); int procps_loadavg(double *av1, double *av5, double *av15);
unsigned int procps_pid_length(void);
#define BUFFSIZE (64*1024) #define BUFFSIZE (64*1024)
typedef unsigned long long jiff; typedef unsigned long long jiff;
@ -25,7 +26,6 @@ typedef struct slab_cache{
extern unsigned int getslabinfo (struct slab_cache**); extern unsigned int getslabinfo (struct slab_cache**);
extern unsigned get_pid_digits(void) FUNCTION;
__END_DECLS __END_DECLS
#endif /* SYSINFO_H */ #endif /* SYSINFO_H */

View File

@ -25,8 +25,7 @@
#ifndef PROC_UPTIME_H #ifndef PROC_UPTIME_H
#define PROC_UPTIME_H #define PROC_UPTIME_H
#include <proc/procps.h> #include <features.h>
__BEGIN_DECLS __BEGIN_DECLS
int procps_uptime(double *uptime_secs, double *idle_secs); int procps_uptime(double *uptime_secs, double *idle_secs);

View File

@ -23,8 +23,7 @@
#ifndef PROC_VERSION_H #ifndef PROC_VERSION_H
#define PROC_VERSION_H #define PROC_VERSION_H
#include <proc/procps.h> #include <features.h>
__BEGIN_DECLS __BEGIN_DECLS
int procps_linux_version(void); int procps_linux_version(void);

View File

@ -23,7 +23,7 @@
#ifndef PROC_VMSTAT_H #ifndef PROC_VMSTAT_H
#define PROC_VMSTAT_H #define PROC_VMSTAT_H
#include <proc/procps.h> #include <features.h>
__BEGIN_DECLS __BEGIN_DECLS

View File

@ -1,7 +1,7 @@
#ifndef PROCPS_PROC_WCHAN_H #ifndef PROCPS_PROC_WCHAN_H
#define PROCPS_PROC_WCHAN_H #define PROCPS_PROC_WCHAN_H
#include <proc/procps.h> #include <features.h>
__BEGIN_DECLS __BEGIN_DECLS

View File

@ -13,11 +13,10 @@
#define PROCPS_PS_H #define PROCPS_PS_H
#include "../include/nls.h" #include "../include/nls.h"
#include "../proc/escape.h" #include <proc/procps.h>
// --- <pids> interface begin |||||||||||||||||||||||||||||||||||||||||||| // --- <pids> interface begin ||||||||||||||||||||||||||||||||||||||||||||
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
#include <proc/pids.h>
// hack to minimize code impact // hack to minimize code impact
#undef proc_t #undef proc_t

View File

@ -28,9 +28,6 @@
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#include <sys/types.h> #include <sys/types.h>
#include <proc/pids.h>
#include "../proc/sysinfo.h"
#include "../include/c.h" #include "../include/c.h"
#include "../include/fileutils.h" #include "../include/fileutils.h"
#include "../include/signals.h" #include "../include/signals.h"

View File

@ -31,8 +31,6 @@
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#include <sys/types.h> #include <sys/types.h>
#include <proc/uptime.h>
#include "../include/c.h" #include "../include/c.h"
#include "../include/xalloc.h" #include "../include/xalloc.h"
@ -614,8 +612,8 @@ void self_info(void){
); );
fprintf(stderr, fprintf(stderr,
"sizeof(proc_t)=%d sizeof(long)=%d sizeof(KLONG)=%d\n", "sizeof(proc_t)=%d sizeof(long)=%d sizeof(long)=%d\n",
(int)sizeof(proc_t), (int)sizeof(long), (int)sizeof(KLONG) (int)sizeof(proc_t), (int)sizeof(long), (int)sizeof(long)
); );
fprintf(stderr, "archdefs:%s\n", archdefs); fprintf(stderr, "archdefs:%s\n", archdefs);

View File

@ -86,7 +86,7 @@ static int parse_help_opt (const char *opt) {
} }
void do_help (const char *opt, int rc) NORETURN; void do_help (const char *opt, int rc);
void do_help (const char *opt, int rc) { void do_help (const char *opt, int rc) {
FILE *out = (rc == EXIT_SUCCESS) ? stdout : stderr; FILE *out = (rc == EXIT_SUCCESS) ? stdout : stderr;
int section = parse_help_opt(opt); int section = parse_help_opt(opt);

View File

@ -62,11 +62,8 @@
#include <sys/resource.h> #include <sys/resource.h>
#include <sys/types.h> #include <sys/types.h>
#include <proc/meminfo.h>
#include <proc/readstat.h>
#include "../include/c.h" #include "../include/c.h"
#include "../proc/escape.h"
#include "common.h" #include "common.h"
@ -1896,7 +1893,7 @@ void show_one_proc(const proc_t *restrict const p, const format_node *restrict f
char *restrict const outbuf = saved_outbuf; char *restrict const outbuf = saved_outbuf;
static int did_stuff = 0; /* have we ever printed anything? */ static int did_stuff = 0; /* have we ever printed anything? */
if(unlikely(-1==(long)p)){ /* true only once, at the end */ if(-1==(long)p){ /* true only once, at the end */
if(did_stuff) return; if(did_stuff) return;
/* have _never_ printed anything, but might need a header */ /* have _never_ printed anything, but might need a header */
if(!--lines_to_next_header){ if(!--lines_to_next_header){
@ -1906,14 +1903,14 @@ void show_one_proc(const proc_t *restrict const p, const format_node *restrict f
/* fprintf(stderr, "No processes available.\n"); */ /* legal? */ /* fprintf(stderr, "No processes available.\n"); */ /* legal? */
exit(1); exit(1);
} }
if(likely(p)){ /* not header, maybe we should call ourselves for it */ if(p){ /* not header, maybe we should call ourselves for it */
if(unlikely(!--lines_to_next_header)){ if(!--lines_to_next_header){
lines_to_next_header = header_gap; lines_to_next_header = header_gap;
show_one_proc(NULL,fmt); show_one_proc(NULL,fmt);
} }
} }
did_stuff = 1; did_stuff = 1;
if(unlikely(active_cols>(int)OUTBUF_SIZE)) fprintf(stderr,_("fix bigness error\n")); if(active_cols>(int)OUTBUF_SIZE) fprintf(stderr,_("fix bigness error\n"));
/* print row start sequence */ /* print row start sequence */
for(;;){ for(;;){
@ -1922,7 +1919,7 @@ void show_one_proc(const proc_t *restrict const p, const format_node *restrict f
// if(likely(fmt->next)) max_rightward = fmt->width; // if(likely(fmt->next)) max_rightward = fmt->width;
// else max_rightward = active_cols-((correct>actual) ? correct : actual); // else max_rightward = active_cols-((correct>actual) ? correct : actual);
if(likely(fmt->next)){ if(fmt->next){
max_rightward = fmt->width; max_rightward = fmt->width;
tmpspace = 0; tmpspace = 0;
}else{ }else{
@ -1940,7 +1937,7 @@ void show_one_proc(const proc_t *restrict const p, const format_node *restrict f
// active_cols, max_rightward, max_leftward, actual, correct); // active_cols, max_rightward, max_leftward, actual, correct);
/* prepare data and calculate leftpad */ /* prepare data and calculate leftpad */
if(likely(p) && likely(fmt->pr)) amount = (*fmt->pr)(outbuf,p); if(p && fmt->pr) amount = (*fmt->pr)(outbuf,p);
else amount = strlen(strcpy(outbuf, fmt->name)); /* AIX or headers */ else amount = strlen(strcpy(outbuf, fmt->name)); /* AIX or headers */
switch((fmt->flags) & CF_JUST_MASK){ switch((fmt->flags) & CF_JUST_MASK){
@ -2003,13 +2000,13 @@ void show_one_proc(const proc_t *restrict const p, const format_node *restrict f
*/ */
space = correct - actual + leftpad; space = correct - actual + leftpad;
if(space<1) space=dospace; if(space<1) space=dospace;
if(unlikely(space>SPACE_AMOUNT)) space=SPACE_AMOUNT; // only so much available if(space>SPACE_AMOUNT) space=SPACE_AMOUNT; // only so much available
/* real size -- don't forget in 'amount' is number of cells */ /* real size -- don't forget in 'amount' is number of cells */
sz = strlen(outbuf); sz = strlen(outbuf);
/* print data, set x position stuff */ /* print data, set x position stuff */
if(unlikely(!fmt->next)){ if(!fmt->next){
/* Last column. Write padding + data + newline all together. */ /* Last column. Write padding + data + newline all together. */
outbuf[sz] = '\n'; outbuf[sz] = '\n';
fwrite(outbuf-space, space+sz+1, 1, stdout); fwrite(outbuf-space, space+sz+1, 1, stdout);

View File

@ -47,7 +47,7 @@ static format_node *do_one_spec(const char *spec, const char *override){
format_node *thisnode; format_node *thisnode;
thisnode = xmalloc(sizeof(format_node)); thisnode = xmalloc(sizeof(format_node));
if(fs->flags & CF_PIDMAX){ if(fs->flags & CF_PIDMAX){
w1 = (int)get_pid_digits(); w1 = (int)procps_pid_length();
w2 = strlen(fs->head); w2 = strlen(fs->head);
if(w2>w1) w1=w2; // FIXME w/ separate header/body column sizing if(w2>w1) w1=w2; // FIXME w/ separate header/body column sizing
}else{ }else{

View File

@ -34,8 +34,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <proc/namespace.h> #include <proc/procps.h>
#include <proc/pids.h>
#include "c.h" #include "c.h"
#include "fileutils.h" #include "fileutils.h"

View File

@ -42,7 +42,7 @@
#include "fileutils.h" #include "fileutils.h"
#include "nls.h" #include "nls.h"
#include "strutils.h" #include "strutils.h"
#include <proc/slab.h> #include <proc/procps.h>
#define DEFAULT_SORT PROCPS_SLABNODE_OBJS #define DEFAULT_SORT PROCPS_SLABNODE_OBJS
#define CHAINS_ALLOC 150 #define CHAINS_ALLOC 150

View File

@ -24,7 +24,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <proc/sysinfo.h> #include <proc/procps.h>
#include "c.h" #include "c.h"
#include "fileutils.h" #include "fileutils.h"
#include "nls.h" #include "nls.h"

View File

@ -50,16 +50,12 @@
#include "../include/signals.h" #include "../include/signals.h"
#include "../include/nls.h" #include "../include/nls.h"
#include <proc/meminfo.h> #include <proc/procps.h>
#include <proc/pids.h>
#include <proc/readstat.h>
#include <proc/sysinfo.h>
#include <proc/version.h>
#include <proc/uptime.h>
#include "top.h" #include "top.h"
#include "top_nls.h" #include "top_nls.h"
#define NORETURN __attribute__((__noreturn__))
/*###### Miscellaneous global stuff ####################################*/ /*###### Miscellaneous global stuff ####################################*/
@ -744,6 +740,7 @@ static void updt_scroll_msg (void) {
/* /*
* Handle our own memory stuff without the risk of leaving the * Handle our own memory stuff without the risk of leaving the
* user's terminal in an ugly state should things go sour. */ * user's terminal in an ugly state should things go sour. */
#define MALLOC __attribute__ ((__malloc__))
static void *alloc_c (size_t num) MALLOC; static void *alloc_c (size_t num) MALLOC;
static void *alloc_c (size_t num) { static void *alloc_c (size_t num) {
@ -1174,14 +1171,14 @@ static int get_int (const char *prompt) {
/* /*
* Make a hex value, and maybe suppress zeroes. */ * Make a hex value, and maybe suppress zeroes. */
static inline const char *hex_make (KLONG num, int noz) { static inline const char *hex_make (long num, int noz) {
static char buf[SMLBUFSIZ]; static char buf[SMLBUFSIZ];
int i; int i;
#ifdef CASEUP_HEXES #ifdef CASEUP_HEXES
snprintf(buf, sizeof(buf), "%08" KLF "X", num); snprintf(buf, sizeof(buf), "%08lX", num);
#else #else
snprintf(buf, sizeof(buf), "%08" KLF "x", num); snprintf(buf, sizeof(buf), "%08lx", num);
#endif #endif
if (noz) if (noz)
for (i = 0; buf[i]; i++) for (i = 0; buf[i]; i++)
@ -2097,7 +2094,7 @@ static void zap_fieldstab (void) {
Fieldstab[EU_PID].width = Fieldstab[EU_PPD].width Fieldstab[EU_PID].width = Fieldstab[EU_PPD].width
= Fieldstab[EU_PGD].width = Fieldstab[EU_SID].width = Fieldstab[EU_PGD].width = Fieldstab[EU_SID].width
= Fieldstab[EU_TGD].width = Fieldstab[EU_TPG].width = 5; = Fieldstab[EU_TGD].width = Fieldstab[EU_TPG].width = 5;
if (5 < (digits = get_pid_digits())) { if (5 < (digits = procps_pid_length())) {
if (10 < digits) error_exit(N_txt(FAIL_widepid_txt)); if (10 < digits) error_exit(N_txt(FAIL_widepid_txt));
Fieldstab[EU_PID].width = Fieldstab[EU_PPD].width Fieldstab[EU_PID].width = Fieldstab[EU_PPD].width
= Fieldstab[EU_PGD].width = Fieldstab[EU_SID].width = Fieldstab[EU_PGD].width = Fieldstab[EU_SID].width

View File

@ -27,9 +27,7 @@
#include "c.h" #include "c.h"
#include "fileutils.h" #include "fileutils.h"
#include "nls.h" #include "nls.h"
#include "proc/sysinfo.h" #include <proc/procps.h>
#include <proc/uptime.h>
#include "proc/version.h"
static void print_uptime_since() static void print_uptime_since()
{ {

View File

@ -48,12 +48,7 @@
#include "fileutils.h" #include "fileutils.h"
#include "nls.h" #include "nls.h"
#include "strutils.h" #include "strutils.h"
#include "proc/sysinfo.h" #include <proc/procps.h>
#include <proc/vmstat.h>
#include <proc/readstat.h>
#include <proc/meminfo.h>
#include <proc/diskstat.h>
#include <proc/slab.h>
#define UNIT_B 1 #define UNIT_B 1
#define UNIT_k 1000 #define UNIT_k 1000

8
w.c
View File

@ -26,9 +26,7 @@
#include "c.h" #include "c.h"
#include "fileutils.h" #include "fileutils.h"
#include "nls.h" #include "nls.h"
#include <proc/sysinfo.h> #include <proc/procps.h>
#include <proc/uptime.h>
#include <proc/pids.h>
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
@ -652,7 +650,7 @@ int main(int argc, char **argv)
if (user) { if (user) {
for (;;) { for (;;) {
u = getutent(); u = getutent();
if (unlikely(!u)) if (!u)
break; break;
if (u->ut_type != USER_PROCESS) if (u->ut_type != USER_PROCESS)
continue; continue;
@ -663,7 +661,7 @@ int main(int argc, char **argv)
} else { } else {
for (;;) { for (;;) {
u = getutent(); u = getutent();
if (unlikely(!u)) if (!u)
break; break;
if (u->ut_type != USER_PROCESS) if (u->ut_type != USER_PROCESS)
continue; continue;