Skip to content

Commit

Permalink
feat(free-bsd): first-class support for FreeBSD (#50)
Browse files Browse the repository at this point in the history
Add FreeBSD support.

Add support for FreeBSD and other BSDs.
Testing was only done using FreeBSD.
  • Loading branch information
surban authored Mar 25, 2024
1 parent 86978f6 commit 4984f64
Show file tree
Hide file tree
Showing 10 changed files with 184 additions and 20 deletions.
114 changes: 114 additions & 0 deletions .cirrus.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
############################################################################
# Cirrus workflow for testing on (Free)BSD.
#
# References:
# - https://cirrus-ci.org/guide/writing-tasks/
# - https://github.com/tokio-rs/tokio/blob/master/.cirrus.yml
# - https://github.com/nix-rust/nix/blob/master/.cirrus.yml
# - https://github.com/jakewilliami/HiddenFiles.jl/blob/master/.cirrus.yml
#
# TODO:
# - Implement tests for other BSD OS's (will need to handle setup
# differently for Tier 3 support OS's)
############################################################################

# Specify container (FreeBSD)
#
# References:
# - https://cirrus-ci.org/guide/writing-tasks/#execution-environment
# - https://cirrus-ci.org/guide/FreeBSD/
freebsd_instance:
image: freebsd-13-1-release-amd64

# Set up environment variables
env:
# The minimum supported Rust version (MSRV)
# https://github.com/foresterre/cargo-msrv
TOOLCHAIN: 1.56.1

# Define set up procedure by downloading Rustup (to consume later)
setup_common: &SETUP
setup_script:
- kldload mqueuefs
- fetch https://sh.rustup.rs -o rustup.sh
- sh rustup.sh -y --profile=minimal --default-toolchain $TOOLCHAIN
- rm rustup.sh
- . $HOME/.cargo/env || true
- rustup --version
- cargo -Vv
- rustc -Vv
- ifconfig

# Cache the Cargo directory between runs
cargo_cache:
folder: $CARGO_HOME/registry
fingerprint_script: cat Cargo.lock || echo ""

# Test Cargo Build
task:
name: "Builds on FreeBSD 13"
<<: *SETUP
env:
RUSTFLAGS: "-D warnings"
test_script:
- . $HOME/.cargo/env || true
- cargo +$TOOLCHAIN build --release --all-targets
before_cache_script: rm -rf $CARGO_HOME/registry/index

# Run Unit Tests
task:
name: "Runs \"cargo test\" on FreeBSD 13"
<<: *SETUP
env:
RUSTFLAGS: "-D warnings"
RUSTDOCFLAGS: -D warnings
test_script:
- . $HOME/.cargo/env || true
- cargo +$TOOLCHAIN test --all --all-features -- --nocapture
- cargo +$TOOLCHAIN doc --no-deps
before_cache_script: rm -rf $CARGO_HOME/registry/index

# Run example
task:
name: "Runs \"cargo run --example demo\" on FreeBSD 13"
<<: *SETUP
env:
RUSTFLAGS: "-D warnings"
RUSTDOCFLAGS: -D warnings
test_script:
- . $HOME/.cargo/env || true
- cargo +$TOOLCHAIN run --example demo --all-features
before_cache_script: rm -rf $CARGO_HOME/registry/index

# Test Cargo Clippy
task:
name: "Runs \"cargo clippy\" on FreeBSD 13"
<<: *SETUP
install_script:
- . $HOME/.cargo/env || true
- rustup component add --toolchain $TOOLCHAIN clippy
test_script:
- . $HOME/.cargo/env || true
- cargo +$TOOLCHAIN clippy --all-targets
before_cache_script: rm -rf $CARGO_HOME/registry/index

# Test Cargo Fmt
task:
name: "Runs \"cargo fmt\" on FreeBSD 13"
<<: *SETUP
install_script:
- . $HOME/.cargo/env || true
- rustup +$TOOLCHAIN component add rustfmt
test_script:
- . $HOME/.cargo/env || true
- cargo +$TOOLCHAIN fmt --all -- --check
before_cache_script: rm -rf $CARGO_HOME/registry/index

# Test Cargo Publish
task:
name: "Runs \"cargo publish --dry-run\" on FreeBSD 13"
<<: *SETUP
test_script:
- . $HOME/.cargo/env || true
- cargo +$TOOLCHAIN publish --dry-run
before_cache_script: rm -rf $CARGO_HOME/registry/index
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "network-interface"
description = "Retrieve system's Network Interfaces on Linux, macOS and Windows on a standarized manner"
description = "Retrieve system's Network Interfaces on Linux, FreeBSD, macOS and Windows on a standarized manner"
version = "1.1.1"
repository = "https://github.com/EstebanBorai/network-interface"
categories = ["web-programming", "network-programming"]
Expand All @@ -19,10 +19,10 @@ thiserror = "1.0"
[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies]
libc = "0.2.101"

[target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies]
[target.'cfg(any(target_os = "ios", target_os = "macos", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonfly"))'.dependencies]
libc = "0.2.101"

[target.'cfg(target_os = "macos")'.build-dependencies]
[target.'cfg(any(target_os = "macos", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonfly"))'.build-dependencies]
cc = "1.0.73"

[target.'cfg(target_os = "windows")'.dependencies]
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<div>
<h1 align="center">network-interface</h1>
<h4 align="center">
Retrieve system's Network Interfaces/Adapters on Android, Linux, macOS, iOS and Windows
Retrieve system's Network Interfaces/Adapters on Android, FreeBSD, Linux, macOS, iOS and Windows
on a standarized manner
</h4>
</div>
Expand Down
28 changes: 24 additions & 4 deletions build.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,37 @@
fn main() {
#[cfg(any(target_os = "macos", target_os = "ios"))]
#[cfg(any(
target_os = "macos",
target_os = "ios",
target_os = "freebsd",
target_os = "openbsd",
target_os = "netbsd",
target_os = "dragonfly"
))]
{
use cc::Build;
use std::path::Path;
const TARGET_MACOS: &str = "macos";
const TARGET_IOS: &str = "ios";
const TARGET_FREEBSD: &str = "freebsd";
const TARGET_OPENBSD: &str = "openbsd";
const TARGET_NETBSD: &str = "netbsd";
const TARGET_DRAGONFLY: &str = "dragonfly";

// check cross-compile target. Only build lladdr.o when actually targeting macOS.
// check cross-compile target. Only build lladdr.o when actually targeting UNIX.
let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
if [TARGET_MACOS, TARGET_IOS].contains(&target_os.as_str()) {
if [
TARGET_MACOS,
TARGET_IOS,
TARGET_FREEBSD,
TARGET_OPENBSD,
TARGET_NETBSD,
TARGET_DRAGONFLY,
]
.contains(&target_os.as_str())
{
let path = Path::new("src")
.join("target")
.join("apple")
.join("unix")
.join("ffi")
.join("lladdr.c");

Expand Down
6 changes: 0 additions & 6 deletions src/target/apple/ffi/mod.rs

This file was deleted.

22 changes: 18 additions & 4 deletions src/target/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,25 @@ mod linux;
#[cfg(any(target_os = "android", target_os = "linux"))]
pub use linux::*;

Check warning on line 5 in src/target/mod.rs

View workflow job for this annotation

GitHub Actions / Runs "cargo test" on ubuntu-latest

unused import: `linux::*`

Check failure on line 5 in src/target/mod.rs

View workflow job for this annotation

GitHub Actions / Runs "cargo clippy" on ubuntu-latest

unused import: `linux::*`

#[cfg(any(target_os = "macos", target_os = "ios"))]
mod apple;
#[cfg(any(
target_os = "macos",
target_os = "ios",
target_os = "freebsd",
target_os = "openbsd",
target_os = "netbsd",
target_os = "dragonfly"
))]
mod unix;

