#include <stdlib.h>
#include <unistd.h>
-#include <proc/sysinfo.h>
-#include <proc/version.h>
-#include <proc/meminfo.h>
+#include <proc/procps.h>
#ifndef SIZE_MAX
#define SIZE_MAX 32
#include "nls.h"
#include "signals.h"
#include "xalloc.h"
-#include <proc/pids.h>
-#include <proc/namespace.h>
-#include <proc/devname.h>
+#include <proc/procps.h>
enum pids_item Items[] = {
PROCPS_PIDS_ID_PID,
#include "fileutils.h"
#include "nls.h"
#include "xalloc.h"
-//#include "proc/readproc.h"
-#include <proc/pids.h>
-#include "proc/version.h" /* procps_version */
+#include <proc/procps.h>
#define grow_size(x) (x = x * 5 / 4 + 1024)
#include "fileutils.h"
#include "nls.h"
#include "xalloc.h"
-#include "proc/version.h"
-#include <proc/pids.h>
+#include <proc/procps.h>
enum pids_item Pid_items[] = {
PROCPS_PIDS_ID_PID, PROCPS_PIDS_ID_TGID,
unsigned long start, end;
unsigned long long file_offset, inode;
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,
&inode);
tmp = strchr(mapbuf_b, '\n');
mapbuf);
}
strcpy(listnode->value_str, value_str);
- sscanf(value_str, "%"KLF"u", &listnode->value);
+ sscanf(value_str, "%lu", &listnode->value);
if (firstmapping == 2) {
listnode->total += listnode->value;
if (q_option) {
}
if (strncmp("Swap", smap_key, 4) == 0) {
/*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,
maxw2, (unsigned long)(diff >> 10),
maxw3, rss,
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,
&inode);
const char *cp =
mapping_name(p, start, diff, mapbuf, map_desc_showpath, dev_major,
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,
maxw2, (unsigned long)(diff >> 10),
maxw3, perms,
mapping_name(p, start, diff, mapbuf, map_desc_showpath, dev_major,
dev_minor, inode);
printf((sizeof(long) == 8)
- ? "%016" KLF "x %6luK %s %s\n"
+ ? "%016lx %6luK %s %s\n"
: "%08lx %6luK %s %s\n",
start, (unsigned long)(diff >> 10), perms, cp);
}
else
arg2 = arg1;
if (arg1 && *arg1)
- range_low = STRTOUKL(arg1, &arg1, 16);
+ range_low = strtoul(arg1, &arg1, 16);
if (*arg2)
- range_high = STRTOUKL(arg2, &arg2, 16);
+ range_high = strtoul(arg2, &arg2, 16);
if (arg1 && (*arg1 || *arg2))
xerrx(EXIT_FAILURE, "%s: '%s'", _("failed to parse argument"),
optarg);
#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, ...) {
va_list va;
#ifndef PROCPS_PROC_ALLOC_H
#define PROCPS_PROC_ALLOC_H
-#include <proc/procps.h>
+#include <features.h>
__BEGIN_DECLS
- /* change xalloc_err_handler to override the default fprintf(stderr... */
-extern message_fn xalloc_err_handler;
+#define MALLOC __attribute__ ((__malloc__))
extern void *xcalloc(unsigned int size) MALLOC;
extern void *xmalloc(size_t size) MALLOC;
#ifndef PROC_DEVNAME_H
#define PROC_DEVNAME_H
-#include <proc/procps.h>
+#include <features.h>
__BEGIN_DECLS
#ifndef PROC_DISKSTAT_H
#define PROC_DISKSTAT_H
-#include <proc/procps.h>
+#include <features.h>
__BEGIN_DECLS
#ifndef PROCPS_PROC_ESCAPE_H
#define PROCPS_PROC_ESCAPE_H
-#include <proc/procps.h>
#include <proc/readproc.h>
+#include <features.h>
__BEGIN_DECLS
escape_strlist;
escaped_copy;
fatal_proc_unmounted;
- get_pid_digits;
look_up_our_self;
lookup_wchan;
openproc;
procps_ns_get_name;
procps_ns_get_id;
procps_ns_read_pid;
+ procps_pid_length;
procps_pids_new;
procps_pids_read_next;
procps_pids_read_open;
#ifndef PROC_MEMINFO_H
#define PROC_MEMINFO_H
-#include <proc/procps.h>
+#include <features.h>
__BEGIN_DECLS
#ifndef PROC_NAMESPACE_H
#define PROC_NAMESPACE_H
-#include <proc/procps.h>
-
__BEGIN_DECLS
enum namespace_type {
#ifndef _PROC_PIDS_H
#define _PROC_PIDS_H
+#include <features.h>
__BEGIN_DECLS
enum pids_item {
#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 STRINGIFY_ARG(a) #a
+#define STRINGIFY(a) STRINGIFY_ARG(a)
+
+
#endif
+/*
+ * 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
#define PROCPS_PROC_PROCPS_H
-#include <features.h>
-
-#define KLONG long
-#define KLF "l"
-#define STRTOUKL strtoul
-
-// since gcc-2.5
-#define NORETURN __attribute__((__noreturn__))
-#define FUNCTION __attribute__((__const__)) // no access to global mem, even via ptr, and no side effect
-
-#if __GNUC__ > 2 || __GNUC_MINOR__ >= 96
-// won't alias anything, and aligned enough for anything
-#define MALLOC __attribute__ ((__malloc__))
-// 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)));
+/* includes that show public exports go here */
+#include <proc/diskstat.h>
+#include <proc/escape.h>
+#include <proc/meminfo.h>
+#include <proc/namespace.h>
+#include <proc/pids.h>
+#include <proc/readproc.h>
+#include <proc/readstat.h>
+#include <proc/slab.h>
+#include <proc/sysinfo.h>
+#include <proc/version.h>
+#include <proc/vmstat.h>
+#include <proc/uptime.h>
#endif
#ifndef PROCPS_PROC_PWCACHE_H
#define PROCPS_PROC_PWCACHE_H
+#include <features.h>
#include <sys/types.h>
-#include <proc/procps.h>
__BEGIN_DECLS
#endif
#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
#ifdef PROF
extern void __cyg_profile_func_enter(void*,void*);
"%llu " /* start_time */
"%lu "
"%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 */
- "%"KLF"u %*u %*u "
+ "%lu %*u %*u "
"%d %d "
"%lu %lu",
&P->state,
// if multithreaded, some values are crap
if(p->nlwp > 1){
- p->wchan = (KLONG)~0ull;
+ p->wchan = ~0ul;
}
/* some number->text resolving which is time consuming */
free(ub.buf);
}
-HIDDEN_ALIAS(readproc);
-HIDDEN_ALIAS(readtask);
-HIDDEN_ALIAS(readeither);
/* Convenient wrapper around openproc and readproc to slurp in the whole process
* table subset satisfying the constraints of flags and the optional PID list.
return 0;
do { /* read table: */
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 */
closeproc(PT);
return tab;
n_proc_alloc = n_proc_alloc*5/4+30; // grow by over 25%
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(!want_proc(tmp)) continue;
ptab[n_proc++] = (proc_t*)(n_used++);
n_task_alloc = n_task_alloc*5/4+1; // grow by over 25%
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(!want_task(t)) continue;
ttab[n_task++] = (proc_t*)(n_used++);
}
// let this next guy allocate the necessary proc_t storage
// (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)) {
tab[n_used++] = p;
p = NULL;
// in the file COPYING
-#include <proc/procps.h>
-#include <proc/pwcache.h>
+// #include <proc/pwcache.h>
#include <proc/namespace.h>
#define SIGNAL_STRING
sigcatch, // status mask of caught signals
_sigpnd; // status mask of PER TASK pending signals
#endif
- unsigned KLONG
+ unsigned long
start_code, // stat address of beginning of code segment
end_code, // stat address of end of code segment
start_stack, // stat address of the bottom of stack for the process
#ifndef _PROC_SLAB_H
#define _PROC_SLAB_H
+#include <features.h>
+
__BEGIN_DECLS
enum slabs_item {
return cSlab;
}
-///////////////////////////////////////////////////////////////////////////
+#define PROCFS_PID_MAX "/proc/sys/kernel/pid_max"
+#define DEFAULT_PID_LENGTH 5
-unsigned get_pid_digits(void){
- char pidbuf[24];
- char *endp;
- long rc;
- int fd;
- static unsigned ret;
-
- if(ret) goto out;
- ret = 5;
- fd = open("/proc/sys/kernel/pid_max", O_RDONLY);
- if(fd==-1) goto out;
- rc = read(fd, pidbuf, sizeof pidbuf);
- close(fd);
- if(rc<3) goto out;
- pidbuf[rc] = '\0';
- rc = strtol(pidbuf,&endp,10);
- if(rc<42) goto out;
- if(*endp && *endp!='\n') goto out;
- rc--; // the pid_max value is really the max PID plus 1
- ret = 0;
- while(rc){
- rc /= 10;
- ret++;
- }
-out:
- return ret;
+/*
+ * procps_pid_length
+ *
+ * Return the length of the maximum possible pid.
+ *
+ * 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 (pid_length)
+ return pid_length;
+
+ pid_length = DEFAULT_PID_LENGTH;
+ if ((fp = fopen(PROCFS_PID_MAX, "r")) != NULL) {
+ if (fgets(buf, 24, fp) != NULL) {
+ pid_length = strlen(buf);
+ }
+ fclose(fp);
+ }
+ return pid_length;
}
///////////////////////////////////////////////////////////////////////////
#define PROC_SYSINFO_H
#include <sys/types.h>
#include <dirent.h>
-#include <proc/procps.h>
+#include <features.h>
__BEGIN_DECLS
extern int have_privs; /* boolean, true if setuid or similar */
long procps_cpu_count(void);
long procps_hertz_get(void);
int procps_loadavg(double *av1, double *av5, double *av15);
+unsigned int procps_pid_length(void);
#define BUFFSIZE (64*1024)
typedef unsigned long long jiff;
extern unsigned int getslabinfo (struct slab_cache**);
-extern unsigned get_pid_digits(void) FUNCTION;
__END_DECLS
#endif /* SYSINFO_H */
#ifndef PROC_UPTIME_H
#define PROC_UPTIME_H
-#include <proc/procps.h>
-
+#include <features.h>
__BEGIN_DECLS
int procps_uptime(double *uptime_secs, double *idle_secs);
#ifndef PROC_VERSION_H
#define PROC_VERSION_H
-#include <proc/procps.h>
-
+#include <features.h>
__BEGIN_DECLS
int procps_linux_version(void);
#ifndef PROC_VMSTAT_H
#define PROC_VMSTAT_H
-#include <proc/procps.h>
+#include <features.h>
__BEGIN_DECLS
#ifndef PROCPS_PROC_WCHAN_H
#define PROCPS_PROC_WCHAN_H
-#include <proc/procps.h>
+#include <features.h>
__BEGIN_DECLS
#define PROCPS_PS_H
#include "../include/nls.h"
-#include "../proc/escape.h"
+#include <proc/procps.h>
// --- <pids> interface begin ||||||||||||||||||||||||||||||||||||||||||||
// -----------------------------------------------------------------------
-#include <proc/pids.h>
// hack to minimize code impact
#undef proc_t
#include <sys/sysmacros.h>
#include <sys/types.h>
-#include <proc/pids.h>
-#include "../proc/sysinfo.h"
-
#include "../include/c.h"
#include "../include/fileutils.h"
#include "../include/signals.h"
#include <sys/sysmacros.h>
#include <sys/types.h>
-#include <proc/uptime.h>
-
#include "../include/c.h"
#include "../include/xalloc.h"
);
fprintf(stderr,
- "sizeof(proc_t)=%d sizeof(long)=%d sizeof(KLONG)=%d\n",
- (int)sizeof(proc_t), (int)sizeof(long), (int)sizeof(KLONG)
+ "sizeof(proc_t)=%d sizeof(long)=%d sizeof(long)=%d\n",
+ (int)sizeof(proc_t), (int)sizeof(long), (int)sizeof(long)
);
fprintf(stderr, "archdefs:%s\n", archdefs);
}
-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) {
FILE *out = (rc == EXIT_SUCCESS) ? stdout : stderr;
int section = parse_help_opt(opt);
#include <sys/resource.h>
#include <sys/types.h>
-#include <proc/meminfo.h>
-#include <proc/readstat.h>
#include "../include/c.h"
-#include "../proc/escape.h"
#include "common.h"
char *restrict const outbuf = saved_outbuf;
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;
/* have _never_ printed anything, but might need a header */
if(!--lines_to_next_header){
/* fprintf(stderr, "No processes available.\n"); */ /* legal? */
exit(1);
}
- if(likely(p)){ /* not header, maybe we should call ourselves for it */
- if(unlikely(!--lines_to_next_header)){
+ if(p){ /* not header, maybe we should call ourselves for it */
+ if(!--lines_to_next_header){
lines_to_next_header = header_gap;
show_one_proc(NULL,fmt);
}
}
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 */
for(;;){
// if(likely(fmt->next)) max_rightward = fmt->width;
// else max_rightward = active_cols-((correct>actual) ? correct : actual);
- if(likely(fmt->next)){
+ if(fmt->next){
max_rightward = fmt->width;
tmpspace = 0;
}else{
// active_cols, max_rightward, max_leftward, actual, correct);
/* 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 */
switch((fmt->flags) & CF_JUST_MASK){
*/
space = correct - actual + leftpad;
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 */
sz = strlen(outbuf);
/* print data, set x position stuff */
- if(unlikely(!fmt->next)){
+ if(!fmt->next){
/* Last column. Write padding + data + newline all together. */
outbuf[sz] = '\n';
fwrite(outbuf-space, space+sz+1, 1, stdout);
format_node *thisnode;
thisnode = xmalloc(sizeof(format_node));
if(fs->flags & CF_PIDMAX){
- w1 = (int)get_pid_digits();
+ w1 = (int)procps_pid_length();
w2 = strlen(fs->head);
if(w2>w1) w1=w2; // FIXME w/ separate header/body column sizing
}else{
#include <sys/types.h>
#include <unistd.h>
-#include <proc/namespace.h>
-#include <proc/pids.h>
+#include <proc/procps.h>
#include "c.h"
#include "fileutils.h"
#include "fileutils.h"
#include "nls.h"
#include "strutils.h"
-#include <proc/slab.h>
+#include <proc/procps.h>
#define DEFAULT_SORT PROCPS_SLABNODE_OBJS
#define CHAINS_ALLOC 150
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <proc/sysinfo.h>
+#include <proc/procps.h>
#include "c.h"
#include "fileutils.h"
#include "nls.h"
#include "../include/signals.h"
#include "../include/nls.h"
-#include <proc/meminfo.h>
-#include <proc/pids.h>
-#include <proc/readstat.h>
-#include <proc/sysinfo.h>
-#include <proc/version.h>
-#include <proc/uptime.h>
+#include <proc/procps.h>
#include "top.h"
#include "top_nls.h"
+#define NORETURN __attribute__((__noreturn__))
/*###### Miscellaneous global stuff ####################################*/
/*
* Handle our own memory stuff without the risk of leaving the
* 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) {
/*
* 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];
int i;
#ifdef CASEUP_HEXES
- snprintf(buf, sizeof(buf), "%08" KLF "X", num);
+ snprintf(buf, sizeof(buf), "%08lX", num);
#else
- snprintf(buf, sizeof(buf), "%08" KLF "x", num);
+ snprintf(buf, sizeof(buf), "%08lx", num);
#endif
if (noz)
for (i = 0; buf[i]; i++)
Fieldstab[EU_PID].width = Fieldstab[EU_PPD].width
= Fieldstab[EU_PGD].width = Fieldstab[EU_SID].width
= 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));
Fieldstab[EU_PID].width = Fieldstab[EU_PPD].width
= Fieldstab[EU_PGD].width = Fieldstab[EU_SID].width
#include "c.h"
#include "fileutils.h"
#include "nls.h"
-#include "proc/sysinfo.h"
-#include <proc/uptime.h>
-#include "proc/version.h"
+#include <proc/procps.h>
static void print_uptime_since()
{
#include "fileutils.h"
#include "nls.h"
#include "strutils.h"
-#include "proc/sysinfo.h"
-#include <proc/vmstat.h>
-#include <proc/readstat.h>
-#include <proc/meminfo.h>
-#include <proc/diskstat.h>
-#include <proc/slab.h>
+#include <proc/procps.h>
#define UNIT_B 1
#define UNIT_k 1000
#include "c.h"
#include "fileutils.h"
#include "nls.h"
-#include <proc/sysinfo.h>
-#include <proc/uptime.h>
-#include <proc/pids.h>
+#include <proc/procps.h>
#include <ctype.h>
#include <errno.h>
if (user) {
for (;;) {
u = getutent();
- if (unlikely(!u))
+ if (!u)
break;
if (u->ut_type != USER_PROCESS)
continue;
} else {
for (;;) {
u = getutent();
- if (unlikely(!u))
+ if (!u)
break;
if (u->ut_type != USER_PROCESS)
continue;