- pidof(8): make -s optional and optional -o; closes #168 first cut.
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -2160,16 +2160,37 @@ | |
| "$ patch -p1 <example.diff\n" \ | |
| "$ patch -p0 -i example.diff" | |
| + | #if ENABLE_FEATURE_PIDOF_SINGLE |
| + | #define USAGE_FEATURE_PIDOF_SINGLE(a) a |
| + | #else |
| + | #define USAGE_FEATURE_PIDOF_SINGLE(a) |
| + | #endif |
| + | #if ENABLE_FEATURE_PIDOF_OMIT |
| + | #define USAGE_FEATURE_PIDOF_OMIT(a) a |
| + | #else |
| + | #define USAGE_FEATURE_PIDOF_OMIT(a) |
| + | #endif |
| + | #if (ENABLE_FEATURE_PIDOF_SINGLE || ENABLE_FEATURE_PIDOF_OMIT) |
| + | #define USAGE_PIDOF "Options:" |
| + | #else |
| + | #define USAGE_PIDOF "\n\tThis version of pidof accepts no options." |
| + | #endif |
| + | |
| #define pidof_trivial_usage \ | |
| "process-name [OPTION] [process-name ...]" | |
| + | |
| #define pidof_full_usage \ | |
| "Lists the PIDs of all processes with names that match the\n" \ | |
| "names on the command line.\n" \ | |
| - | "Options:\n" \ |
| - | "\t-s\t\tdisplay only a single PID" |
| + | USAGE_PIDOF \ |
| + | USAGE_FEATURE_PIDOF_SINGLE("\n\t-s\t\tdisplay only a single PID") \ |
| + | USAGE_FEATURE_PIDOF_OMIT("\n\t-o\t\tomit given pid.") \ |
| + | USAGE_FEATURE_PIDOF_OMIT("\n\t\t\tUse %PPID to omit the parent pid of pidof itself") |
| #define pidof_example_usage \ | |
| "$ pidof init\n" \ | |
| - | "1\n" |
| + | "1\n" \ |
| + | USAGE_FEATURE_PIDOF_OMIT("$ pidof /bin/sh\n20351 5973 5950\n") \ |
| + | USAGE_FEATURE_PIDOF_OMIT("$ pidof /bin/sh -o %PPID\n20351 5950") |
| #ifndef CONFIG_FEATURE_FANCY_PING | |
| #define ping_trivial_usage "host" | |
| @@ -37,6 +37,22 @@ config CONFIG_PIDOF | |
| Pidof finds the process id's (pids) of the named programs. It prints | |
| those id's on the standard output. | |
| + | config CONFIG_FEATURE_PIDOF_SINGLE |
| + | bool " Enable argument for single shot (-s)" |
| + | default n |
| + | depends on CONFIG_PIDOF |
| + | help |
| + | Support argument '-s' for returning only the first pid found. |
| + | |
| + | config CONFIG_FEATURE_PIDOF_OMIT |
| + | bool " Enable argument for omitting pids (-o)" |
| + | default n |
| + | depends on CONFIG_PIDOF |
| + | help |
| + | Support argument '-o' for omitting the given pids in output. |
| + | The special pid %PPID can be used to name the parent process |
| + | of the pidof, in other words the calling shell or shell script. |
| + | |
| config CONFIG_PS | |
| bool "ps" | |
| default n | |
| @@ -4,20 +4,7 @@ | |
| * | |
| * Copyright (C) 1999-2004 by Erik Andersen <[email protected]> | |
| * | |
| - | * This program is free software; you can redistribute it and/or modify |
| - | * it under the terms of the GNU General Public License as published by |
| - | * the Free Software Foundation; either version 2 of the License, or |
| - | * (at your option) any later version. |
| - | * |
| - | * This program is distributed in the hope that it will be useful, |
| - | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| - | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| - | * General Public License for more details. |
| - | * |
| - | * You should have received a copy of the GNU General Public License |
| - | * along with this program; if not, write to the Free Software |
| - | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| - | * |
| + | * Licensed under the GPL v2, see the file LICENSE in this tarball. |
| */ | |
| @@ -31,41 +18,120 @@ | |
| #include <unistd.h> | |
| #include "busybox.h" | |
| + | #if ENABLE_FEATURE_PIDOF_SINGLE |
| + | #define _SINGLE_COMPL(a) a |
| + | #define SINGLE (1<<0) |
| + | #else |
| + | #define _SINGLE_COMPL(a) |
| + | #define SINGLE (0) |
| + | #endif |
| + | |
| + | #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 |
| + | #define OMIT (1<<0) |
| + | #endif |
| + | #else |
| + | #define _OMIT_COMPL(a) "" |
| + | #define _OMIT(a) |
| + | #define OMIT (0) |
| + | #endif |
| extern int pidof_main(int argc, char **argv) | |
| { | |
| - | int opt, n = 0; |
| - | int single_flag = 0; |
| + | int n = 0; |
| int fail = 1; | |
| + | unsigned long int opt; |
| + | #if ENABLE_FEATURE_PIDOF_OMIT |
| + | bb_opt_complementally = _OMIT_COMPL("o*"); |
| + | #endif |
| - | /* do normal option parsing */ |
| - | while ((opt = getopt(argc, argv, "s")) > 0) { |
| - | switch (opt) { |
| - | case 's': |
| - | single_flag = 1; |
| - | break; |
| - | default: |
| - | bb_show_usage(); |
| - | } |
| + | /* do option parsing */ |
| + | if ((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(); |
| } | |
| - | /* Looks like everything is set to go. */ |
| + | #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] == '%') { |
| + | 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 |
| + | } |
| + | } 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->data = getppid_str; |
| + | omits_p = omits_p->link; |
| + | } |
| + | RELEASE_CONFIG_BUFFER(getppid_str); |
| + | } |
| + | #endif |
| + | /* Looks like everything is set to go. */ |
| while(optind < argc) { | |
| long *pidList; | |
| long *pl; | |
| - | pidList = find_pid_by_name(argv[optind]); |
| + | /* reverse the pidlist like GNU pidof does. */ |
| + | pidList = pidlist_reverse(find_pid_by_name(argv[optind])); |
| for(pl = pidList; *pl > 0; pl++) { | |
| + | #if ENABLE_FEATURE_PIDOF_OMIT |
| + | unsigned short omitted = 0; |
| + | if (opt & OMIT) { |
| + | llist_t *omits_p = omits; |
| + | while (omits_p) |
| + | if (strtol(omits_p->data, NULL, 10) == *pl) { |
| + | omitted = 1; break; |
| + | } else |
| + | omits_p = omits_p->link; |
| + | } |
| + | if (!omitted) |
| + | #endif |
| printf("%s%ld", (n++ ? " " : ""), *pl); | |
| + | #if ENABLE_FEATURE_PIDOF_OMIT |
| + | fail = omitted; |
| + | #else |
| fail = 0; | |
| - | if (single_flag) |
| + | #endif |
| + | #if ENABLE_FEATURE_PIDOF_SINGLE |
| + | if (opt & SINGLE) |
| break; | |
| + | #endif |
| } | |
| free(pidList); | |
| optind++; | |
| - | |
| } | |
| - | printf("\n"); |
| + | putchar('\n'); |
| + | #if ENABLE_FEATURE_PIDOF_OMIT |
| + | if (ENABLE_FEATURE_CLEAN_UP) |
| + | llist_free(omits); |
| + | #endif |
| return fail ? EXIT_FAILURE : EXIT_SUCCESS; | |
| } | |