diff options
author | Rob Landley <rob@landley.net> | 2013-07-14 22:12:22 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2013-07-14 22:12:22 -0500 |
commit | 87aef2480ed3c6ca587815ea36e7dd380301c97c (patch) | |
tree | 29e22b25293b8fce82517d29e89f8d94866dd681 | |
parent | e999ca008416e3d41c1079bcb4d151b43c95dc3a (diff) | |
download | toybox-87aef2480ed3c6ca587815ea36e7dd380301c97c.tar.gz |
New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
-rw-r--r-- | lib/lib.c | 109 | ||||
-rw-r--r-- | lib/pending.c | 104 |
2 files changed, 104 insertions, 109 deletions
@@ -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; +} |