| // 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 <inttypes.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <zircon/syscalls.h> | |
| #include <task-utils/walker.h> | |
| static zx_status_t callback(void* ctx, int depth, zx_handle_t handle, zx_koid_t koid, | |
| zx_koid_t parent_koid) { | |
| zx_koid_t task_id = *(zx_koid_t*)ctx; | |
| if (koid == task_id) { | |
| zx_task_kill(handle); | |
| // found and killed the task - abort the search | |
| return ZX_ERR_INTERNAL; | |
| } | |
| return ZX_OK; | |
| } | |
| int main(int argc, const char** argv) { | |
| if (argc < 2) { | |
| fprintf(stderr, "usage: %s <task id>...\n", argv[0]); | |
| return -1; | |
| } | |
| bool errored = false; | |
| for (int i = 1; i < argc; i++) { | |
| const char* arg = argv[i]; | |
| if ((arg[0] == 'p' || arg[1] == 'j') && (arg[1] == ':')) { | |
| // Skip leading "p:" or "j:". | |
| arg += 2; | |
| } | |
| char* endptr; | |
| zx_koid_t task_id = strtoll(arg, &endptr, 10); | |
| if (*endptr != '\0') { | |
| fprintf(stderr, "\"%s\" is not a valid task id\n", arg); | |
| errored = true; | |
| continue; | |
| } | |
| zx_status_t status = walk_root_job_tree(callback, callback, NULL, &task_id); | |
| if (status == ZX_OK) { | |
| fprintf(stderr, "task %lu not found\n", task_id); | |
| errored = true; | |
| continue; | |
| } | |
| } | |
| return errored ? -1 : 0; | |
| } |