From 87aef2480ed3c6ca587815ea36e7dd380301c97c Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sun, 14 Jul 2013 22:12:22 -0500 Subject: New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it. --- lib/lib.c | 109 ---------------------------------------------------------- lib/pending.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 109 deletions(-) create mode 100644 lib/pending.c diff --git a/lib/lib.c b/lib/lib.c index f4fcaef4..af347ca5 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -1034,37 +1034,6 @@ int yesno(char *prompt, int def) return def; } -// Execute a callback for each PID that matches a process name from a list. -void for_each_pid_with_name_in(char **names, int (*callback)(pid_t pid, char *name)) -{ - DIR *dp; - struct dirent *entry; - char cmd[sizeof(toybuf)], path[64]; - char **curname; - - if (!(dp = opendir("/proc"))) perror_exit("opendir"); - - while ((entry = readdir(dp))) { - int fd, n; - - if (!isdigit(*entry->d_name)) continue; - - if (sizeof(path) <= snprintf(path, sizeof(path), "/proc/%s/cmdline", - entry->d_name)) continue; - - if (-1 == (fd=open(path, O_RDONLY))) continue; - n = read(fd, cmd, sizeof(cmd)); - close(fd); - if (n<1) continue; - - for (curname = names; *curname; curname++) - if (!strcmp(basename(cmd), *curname)) - if (!callback(atol(entry->d_name), *curname)) goto done; - } -done: - closedir(dp); -} - struct signame { int num; char *name; @@ -1235,81 +1204,3 @@ void mode_to_string(mode_t mode, char *buf) else c = '-'; *buf = c; } - -char* make_human_readable(unsigned long long size, unsigned long unit) -{ - unsigned int frac = 0; - if(unit) { - size = (size/(unit)) + (size%(unit)?1:0); - return xmsprintf("%llu", size); - } - else { - static char units[] = {'\0', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'}; - int index = 0; - while(size >= 1024) { - frac = size%1024; - size /= 1024; - index++; - } - frac = (frac/102) + ((frac%102)?1:0); - if(frac >= 10) { - size += 1; - frac = 0; - } - if(frac) return xmsprintf("%llu.%u%c", size, frac, units[index]); - else return xmsprintf("%llu%c", size, units[index]); - } - return NULL; //not reached -} - -// strtoul with exit on error -unsigned long xstrtoul(const char *nptr, char **endptr, int base) -{ - unsigned long l; - errno = 0; - l = strtoul(nptr, endptr, base); - if (errno) - perror_exit("xstrtoul"); - return l; -} - -/* - * used to get the interger value. - */ -unsigned long get_int_value(const char *numstr, unsigned lowrange, unsigned highrange) -{ - unsigned long rvalue = 0; - char *ptr; - if(*numstr == '-' || *numstr == '+' || isspace(*numstr)) perror_exit("invalid number '%s'", numstr); - errno = 0; - rvalue = strtoul(numstr, &ptr, 10); - if(errno || numstr == ptr) perror_exit("invalid number '%s'", numstr); - if(*ptr) perror_exit("invalid number '%s'", numstr); - if(rvalue >= lowrange && rvalue <= highrange) return rvalue; - else { - perror_exit("invalid number '%s'", numstr); - return rvalue; //Not reachable; to avoid waring message. - } -} - -/* - * strcat to mallocated buffer - * reallocate if need be - */ -char *astrcat (char *x, char *y) { - char *z; - z = x; - x = realloc (x, (x ? strlen (x) : 0) + strlen (y) + 1); - if (!x) return 0; - (z ? strcat : strcpy) (x, y); - return x; -} - -/* - * astrcat, but die on failure - */ -char *xastrcat (char *x, char *y) { - x = astrcat (x, y); - if (!x) error_exit ("xastrcat"); - return x; -} diff --git a/lib/pending.c b/lib/pending.c new file mode 100644 index 00000000..fad1c656 --- /dev/null +++ b/lib/pending.c @@ -0,0 +1,104 @@ +/* pending.c - reusable stuff awaiting review + * + * new lib entries for stuff in toys/pending + */ + +#include "toys.h" + +// Execute a callback for each PID that matches a process name from a list. +void for_each_pid_with_name_in(char **names, int (*callback)(pid_t pid, char *name)) +{ + DIR *dp; + struct dirent *entry; + char cmd[sizeof(toybuf)], path[64]; + char **curname; + + if (!(dp = opendir("/proc"))) perror_exit("opendir"); + + while ((entry = readdir(dp))) { + int fd, n; + + if (!isdigit(*entry->d_name)) continue; + + if (sizeof(path) <= snprintf(path, sizeof(path), "/proc/%s/cmdline", + entry->d_name)) continue; + + if (-1 == (fd=open(path, O_RDONLY))) continue; + n = read(fd, cmd, sizeof(cmd)); + close(fd); + if (n<1) continue; + + for (curname = names; *curname; curname++) + if (!strcmp(basename(cmd), *curname)) + if (!callback(atol(entry->d_name), *curname)) goto done; + } +done: + closedir(dp); +} + +char* make_human_readable(unsigned long long size, unsigned long unit) +{ + unsigned int frac = 0; + if(unit) { + size = (size/(unit)) + (size%(unit)?1:0); + return xmsprintf("%llu", size); + } + else { + static char units[] = {'\0', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'}; + int index = 0; + while(size >= 1024) { + frac = size%1024; + size /= 1024; + index++; + } + frac = (frac/102) + ((frac%102)?1:0); + if(frac >= 10) { + size += 1; + frac = 0; + } + if(frac) return xmsprintf("%llu.%u%c", size, frac, units[index]); + else return xmsprintf("%llu%c", size, units[index]); + } + return NULL; //not reached +} + +/* + * used to get the interger value. + */ +unsigned long get_int_value(const char *numstr, unsigned lowrange, unsigned highrange) +{ + unsigned long rvalue = 0; + char *ptr; + if(*numstr == '-' || *numstr == '+' || isspace(*numstr)) perror_exit("invalid number '%s'", numstr); + errno = 0; + rvalue = strtoul(numstr, &ptr, 10); + if(errno || numstr == ptr) perror_exit("invalid number '%s'", numstr); + if(*ptr) perror_exit("invalid number '%s'", numstr); + if(rvalue >= lowrange && rvalue <= highrange) return rvalue; + else { + perror_exit("invalid number '%s'", numstr); + return rvalue; //Not reachable; to avoid waring message. + } +} + +/* + * strcat to mallocated buffer + * reallocate if need be + */ +char *astrcat (char *x, char *y) { + char *z; + z = x; + x = realloc (x, (x ? strlen (x) : 0) + strlen (y) + 1); + if (!x) return 0; + (z ? strcat : strcpy) (x, y); + return x; +} + +/* + * astrcat, but die on failure + */ +char *xastrcat (char *x, char *y) { + x = astrcat (x, y); + if (!x) error_exit ("xastrcat"); + return x; +} -- cgit v1.2.3