11 个版本 (6 个重大更改)

0.7.0 2024年5月30日
0.6.1 2023年11月27日
0.6.0 2023年10月9日
0.5.2 2022年7月14日
0.1.1 2021年5月18日

#2 in #uplink

每月38次下载
用于 uplink

Apache-2.0

25MB
4K SLoC

Go 2.5K SLoC // 0.2% comments C 1.5K SLoC // 0.0% comments Rust 76 SLoC // 0.3% comments Shell 24 SLoC // 0.4% comments

包含 (静态库, 14MB) .docs-rs/libuplink.a, (ELF 库, 11MB) .docs-rs/libuplink.so

uplink-sys

CI Status Crates.io docs.rs Crates.io

此软件包通过 bindgen 提供,为 uplink-c 中的 C 函数提供自动生成的非安全 Rust 绑定,uplink-c 是 Storj uplink API 库的 C 接口。

构建(从仓库)

Linux

  • 安装 Go
  • 安装 Rust
  • 安装 GCC 和 make sudo apt install build-essential
  • 安装 libclang(bindgen 生成平台特定 c 绑定所需)sudo apt install libclang-dev
  • 检出此仓库
  • 构建软件包 make build(从 uplink-sys 目录)

macOS

  • 安装 Go
  • 安装 Rust
  • 检出此仓库
  • 构建软件包 make build(从 uplink-sys 目录)

构建(从 crates.io)

Linux

  • 安装 Go
  • 安装 libclang(bindgen 生成平台特定 c 绑定所需)
  • uplink-sys 添加到 Cargo.toml

测试

注意 已在以下操作系统上测试了此项目

* 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

设置

为了允许集成测试访问测试项目,在此目录中创建一个包含运行测试所需的卫星地址和 API 密钥的文件。不要将此文件提交到仓库。 test_secrets.txt

<satellite_addresss>
<api_key>

运行

maketest

用法

查看 示例目录 以了解如何使用 uplink-sys 软件包。

以下是一个示例,说明如何使用软件包的未经安全检查的 C 绑定列出存储桶。

// 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 {
        println!(
            "Invalid bucket iterator. Error: {:?}.",
            *p_bucket_iterator_err
        );
    }

    // 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)
            .to_str()
            .expect("Invalid bucket name C string.");
        let created = datetime_string_from_unix_time((*p_bucket_result).created);

        println!(
            "Bucket {} => name: {}, created: {}",
            bucket_count, bucket_name, created
        );

        // Free memory
        uplink_sys::uplink_free_bucket(p_bucket_result);
    }

    // Free memory
    uplink_sys::uplink_free_access_result(access_result);
    uplink_sys::uplink_free_project_result(project_result);
    uplink_sys::uplink_free_bucket_iterator(p_bucket_iterator);
    uplink_sys::uplink_free_error(p_bucket_iterator_err);
}

依赖项