Skip to content

Commit

Permalink
Add support for macOS
Browse files Browse the repository at this point in the history
  • Loading branch information
bjorn3 committed Nov 12, 2024
1 parent 84e6a56 commit cd51d74
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 22 deletions.
16 changes: 8 additions & 8 deletions .github/workflows/checks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,14 @@ jobs:
os: ubuntu-latest
features: ""
target: "x86_64-unknown-linux-gnu"
# - rust: "stable"
# os: macos-latest
# features: ""
# target: "x86_64-apple-darwin"
# - rust: "stable"
# os: macos-14
# features: ""
# target: "aarch64-apple-darwin"
- rust: "stable"
os: macos-latest
features: ""
target: "x86_64-apple-darwin"
- rust: "stable"
os: macos-14
features: ""
target: "aarch64-apple-darwin"
# - rust: stable-x86_64-gnu
# os: windows-2022
# features: ""
Expand Down
15 changes: 10 additions & 5 deletions bzip2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,17 @@ use libbzip2_rs_sys::{
use libc::{
_exit, close, exit, fclose, fdopen, ferror, fflush, fgetc, fileno, fopen, fread, fwrite, open,
perror, remove, rewind, signal, stat, strcat, strcmp, strlen, strncpy, ungetc, utimbuf, write,
FILE,
FILE, O_CREAT, O_EXCL, O_WRONLY, S_IRUSR, S_IWUSR,
};

// FIXME remove this
extern "C" {
#[cfg_attr(target_os = "macos", link_name = "__stdinp")]
static mut stdin: *mut FILE;
#[cfg_attr(target_os = "macos", link_name = "__stdoutp")]
static mut stdout: *mut FILE;
}

type Bool = libc::c_uchar;

type IntNative = libc::c_int;
Expand Down Expand Up @@ -907,8 +912,8 @@ unsafe fn fileExists(name: *mut c_char) -> Bool {
unsafe fn fopen_output_safely(name: *mut c_char, mode: *const libc::c_char) -> *mut FILE {
let fh = open(
name,
0o1 as libc::c_int | 0o100 as libc::c_int | 0o200 as libc::c_int,
0o200 as libc::c_int | 0o400 as libc::c_int,
O_WRONLY | O_CREAT | O_EXCL,
S_IWUSR as libc::c_uint | S_IRUSR as libc::c_uint,
);
if fh == -1 as libc::c_int {
return std::ptr::null_mut::<FILE>();
Expand Down Expand Up @@ -971,13 +976,13 @@ unsafe fn countHardLinks(name: *mut c_char) -> i32 {

#[cfg(unix)]
fn count_hardlinks(path: &Path) -> u64 {
use std::os::linux::fs::MetadataExt;
use std::os::unix::fs::MetadataExt;

let Ok(metadata) = path.metadata() else {
return 0;
};

metadata.st_nlink().saturating_sub(1)
metadata.nlink().saturating_sub(1)
}

#[cfg(not(unix))]
Expand Down
3 changes: 2 additions & 1 deletion bzip2recover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,8 @@ fn main_help(program_name: &Path, in_filename: &Path) -> Result<(), Error> {
options.write(true).create(true);

#[cfg(unix)]
options.mode(libc::S_IWUSR | libc::S_IRUSR);
#[allow(clippy::unnecessary_cast)]
options.mode(libc::S_IWUSR as u32 | libc::S_IRUSR as u32);

#[cfg(unix)]
options.custom_flags(libc::O_EXCL);
Expand Down
7 changes: 5 additions & 2 deletions bzlib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ use crate::decompress::{self, decompress};
use crate::libbzip2_rs_sys_version;
use crate::BZ_MAX_UNUSED;

// FIXME remove this
extern "C" {
static stdin: *mut FILE;
static stdout: *mut FILE;
#[cfg_attr(target_os = "macos", link_name = "__stdinp")]
static mut stdin: *mut FILE;
#[cfg_attr(target_os = "macos", link_name = "__stdoutp")]
static mut stdout: *mut FILE;
}

pub(crate) const BZ_MAX_ALPHA_SIZE: usize = 258;
Expand Down
16 changes: 10 additions & 6 deletions tests/quick.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1594,29 +1594,33 @@ mod compress_command {
#[test]
#[cfg(unix)]
fn io_error() {
use std::os::fd::FromRawFd;

let mut cmd = command();

let tmpdir = tempfile::tempdir().unwrap();

let sample1_ref = tmpdir.path().join("sample1.ref");
std::fs::copy("tests/input/quick/sample1.ref", &sample1_ref).unwrap();

let (master, tty) = unsafe { setup_custom_tty() };

// dropping here triggers an IO error down the line
drop(master);
let mut pair = [0; 2];
unsafe {
assert_eq!(libc::pipe(&mut pair as *mut [i32; 2] as *mut i32), 0);
// closing the read side here triggers an IO error down the line
assert_eq!(libc::close(pair[0]), 0);
}

expect_failure!(
cmd.arg("-z")
.arg("-c")
.arg("-k")
.arg(&sample1_ref)
.stdout(tty),
.stdout(unsafe { Stdio::from_raw_fd(pair[1]) }),
format!(
concat!(
"\n",
"bzip2: I/O or other error, bailing out. Possible reason follows.\n",
"bzip2: Input/output error\n",
"bzip2: Broken pipe\n",
"\tInput file = {in_file}, output file = (stdout)\n",
""
),
Expand Down

0 comments on commit cd51d74

Please sign in to comment.