- pidof(8): make -s optional and optional -o; closes #168

first cut.
This commit is contained in:
Bernhard Reutner-Fischer 2005-10-06 15:37:02 +00:00
parent b31cb87fdc
commit 81c3a518d3
3 changed files with 136 additions and 33 deletions

View File

@ -2160,16 +2160,37 @@
"$ patch -p1 <example.diff\n" \ "$ patch -p1 <example.diff\n" \
"$ patch -p0 -i example.diff" "$ 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 \ #define pidof_trivial_usage \
"process-name [OPTION] [process-name ...]" "process-name [OPTION] [process-name ...]"
#define pidof_full_usage \ #define pidof_full_usage \
"Lists the PIDs of all processes with names that match the\n" \ "Lists the PIDs of all processes with names that match the\n" \
"names on the command line.\n" \ "names on the command line.\n" \
"Options:\n" \ USAGE_PIDOF \
"\t-s\t\tdisplay only a single PID" 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 \ #define pidof_example_usage \
"$ pidof init\n" \ "$ 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 #ifndef CONFIG_FEATURE_FANCY_PING
#define ping_trivial_usage "host" #define ping_trivial_usage "host"

View File

@ -37,6 +37,22 @@ config CONFIG_PIDOF
Pidof finds the process id's (pids) of the named programs. It prints Pidof finds the process id's (pids) of the named programs. It prints
those id's on the standard output. 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 config CONFIG_PS
bool "ps" bool "ps"
default n default n

View File

@ -4,20 +4,7 @@
* *
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
* *
* This program is free software; you can redistribute it and/or modify * Licensed under the GPL v2, see the file LICENSE in this tarball.
* 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
*
*/ */
@ -31,41 +18,120 @@
#include <unistd.h> #include <unistd.h>
#include "busybox.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) extern int pidof_main(int argc, char **argv)
{ {
int opt, n = 0; int n = 0;
int single_flag = 0;
int fail = 1; int fail = 1;
unsigned long int opt;
#if ENABLE_FEATURE_PIDOF_OMIT
bb_opt_complementally = _OMIT_COMPL("o*");
#endif
/* do normal option parsing */ /* do option parsing */
while ((opt = getopt(argc, argv, "s")) > 0) { if ((opt = bb_getopt_ulflags(argc, argv,
switch (opt) { _SINGLE_COMPL("s") _OMIT_COMPL("o:")
case 's': _OMIT(&omits)))
single_flag = 1; > 0) {
break; #if ENABLE_FEATURE_PIDOF_SINGLE
default: if (!(opt & SINGLE))
bb_show_usage(); #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) { while(optind < argc) {
long *pidList; long *pidList;
long *pl; 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++) { 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); printf("%s%ld", (n++ ? " " : ""), *pl);
#if ENABLE_FEATURE_PIDOF_OMIT
fail = omitted;
#else
fail = 0; fail = 0;
if (single_flag) #endif
#if ENABLE_FEATURE_PIDOF_SINGLE
if (opt & SINGLE)
break; break;
#endif
} }
free(pidList); free(pidList);
optind++; 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; return fail ? EXIT_FAILURE : EXIT_SUCCESS;
} }