#[cfg(any(target_os = "macos", target_os = "ios"))]
pub use apple::*;
#[cfg(any(
target_os = "macos",
target_os = "ios",
target_os = "freebsd",
target_os = "openbsd",
target_os = "netbsd",
target_os = "dragonfly"
))]
pub use unix::*;

#[cfg(target_os = "windows")]
mod windows;
Expand Down
File renamed without changes.
13 changes: 13 additions & 0 deletions src/target/unix/ffi/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
use libc::ifaddrs;

#[cfg(any(
target_os = "macos",
target_os = "ios",
target_os = "freebsd",
target_os = "openbsd",
target_os = "netbsd",
target_os = "dragonfly"
))]
extern "C" {
pub fn lladdr(ptr: *mut ifaddrs) -> *const u8;
}
File renamed without changes.
13 changes: 11 additions & 2 deletions src/utils/mod.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,26 @@
#[cfg(windows)]
pub mod hex;

#[cfg(any(
target_os = "android",
target_os = "linux",
target_os = "ios",
target_os = "macos"
target_os = "macos",
target_os = "freebsd",
target_os = "openbsd",
target_os = "netbsd",
target_os = "dragonfly"
))]
mod unix;

#[cfg(any(
target_os = "android",
target_os = "linux",
target_os = "ios",
target_os = "macos"
target_os = "macos",
target_os = "freebsd",
target_os = "openbsd",
target_os = "netbsd",
target_os = "dragonfly"
))]
pub use unix::*;

0 comments on commit 4984f64

Please sign in to comment.