static void pidset_init(struct pidset *p)
{
int i;
- for (i = 0; i < lenof(p->procbits); i++)
+ for (i = 0; i < (int)lenof(p->procbits); i++)
p->procbits[i] = 0L;
}
int word, count;
count = 0;
- for (word = 0; word < lenof(p->procbits); word++) {
+ for (word = 0; word < (int)lenof(p->procbits); word++) {
unsigned long mask = p->procbits[word];
while (mask > 0) {
count += (mask & 1);
{
int word = p->next / WORDBITS;
int bit = p->next % WORDBITS;
- while (word < lenof(p->procbits) && p->procbits[word] >> bit == 0) {
+ while (word < (int)lenof(p->procbits) && p->procbits[word] >> bit == 0) {
word++;
bit = 0;
p->next = WORDBITS * word + bit;
}
- if (word >= lenof(p->procbits))
+ if (word >= (int)lenof(p->procbits))
return -1;
while (!((p->procbits[word] >> bit) & 1)) {
return ret;
}
+static struct pidset filter_by_uid(struct pidset in, int uid)
+{
+ /*
+ * Return only those processes with a given uid.
+ */
+ struct pidset ret;
+ int pid;
+
+ pidset_init(&ret);
+ for (pid = pidset_first(&in); pid >= 0; pid = pidset_next(&in)) {
+ const struct procdata *proc = get_proc(pid);
+ if (proc->uid == uid)
+ pidset_add(&ret, pid);
+ }
+ return ret;
+}
+
static struct pidset filter_by_command(struct pidset in, const char **words)
{
/*
const char usagemsg[] =
"usage: pid [options] <search-cmd> [<search-arg>...]\n"
"where: -a report all matching pids, not just one\n"
+ " -U report pids of any user, not just ours\n"
" also: pid --version report version number\n"
" pid --help display this help text\n"
" pid --licence display the (MIT) licence text\n"
{
const char **searchwords;
int nsearchwords;
- int all = 0;
+ int all = 0, all_uids = 0;
int doing_opts = 1;
/*
if (doing_opts && *p == '-') {
if (!strcmp(p, "-a") || !strcmp(p, "--all")) {
all = 1;
+ } else if (!strcmp(p, "-U") || !strcmp(p, "--all-uids")) {
+ all_uids = 1;
} else if (!strcmp(p, "--version")) {
version();
return 0;
{
struct pidset procs;
- int pid, npids;
+ int uid, pid, npids;
/*
* Construct our list of processes.
*/
procs = get_processes();
+ uid = getuid();
+ if (uid > 0 && !all_uids)
+ procs = filter_by_uid(procs, uid);
procs = filter_out_self(procs);
procs = filter_by_command(procs, searchwords);
if (!all)