blob: 9e5ee7a6d35544ed51190fd81d72cd3628001127 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <fnmatch.h>
#include <inttypes.h>
#include <libgen.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zircon/syscalls.h>
#include <task-utils/walker.h>
const char* kill_name;
int killed = 0;
zx_status_t process_callback(void* unused_ctx, int depth, zx_handle_t process,
zx_koid_t koid, zx_koid_t parent_koid) {
char name[ZX_MAX_NAME_LEN];
zx_status_t status =
zx_object_get_property(process, ZX_PROP_NAME, name, sizeof(name));
if (status != ZX_OK) {
return status;
}
if (!strcmp(name, kill_name) ||
!fnmatch(kill_name, name, 0) ||
!strcmp(basename(name), kill_name)) {
zx_task_kill(process);
printf("Killed %" PRIu64 " %s\n", koid, name);
killed++;
}
return ZX_OK;
}
int main(int argc, char** argv) {
if (argc != 2) {
fprintf(stderr, "usage: %s <process>\n", argv[0]);
fprintf(stderr, " <process> can be the name of a process, the basename of a process\n");
fprintf(stderr, " or glob pattern matching a process name.\n");
return -1;
}
kill_name = argv[1];
walk_root_job_tree(NULL, process_callback, NULL, NULL);
if (killed == 0) {
fprintf(stderr, "no tasks found\n");
return -1;
}
}