Skip to content

Commit

Permalink
Add acct(2) wrapper API
Browse files Browse the repository at this point in the history
This patch adds a wrapper for the acct(2) syscall, with two functions
for enabling and disabling process accounting.
  • Loading branch information
jabedude committed Oct 21, 2018
1 parent 9ed9a1d commit 0ce57d9
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -28,6 +28,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- Added support for `ptrace` on BSD operating systems ([#949](https://github.com/nix-rust/nix/pull/949))
- Added `ptrace` functions for reads and writes to tracee memory and ptrace kill
([#949](https://github.com/nix-rust/nix/pull/949))
- Added a `acct` wrapper module for enabling and disabling process accounting
([#952](https://github.com/nix-rust/nix/pull/952))

### Changed
- Increased required Rust version to 1.22.1/
Expand Down
25 changes: 25 additions & 0 deletions src/unistd.rs
Expand Up @@ -1508,6 +1508,31 @@ pub fn sleep(seconds: c_uint) -> c_uint {
unsafe { libc::sleep(seconds) }
}

pub mod acct {
use libc;
use {Result, NixPath};
use errno::Errno;
use std::ptr;

/// Enable process accounting
///
/// See also [acct(2)](https://linux.die.net/man/2/acct)
pub fn enable<P: ?Sized + NixPath>(filename: &P) -> Result<()> {
let res = try!(filename.with_nix_path(|cstr| {
unsafe { libc::acct(cstr.as_ptr()) }
}));

Errno::result(res).map(drop)
}

/// Disable process accounting
pub fn disable() -> Result<()> {
let res = unsafe { libc::acct(ptr::null()) };

Errno::result(res).map(drop)
}
}

/// Creates a regular file which persists even after process termination
///
/// * `template`: a path whose 6 rightmost characters must be X, e.g. `/tmp/tmpfile_XXXXXX`
Expand Down
27 changes: 24 additions & 3 deletions test/test_unistd.rs
Expand Up @@ -4,12 +4,13 @@ use nix::unistd::ForkResult::*;
use nix::sys::signal::{SaFlags, SigAction, SigHandler, SigSet, Signal, sigaction};
use nix::sys::wait::*;
use nix::sys::stat::{self, Mode, SFlag};
use std::{env, iter};
use std::{env, iter, thread, time};
use std::ffi::CString;
use std::fs::{self, File};
use std::fs::{self, File, metadata};
use std::io::Write;
use std::os::unix::prelude::*;
use tempfile::{self, tempfile};
use std::process::Command;
use tempfile::{self, tempfile, NamedTempFile};
use libc::{self, _exit, off_t};

#[test]
Expand Down Expand Up @@ -378,6 +379,26 @@ fn test_lseek64() {
close(tmpfd).unwrap();
}

// Skip on FreeBSD because FreeBSD's CI environment is jailed, and jails
// aren't allowed to use acct(2)
#[cfg(not(target_os = "freebsd"))]
#[test]
fn test_acct() {
skip_if_not_root!("test_acct");
let file = NamedTempFile::new().unwrap();
let path = file.path().to_str().unwrap();

acct::enable(path).unwrap();
Command::new("echo").arg("Hello world");
acct::disable().unwrap();

loop {
let len = metadata(path).unwrap().len();
if len > 0 { break; }
thread::sleep(time::Duration::from_millis(10));
}
}

#[test]
fn test_fpathconf_limited() {
let f = tempfile().unwrap();
Expand Down

0 comments on commit 0ce57d9

Please sign in to comment.