Contents of /tags/mkinitrd-6_1_3/busybox/procps/pidof.c
Parent Directory | Revision Log
Revision 846 -
(show annotations)
(download)
Mon May 4 18:51:23 2009 UTC (15 years, 4 months ago) by niro
File MIME type: text/plain
File size: 2056 byte(s)
Mon May 4 18:51:23 2009 UTC (15 years, 4 months ago) by niro
File MIME type: text/plain
File size: 2056 byte(s)
tagged 'mkinitrd-6_1_3'
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * pidof implementation for busybox |
4 | * |
5 | * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> |
6 | * |
7 | * Licensed under the GPL version 2, see the file LICENSE in this tarball. |
8 | */ |
9 | |
10 | #include "libbb.h" |
11 | |
12 | enum { |
13 | USE_FEATURE_PIDOF_SINGLE(OPTBIT_SINGLE,) |
14 | USE_FEATURE_PIDOF_OMIT( OPTBIT_OMIT ,) |
15 | OPT_SINGLE = USE_FEATURE_PIDOF_SINGLE((1<<OPTBIT_SINGLE)) + 0, |
16 | OPT_OMIT = USE_FEATURE_PIDOF_OMIT( (1<<OPTBIT_OMIT )) + 0, |
17 | }; |
18 | |
19 | int pidof_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
20 | int pidof_main(int argc UNUSED_PARAM, char **argv) |
21 | { |
22 | unsigned first = 1; |
23 | unsigned opt; |
24 | #if ENABLE_FEATURE_PIDOF_OMIT |
25 | llist_t *omits = NULL; /* list of pids to omit */ |
26 | opt_complementary = "o::"; |
27 | #endif |
28 | |
29 | /* do unconditional option parsing */ |
30 | opt = getopt32(argv, "" |
31 | USE_FEATURE_PIDOF_SINGLE ("s") |
32 | USE_FEATURE_PIDOF_OMIT("o:", &omits)); |
33 | |
34 | #if ENABLE_FEATURE_PIDOF_OMIT |
35 | /* fill omit list. */ |
36 | { |
37 | llist_t *omits_p = omits; |
38 | while (omits_p) { |
39 | /* are we asked to exclude the parent's process ID? */ |
40 | if (strcmp(omits_p->data, "%PPID") == 0) { |
41 | omits_p->data = utoa((unsigned)getppid()); |
42 | } |
43 | omits_p = omits_p->link; |
44 | } |
45 | } |
46 | #endif |
47 | /* Looks like everything is set to go. */ |
48 | argv += optind; |
49 | while (*argv) { |
50 | pid_t *pidList; |
51 | pid_t *pl; |
52 | |
53 | /* reverse the pidlist like GNU pidof does. */ |
54 | pidList = pidlist_reverse(find_pid_by_name(*argv)); |
55 | for (pl = pidList; *pl; pl++) { |
56 | #if ENABLE_FEATURE_PIDOF_OMIT |
57 | if (opt & OPT_OMIT) { |
58 | llist_t *omits_p = omits; |
59 | while (omits_p) { |
60 | if (xatoul(omits_p->data) == (unsigned long)(*pl)) { |
61 | goto omitting; |
62 | } |
63 | omits_p = omits_p->link; |
64 | } |
65 | } |
66 | #endif |
67 | printf(" %u" + first, (unsigned)*pl); |
68 | first = 0; |
69 | if (ENABLE_FEATURE_PIDOF_SINGLE && (opt & OPT_SINGLE)) |
70 | break; |
71 | #if ENABLE_FEATURE_PIDOF_OMIT |
72 | omitting: ; |
73 | #endif |
74 | } |
75 | free(pidList); |
76 | argv++; |
77 | } |
78 | if (!first) |
79 | bb_putchar('\n'); |
80 | |
81 | #if ENABLE_FEATURE_PIDOF_OMIT |
82 | if (ENABLE_FEATURE_CLEAN_UP) |
83 | llist_free(omits, NULL); |
84 | #endif |
85 | return first; /* 1 (failure) - no processes found */ |
86 | } |