Skip to content

🍎 πŸ“ Rust bindings to `sysdir` API on Apple platforms

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

artichoke/sysdir-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

sysdir-rs

GitHub Actions Discord Twitter
Crate API API trunk

Enumeration of the filesystem paths for the various standard system directories where apps, resources, etc. get installed.

This crate exposes Rust bindings to the sysdir(3) library functions provided by libSystem.dylib on macOS, iOS, tvOS, and watchOS.

The sysdir API first appeared in OS X 10.12, iOS 10, watchOS 3 and tvOS 10 replacing the deprecated NSSystemDirectories(3) API.

Usage

Add this to your Cargo.toml:

[dependencies]
sysdir = "1.2.2"

Then resolve well-known directories like this:

use core::ffi::{c_char, CStr};

use sysdir::*;

let mut path = [0; PATH_MAX as usize];

let dir = sysdir_search_path_directory_t::SYSDIR_DIRECTORY_USER;
let domain_mask = SYSDIR_DOMAIN_MASK_LOCAL;

unsafe {
    let mut state = sysdir_start_search_path_enumeration(dir, domain_mask);
    loop {
        let path = path.as_mut_ptr().cast::<c_char>();
        state = sysdir_get_next_search_path_enumeration(state, path);
        if state == 0 {
            break;
        }
        let path = CStr::from_ptr(path);
        let s = path.to_str().unwrap();
        assert_eq!(s, "/Users");
    }
}

You can test this crate works on your platform by running the example:

cargo run --example enumerate_system_dirs

Implementation

sysdir-rs binds directly to libSystem with vendored bindings generated by bindgen. This crate has no dependencies other than libSystem.

Note that this crate is completely empty on non-Apple platforms.

no_std

sysdir-rs is no_std and only requires core.

Minimum Supported Rust Version

This crate requires at least Rust 1.64.0. This version can be bumped in minor releases.

License

sysdir-rs is distributed under the terms of either the MIT License or the Apache License (Version 2.0).