ptools 0.2.23

Utilities for inspecting Linux processes
//
//   Copyright (c) 2026 Basil Crow
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//

use std::env;
use std::fs::File;
use std::thread;
use std::time::Duration;

fn allow_ptrace_for_tests() {
    // On Linux with Yama ptrace_scope=1 (the Ubuntu default), only a
    // process's descendants may ptrace it.  Since the test harness spawns
    // this process and the ptool as siblings, we opt in to tracing by any
    // process so the tests work without elevated privileges.
    unsafe {
        nix::libc::prctl(
            nix::libc::PR_SET_PTRACER,
            nix::libc::PR_SET_PTRACER_ANY,
            0,
            0,
            0,
        );
    }
}

fn main() {
    allow_ptrace_for_tests();

    let signal_path =
        env::var("PTOOLS_TEST_READY_FILE").expect("PTOOLS_TEST_READY_FILE must be set");

    // Signal parent process (the test process) that this process is ready to be observed by the
    // ptool being tested.
    File::create(signal_path).unwrap();

    // Wait for the parent to finish running the ptool and then kill us.
    loop {
        thread::sleep(Duration::from_millis(100));
    }
}