projects
/
oweals
/
busybox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
man: use default MANPATH of "/usr/man"; do not search paths twice
[oweals/busybox.git]
/
libbb
/
procps.c
diff --git
a/libbb/procps.c
b/libbb/procps.c
index 3a31eeff3a3145add5bbfaada2b2b37fd69ccf09..fd19621db00be01eedf72d2402ad2875abadbc7d 100644
(file)
--- a/
libbb/procps.c
+++ b/
libbb/procps.c
@@
-30,7
+30,7
@@
static void clear_cache(cache_t *cp)
cp->cache = NULL;
cp->size = 0;
}
cp->cache = NULL;
cp->size = 0;
}
-void clear_username_cache(void)
+void
FAST_FUNC
clear_username_cache(void)
{
clear_cache(&username);
clear_cache(&groupname);
{
clear_cache(&username);
clear_cache(&groupname);
@@
-46,13
+46,13
@@
static int get_cached(cache_t *cp, unsigned id)
if (cp->cache[i].id == id)
return i;
i = cp->size++;
if (cp->cache[i].id == id)
return i;
i = cp->size++;
- cp->cache = xrealloc
(cp->cache, cp->size * sizeof(*cp->cache)
);
+ cp->cache = xrealloc
_vector(cp->cache, 2, i
);
cp->cache[i++].id = id;
return -i;
}
#endif
cp->cache[i++].id = id;
return -i;
}
#endif
-typedef char* ug_func(char *name, int bufsize, long uid);
+typedef char*
FAST_FUNC
ug_func(char *name, int bufsize, long uid);
static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
{
int i;
static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
{
int i;
@@
-60,17
+60,17
@@
static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
if (cp->cache[i].id == id)
return cp->cache[i].name;
i = cp->size++;
if (cp->cache[i].id == id)
return cp->cache[i].name;
i = cp->size++;
- cp->cache = xrealloc
(cp->cache, cp->size * sizeof(*cp->cache)
);
+ cp->cache = xrealloc
_vector(cp->cache, 2, i
);
cp->cache[i].id = id;
/* Never fails. Generates numeric string if name isn't found */
fp(cp->cache[i].name, sizeof(cp->cache[i].name), id);
return cp->cache[i].name;
}
cp->cache[i].id = id;
/* Never fails. Generates numeric string if name isn't found */
fp(cp->cache[i].name, sizeof(cp->cache[i].name), id);
return cp->cache[i].name;
}
-const char* get_cached_username(uid_t uid)
+const char*
FAST_FUNC
get_cached_username(uid_t uid)
{
return get_cached(&username, uid, bb_getpwuid);
}
{
return get_cached(&username, uid, bb_getpwuid);
}
-const char* get_cached_groupname(gid_t gid)
+const char*
FAST_FUNC
get_cached_groupname(gid_t gid)
{
return get_cached(&groupname, gid, bb_getgrgid);
}
{
return get_cached(&groupname, gid, bb_getgrgid);
}
@@
-93,7
+93,7
@@
static int read_to_buf(const char *filename, void *buf)
return ret;
}
return ret;
}
-
procps_status_t *alloc_procps_scan(int flags
)
+
static procps_status_t* FAST_FUNC alloc_procps_scan(void
)
{
unsigned n = getpagesize();
procps_status_t* sp = xzalloc(sizeof(procps_status_t));
{
unsigned n = getpagesize();
procps_status_t* sp = xzalloc(sizeof(procps_status_t));
@@
-107,7
+107,7
@@
procps_status_t *alloc_procps_scan(int flags)
return sp;
}
return sp;
}
-void free_procps_scan(procps_status_t* sp)
+void
FAST_FUNC
free_procps_scan(procps_status_t* sp)
{
closedir(sp->dir);
free(sp->argv0);
{
closedir(sp->dir);
free(sp->argv0);
@@
-163,7
+163,7
@@
static char *skip_fields(char *str, int count)
#endif
void BUG_comm_size(void);
#endif
void BUG_comm_size(void);
-procps_status_t
*
procps_scan(procps_status_t* sp, int flags)
+procps_status_t
* FAST_FUNC
procps_scan(procps_status_t* sp, int flags)
{
struct dirent *entry;
char buf[PROCPS_BUFSIZE];
{
struct dirent *entry;
char buf[PROCPS_BUFSIZE];
@@
-175,7
+175,7
@@
procps_status_t *procps_scan(procps_status_t* sp, int flags)
struct stat sb;
if (!sp)
struct stat sb;
if (!sp)
- sp = alloc_procps_scan(
flags
);
+ sp = alloc_procps_scan();
for (;;) {
entry = readdir(sp->dir);
for (;;) {
entry = readdir(sp->dir);
@@
-243,7
+243,8
@@
procps_status_t *procps_scan(procps_status_t* sp, int flags)
"%lu %lu " /* utime, stime */
"%*s %*s %*s " /* cutime, cstime, priority */
"%ld " /* nice */
"%lu %lu " /* utime, stime */
"%*s %*s %*s " /* cutime, cstime, priority */
"%ld " /* nice */
- "%*s %*s %*s " /* timeout, it_real_value, start_time */
+ "%*s %*s " /* timeout, it_real_value */
+ "%lu " /* start_time */
"%lu " /* vsize */
"%lu " /* rss */
/* "%lu %lu %lu %lu %lu %lu " rss_rlim, start_code, end_code, start_stack, kstk_esp, kstk_eip */
"%lu " /* vsize */
"%lu " /* rss */
/* "%lu %lu %lu %lu %lu %lu " rss_rlim, start_code, end_code, start_stack, kstk_esp, kstk_eip */
@@
-254,9
+255,10
@@
procps_status_t *procps_scan(procps_status_t* sp, int flags)
&sp->pgid, &sp->sid, &tty,
&sp->utime, &sp->stime,
&tasknice,
&sp->pgid, &sp->sid, &tty,
&sp->utime, &sp->stime,
&tasknice,
+ &sp->start_time,
&vsz,
&rss);
&vsz,
&rss);
- if (n != 1
0
)
+ if (n != 1
1
)
break;
/* vsz is in bytes and we want kb */
sp->vsz = vsz >> 10;
break;
/* vsz is in bytes and we want kb */
sp->vsz = vsz >> 10;
@@
-280,7
+282,8
@@
procps_status_t *procps_scan(procps_status_t* sp, int flags)
sp->stime = fast_strtoul_10(&cp);
cp = skip_fields(cp, 3); /* cutime, cstime, priority */
tasknice = fast_strtoul_10(&cp);
sp->stime = fast_strtoul_10(&cp);
cp = skip_fields(cp, 3); /* cutime, cstime, priority */
tasknice = fast_strtoul_10(&cp);
- cp = skip_fields(cp, 3); /* timeout, it_real_value, start_time */
+ cp = skip_fields(cp, 2); /* timeout, it_real_value */
+ sp->start_time = fast_strtoul_10(&cp);
/* vsz is in bytes and we want kb */
sp->vsz = fast_strtoul_10(&cp) >> 10;
/* vsz is in bytes but rss is in *PAGES*! Can you believe that? */
/* vsz is in bytes and we want kb */
sp->vsz = fast_strtoul_10(&cp) >> 10;
/* vsz is in bytes but rss is in *PAGES*! Can you believe that? */
@@
-305,7
+308,7
@@
procps_status_t *procps_scan(procps_status_t* sp, int flags)
FILE *file;
strcpy(filename_tail, "/smaps");
FILE *file;
strcpy(filename_tail, "/smaps");
- file = fopen
(filename, "r"
);
+ file = fopen
_for_read(filename
);
if (!file)
break;
while (fgets(buf, sizeof(buf), file)) {
if (!file)
break;
while (fgets(buf, sizeof(buf), file)) {
@@
-353,14
+356,10
@@
procps_status_t *procps_scan(procps_status_t* sp, int flags)
#if 0 /* PSSCAN_CMD is not used */
if (flags & (PSSCAN_CMD|PSSCAN_ARGV0)) {
#if 0 /* PSSCAN_CMD is not used */
if (flags & (PSSCAN_CMD|PSSCAN_ARGV0)) {
- if (sp->argv0) {
- free(sp->argv0);
- sp->argv0 = NULL;
- }
- if (sp->cmd) {
- free(sp->cmd);
- sp->cmd = NULL;
- }
+ free(sp->argv0);
+ sp->argv0 = NULL;
+ free(sp->cmd);
+ sp->cmd = NULL;
strcpy(filename_tail, "/cmdline");
/* TODO: to get rid of size limits, read into malloc buf,
* then realloc it down to real size. */
strcpy(filename_tail, "/cmdline");
/* TODO: to get rid of size limits, read into malloc buf,
* then realloc it down to real size. */
@@
-379,17
+378,22
@@
procps_status_t *procps_scan(procps_status_t* sp, int flags)
}
}
#else
}
}
#else
- if (flags & PSSCAN_ARGV0) {
- if (sp->argv0) {
- free(sp->argv0);
- sp->argv0 = NULL;
- }
+ if (flags & (PSSCAN_ARGV0|PSSCAN_ARGVN)) {
+ free(sp->argv0);
+ sp->argv0 = NULL;
strcpy(filename_tail, "/cmdline");
n = read_to_buf(filename, buf);
if (n <= 0)
break;
strcpy(filename_tail, "/cmdline");
n = read_to_buf(filename, buf);
if (n <= 0)
break;
- if (flags & PSSCAN_ARGV0)
+ if (flags & PSSCAN_ARGVN) {
+ sp->argv_len = n;
+ sp->argv0 = xmalloc(n + 1);
+ memcpy(sp->argv0, buf, n + 1);
+ /* sp->argv0[n] = '\0'; - buf has it */
+ } else {
+ sp->argv_len = 0;
sp->argv0 = xstrdup(buf);
sp->argv0 = xstrdup(buf);
+ }
}
#endif
break;
}
#endif
break;
@@
-397,7
+401,7
@@
procps_status_t *procps_scan(procps_status_t* sp, int flags)
return sp;
}
return sp;
}
-void read_cmdline(char *buf, int col, unsigned pid, const char *comm)
+void
FAST_FUNC
read_cmdline(char *buf, int col, unsigned pid, const char *comm)
{
ssize_t sz;
char filename[sizeof("/proc//cmdline") + sizeof(int)*3];
{
ssize_t sz;
char filename[sizeof("/proc//cmdline") + sizeof(int)*3];