X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=procps%2Fpidof.c;h=d9c8dca420a720c543b350be467e0f44f9163aa6;hb=5929edc1fac4340f99ed84e92bf3a2bedd4177c2;hp=6f959e4ad89146f2cdc0e03566d9db22c7786b44;hpb=81c3a518d3121ac6a9fc991aabb916be95ebdea2;p=oweals%2Fbusybox.git diff --git a/procps/pidof.c b/procps/pidof.c index 6f959e4ad..d9c8dca42 100644 --- a/procps/pidof.c +++ b/procps/pidof.c @@ -7,7 +7,7 @@ * Licensed under the GPL v2, see the file LICENSE in this tarball. */ - +#include "busybox.h" #include #include #include @@ -15,8 +15,8 @@ #include #include #include +#include #include -#include "busybox.h" #if ENABLE_FEATURE_PIDOF_SINGLE #define _SINGLE_COMPL(a) a @@ -29,7 +29,6 @@ #if ENABLE_FEATURE_PIDOF_OMIT #define _OMIT_COMPL(a) a #define _OMIT(a) ,a -static llist_t *omits; /* list of pids to omit */ #if ENABLE_FEATURE_PIDOF_SINGLE #define OMIT (1<<1) #else @@ -39,58 +38,38 @@ static llist_t *omits; /* list of pids to omit */ #define _OMIT_COMPL(a) "" #define _OMIT(a) #define OMIT (0) +#define omitted (0) #endif -extern int pidof_main(int argc, char **argv) +int pidof_main(int argc, char **argv) { - int n = 0; - int fail = 1; + unsigned n = 0; + unsigned fail = 1; unsigned long int opt; #if ENABLE_FEATURE_PIDOF_OMIT - bb_opt_complementally = _OMIT_COMPL("o*"); + llist_t *omits = NULL; /* list of pids to omit */ + bb_opt_complementally = _OMIT_COMPL("o::"); #endif - /* do option parsing */ - if ((opt = bb_getopt_ulflags(argc, argv, + /* do unconditional option parsing */ + opt = bb_getopt_ulflags(argc, argv, _SINGLE_COMPL("s") _OMIT_COMPL("o:") - _OMIT(&omits))) - > 0) { -#if ENABLE_FEATURE_PIDOF_SINGLE - if (!(opt & SINGLE)) -#endif -#if ENABLE_FEATURE_PIDOF_OMIT - if (!(opt & OMIT)) -#endif - bb_show_usage(); - } + _OMIT(&omits)); #if ENABLE_FEATURE_PIDOF_OMIT /* fill omit list. */ { - RESERVE_CONFIG_BUFFER(getppid_str, 32); - llist_t * omits_p = omits; - while (omits_p) { - /* are we asked to exclude the parent's process ID? */ - if (omits_p->data[0] == '%') { + char getppid_str[32]; + llist_t * omits_p = omits; + while (omits_p) { + /* are we asked to exclude the parent's process ID? */ if (!strncmp(omits_p->data, "%PPID", 5)) { - /* yes, exclude ppid */ - snprintf(getppid_str, sizeof(getppid_str), "%ld", getppid()); -// omits_p->data = getppid_str; -#if 0 - } else { - bb_error_msg_and_die("illegal omit pid value (%s)!\n", - omits_p->data); -#endif + llist_pop(&omits_p); + snprintf(getppid_str, sizeof(getppid_str), "%d", getppid()); + llist_add_to(&omits_p, getppid_str); } - } else { - /* no, not talking about ppid but deal with usual case (pid). */ - snprintf(getppid_str, sizeof(getppid_str), "%ld", - strtol(omits_p->data, NULL, 10)); + omits_p = omits_p->link; } - omits_p->data = getppid_str; - omits_p = omits_p->link; - } - RELEASE_CONFIG_BUFFER(getppid_str); } #endif /* Looks like everything is set to go. */ @@ -102,7 +81,7 @@ extern int pidof_main(int argc, char **argv) pidList = pidlist_reverse(find_pid_by_name(argv[optind])); for(pl = pidList; *pl > 0; pl++) { #if ENABLE_FEATURE_PIDOF_OMIT - unsigned short omitted = 0; + unsigned omitted = 0; if (opt & OMIT) { llist_t *omits_p = omits; while (omits_p) @@ -111,18 +90,19 @@ extern int pidof_main(int argc, char **argv) } else omits_p = omits_p->link; } - if (!omitted) -#endif - printf("%s%ld", (n++ ? " " : ""), *pl); -#if ENABLE_FEATURE_PIDOF_OMIT - fail = omitted; -#else - fail = 0; #endif -#if ENABLE_FEATURE_PIDOF_SINGLE - if (opt & SINGLE) + if (!omitted) { + if (n) { + putchar(' '); + } else { + n = 1; + } + printf("%ld", *pl); + } + fail = (!ENABLE_FEATURE_PIDOF_OMIT && omitted); + + if (ENABLE_FEATURE_PIDOF_SINGLE && (opt & SINGLE)) break; -#endif } free(pidList); optind++; @@ -131,7 +111,7 @@ extern int pidof_main(int argc, char **argv) #if ENABLE_FEATURE_PIDOF_OMIT if (ENABLE_FEATURE_CLEAN_UP) - llist_free(omits); + llist_free(omits, NULL); #endif return fail ? EXIT_FAILURE : EXIT_SUCCESS; }