blob: d093d6874286b505c50079be98717abb2980c853 [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 <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;
}