uplink-sys 0.5.0

Unsafe rust bindings for libuplink - the storj protocol library.
docs.rs failed to build uplink-sys-0.5.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: uplink-sys-0.5.2


Actions Status Crates.io

This crate provides auto-generated unsafe Rust bindings, through bindgen, to C functions provided by uplink-c, the C interface for the Storj uplink API library.

Building (from repo)


  • Install Go
  • Install Rust
  • Install GCC and make sudo apt install build-essential
  • Install libclang (required by bindgen for generating platform specific c bindings) sudo apt install libclang-dev
  • Checkout this repo
  • Build crate make build (from uplink-sys directory)


  • Install Go
  • Install Rust
  • Checkout this repo
  • Build crate make build (from uplink-sys directory)

Building (from crates.io) (TODO ONCE CRATE IS PUBLISHED)


  • Install Go
  • Install libclang (required by bindgen for generating platform specific c bindings)
  • Add uplink-sys to Cargo.toml


NOTE the project has been tested on the following operating systems:

* ubuntu
	* Version: 20.04.2 LTS
	* Processor: Intel® Core™ i7-10510U CPU @ 1.80GHz × 8
* macOS
	* Version: 10.15.7
	* Processor: 2.6 GHz 6-Core Intel Corei7


To allow the integrations tests access to the test project, create a file in this directory with the satellite address and api key for running tests. Do not commit this file to the repo. test_secrets.txt:



make test


See the examples directory to see how use the uplink-sys crate.

Below is an example showing how to list buckets using the crate's unsafe C bindings.

// Access parameters
let satellite_address = CString::new("SATELLITE ADDRESS HERE").expect("CString::new failed");
let api_key = CString::new("API KEY HERE").expect("CString::new failed");
let passphrase = CString::new("PASSPHRASE HERE").expect("CString::new failed");

unsafe {
    // Request access
    let access_result = uplink_sys::uplink_request_access_with_passphrase(
        satellite_address.as_ptr() as *mut uplink_sys::uplink_const_char,
        api_key.as_ptr() as *mut uplink_sys::uplink_const_char,
        passphrase.as_ptr() as *mut uplink_sys::uplink_const_char,
    if access_result.error != std::ptr::null_mut() {
        println!("Error requesting access: {:?}", *(access_result.error));

    // Access project
    let project_result = uplink_sys::uplink_open_project(access_result.access);
    if project_result.error != std::ptr::null_mut() {
        println!("Error accessing project: {:?}", *(project_result.error));

    // Create empty string for bucket option struct
    let bucket_options_str = CString::new("").expect("CString::new failed");
    let mut bucket_options = uplink_sys::UplinkListBucketsOptions {
        cursor: bucket_options_str.as_ptr(),

    // Request bucket iterator
    let p_bucket_iterator =
        uplink_sys::uplink_list_buckets(project_result.project, &mut bucket_options);

    // Check for valid bucket iterator
    let p_bucket_iterator_err = uplink_sys::uplink_bucket_iterator_err(p_bucket_iterator);
    if p_bucket_iterator_err == std::ptr::null_mut() {
        println!("Valid bucket iterator.");
    } else {
            "Invalid bucket iterator. Error: {:?}.",

    // Iterate through all buckets
    let mut bucket_count = 0;
    while uplink_sys::uplink_bucket_iterator_next(p_bucket_iterator) {
        bucket_count += 1;

        let p_bucket_result = uplink_sys::uplink_bucket_iterator_item(p_bucket_iterator);
        let bucket_name = CStr::from_ptr((*p_bucket_result).name)
            .expect("Invalid bucket name C string.");
        let created = datetime_string_from_unix_time((*p_bucket_result).created);

            "Bucket {} => name: {}, created: {}",
            bucket_count, bucket_name, created

        // Free memory

    // Free memory