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::fs::{self};
use std::io::Seek;
use std::io::SeekFrom;
use std::io::Write;
use std::os::unix::fs::symlink;
use std::thread;
use std::time::Duration;

use nix::fcntl::open;
use nix::fcntl::OFlag;
use nix::sys::stat::Mode;

fn main() {
    let signal_path =
        env::var("PTOOLS_TEST_READY_FILE").expect("PTOOLS_TEST_READY_FILE must be set");
    let tmp_file_path = env::args()
        .nth(1)
        .expect("matrix file path argument must be provided");
    let symlink_path = env::args()
        .nth(2)
        .expect("matrix link path argument must be provided");

    let mut tmp_file = File::create(&tmp_file_path).unwrap();
    writeln!(tmp_file, "ptools").unwrap();
    tmp_file.seek(SeekFrom::Start(3)).unwrap();

    let _ = fs::remove_file(&symlink_path);
    symlink(&tmp_file_path, &symlink_path).unwrap();
    let symlink_fd = open(
        &*symlink_path,
        OFlag::O_PATH | OFlag::O_NOFOLLOW | OFlag::O_CLOEXEC,
        Mode::empty(),
    )
    .unwrap();

    File::create(signal_path).unwrap();

    let _keep_alive = (tmp_file, symlink_fd);
    loop {
        thread::sleep(Duration::from_millis(100));
    }
}