| // 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; |
| } |
| } |