annotate lib/pending.c @ 979:53a9bcb938f0

Move renice from pending to posix, default y, fix link to standard.
author Rob Landley <rob@landley.net>
date Wed, 31 Jul 2013 16:36:57 -0500
parents 59d4d453296b
children 893c86bbe452
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
949
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* pending.c - reusable stuff awaiting review
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * new lib entries for stuff in toys/pending
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 */
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
5
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 #include "toys.h"
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
7
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 // Execute a callback for each PID that matches a process name from a list.
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 void for_each_pid_with_name_in(char **names, int (*callback)(pid_t pid, char *name))
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 DIR *dp;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 struct dirent *entry;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 char cmd[sizeof(toybuf)], path[64];
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 char **curname;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
15
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 if (!(dp = opendir("/proc"))) perror_exit("opendir");
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
17
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 while ((entry = readdir(dp))) {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 int fd, n;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
20
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 if (!isdigit(*entry->d_name)) continue;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
22
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 if (sizeof(path) <= snprintf(path, sizeof(path), "/proc/%s/cmdline",
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 entry->d_name)) continue;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
25
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 if (-1 == (fd=open(path, O_RDONLY))) continue;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 n = read(fd, cmd, sizeof(cmd));
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 close(fd);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 if (n<1) continue;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
30
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 for (curname = names; *curname; curname++)
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 if (!strcmp(basename(cmd), *curname))
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 if (!callback(atol(entry->d_name), *curname)) goto done;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 done:
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 closedir(dp);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
38
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 char* make_human_readable(unsigned long long size, unsigned long unit)
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 unsigned int frac = 0;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 if(unit) {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 size = (size/(unit)) + (size%(unit)?1:0);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 return xmsprintf("%llu", size);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 else {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 static char units[] = {'\0', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'};
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 int index = 0;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 while(size >= 1024) {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 frac = size%1024;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 size /= 1024;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 index++;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 frac = (frac/102) + ((frac%102)?1:0);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 if(frac >= 10) {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 size += 1;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 frac = 0;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 if(frac) return xmsprintf("%llu.%u%c", size, frac, units[index]);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 else return xmsprintf("%llu%c", size, units[index]);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 return NULL; //not reached
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
63 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
64
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 /*
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 * used to get the interger value.
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 */
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 unsigned long get_int_value(const char *numstr, unsigned lowrange, unsigned highrange)
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 unsigned long rvalue = 0;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 char *ptr;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 if(*numstr == '-' || *numstr == '+' || isspace(*numstr)) perror_exit("invalid number '%s'", numstr);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 errno = 0;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 rvalue = strtoul(numstr, &ptr, 10);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 if(errno || numstr == ptr) perror_exit("invalid number '%s'", numstr);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 if(*ptr) perror_exit("invalid number '%s'", numstr);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 if(rvalue >= lowrange && rvalue <= highrange) return rvalue;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 else {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 perror_exit("invalid number '%s'", numstr);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 return rvalue; //Not reachable; to avoid waring message.
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
83
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 /*
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 * strcat to mallocated buffer
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 * reallocate if need be
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 */
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 char *astrcat (char *x, char *y) {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 char *z;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 z = x;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 x = realloc (x, (x ? strlen (x) : 0) + strlen (y) + 1);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 if (!x) return 0;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 (z ? strcat : strcpy) (x, y);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 return x;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 }
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
96
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 /*
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 * astrcat, but die on failure
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 */
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 char *xastrcat (char *x, char *y) {
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 x = astrcat (x, y);
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 if (!x) error_exit ("xastrcat");
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
103 return x;
59d4d453296b New stuff added to lib.c needs review too, so make a lib/pending.c and move several functions to it.
Rob Landley <rob@landley.net>
parents:
diff changeset
104 }