// Copyright 2019 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.
library zx;

@transport("Syscall")
protocol job {
    // TODO(fxbug.dev/32803): parent_job with ZX_RIGHT_WRITE is also accepted.
    /// Create a new job.
    /// Rights: parent_job must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_MANAGE_JOB.
    job_create(resource struct {
        parent_job handle:JOB;
        options uint32;
    }) -> (resource struct {
        status status;
        out handle:JOB;
    });

    /// Set job security and resource policies.
    /// Rights: handle must be of type ZX_OBJ_TYPE_JOB and have ZX_RIGHT_SET_POLICY.
    job_set_policy(resource struct {
        handle handle:JOB;
        options uint32;
        topic uint32;
        policy vector_void_u32size;
    }) -> (struct {
        status status;
    });

    /// Set a process as critical to a job.
    /// Rights: job must have ZX_RIGHT_DESTROY.
    /// Rights: process must have ZX_RIGHT_WAIT.
    job_set_critical(resource struct {
        job handle:JOB;
        options uint32;
        process handle:PROCESS;
    }) -> (struct {
        status status;
    });
};
