aboutsummaryrefslogtreecommitdiff
path: root/toys/pending/bootchartd.c
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2019-07-11 14:00:07 -0700
committerRob Landley <rob@landley.net>2019-07-12 13:18:11 -0500
commita7b8b772dee4f159028e3b998454d7466fbbc88f (patch)
treef8cdf969a4a42ff39bad63e5d3a7aaf4844cb541 /toys/pending/bootchartd.c
parent5194d4ad66ad130cb730e0b192ba1e2b5181184d (diff)
downloadtoybox-a7b8b772dee4f159028e3b998454d7466fbbc88f.tar.gz
pidof: fix default behavior, add -x.
Before this patch, we're effectively doing `pidof -x` all the time. This patch changes names_to_pid() to allow us to say whether or not we want to include scripts, and adjusts the callers appropriately. Also add tests for `pidof` versus `pidof -x` which pass after this patch, without regressing the existing killall tests.
Diffstat (limited to 'toys/pending/bootchartd.c')
-rw-r--r--toys/pending/bootchartd.c38
1 files changed, 12 insertions, 26 deletions
diff --git a/toys/pending/bootchartd.c b/toys/pending/bootchartd.c
index 7e5a136f..1fe6aff6 100644
--- a/toys/pending/bootchartd.c
+++ b/toys/pending/bootchartd.c
@@ -34,24 +34,9 @@ GLOBALS(
int proc_accounting;
int is_login;
- void *head;
+ pid_t cur_pid;
)
-struct pid_list {
- struct pid_list *next, *prev;
- int pid;
-};
-
-static int push_pids_in_list(pid_t pid, char *name)
-{
- struct pid_list *new = xzalloc(sizeof(struct pid_list));
-
- new->pid = pid;
- dlist_add_nomalloc((void *)&TT.head, (void *)new);
-
- return 0;
-}
-
static void dump_data_in_file(char *fname, int wfd)
{
int rfd = open(fname, O_RDONLY);
@@ -253,13 +238,21 @@ static void stop_logging(char *tmp_dir, char *prog)
}
}
+static int signal_pid(pid_t pid, char *name)
+{
+ if (pid != TT.cur_pid) kill(pid, SIGUSR1);
+ return 0;
+}
+
void bootchartd_main()
{
- pid_t lgr_pid, self_pid = getpid();
+ pid_t lgr_pid;
int bchartd_opt = 0; // 0=PID1, 1=start, 2=stop, 3=init
+
+ TT.cur_pid = getpid();
TT.smpl_period_usec = 200 * 1000;
- TT.is_login = (self_pid == 1);
+ TT.is_login = (TT.cur_pid == 1);
if (*toys.optargs) {
if (!strcmp("start", *toys.optargs)) bchartd_opt = 1;
else if (!strcmp("stop", *toys.optargs)) bchartd_opt = 2;
@@ -267,16 +260,9 @@ void bootchartd_main()
else error_exit("Unknown option '%s'", *toys.optargs);
if (bchartd_opt == 2) {
- struct pid_list *temp;
char *process_name[] = {"bootchartd", NULL};
- names_to_pid(process_name, push_pids_in_list);
- temp = TT.head;
- if (temp) temp->prev->next = 0;
- for (; temp; temp = temp->next)
- if (temp->pid != self_pid) kill(temp->pid, SIGUSR1);
- llist_traverse(TT.head, free);
-
+ names_to_pid(process_name, signal_pid, 0);
return;
}
} else if (!TT.is_login) error_exit("not PID 1");