Sha256: 94e044de47b0f00eb0c2aea3fb21001ac2b9aa1e4b20d73fd54163fe92fa63f7

Contents?: true

Size: 1.38 KB

Versions: 30

Compression:

Stored size: 1.38 KB

Contents

use core::cmp;
use core::convert::TryFrom;
use crate::error::*;
use crate::flag::*;

/// Helper for seek calls
/// In most cases it's easier to use a usize to track the offset and buffer size internally,
/// but the seek interface uses isize.  This wrapper ensures EOVERFLOW errors are returned
/// as appropriate if the value in the usize can't fit in the isize.
pub fn calc_seek_offset_usize(cur_offset: usize, pos: isize, whence: usize, buf_len: usize) -> Result<isize> {
    let cur_offset = isize::try_from(cur_offset).or_else(|_| Err(Error::new(EOVERFLOW)))?;
    let buf_len = isize::try_from(buf_len).or_else(|_| Err(Error::new(EOVERFLOW)))?;
    calc_seek_offset_isize(cur_offset, pos, whence, buf_len)
}

/// Helper for seek calls
/// Result is guaranteed to be positive.
/// EOVERFLOW returned if the arguments would cause an overflow.
/// EINVAL returned if the new offset is out of bounds.
pub fn calc_seek_offset_isize(cur_offset: isize, pos: isize, whence: usize, buf_len: isize) -> Result<isize> {
    let new_offset = match whence {
        SEEK_CUR => pos.checked_add(cur_offset),
        SEEK_END => pos.checked_add(buf_len),
        SEEK_SET => Some(pos),
        _ => None,
    };

    match new_offset {
        Some(new_offset) if new_offset < 0 => Err(Error::new(EINVAL)),
        Some(new_offset) => Ok(cmp::min(new_offset, buf_len)),
        None => Err(Error::new(EOVERFLOW))
    }
}

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
wasmtime-23.0.2 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-22.0.0 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-21.0.1 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-20.0.2 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-20.0.0 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-18.0.3 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-17.0.1 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-17.0.0 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-16.0.0 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-15.0.1 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-15.0.0 ./ext/cargo-vendor/redox_syscall-0.4.1/src/scheme/seek.rs
wasmtime-14.0.4 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs
wasmtime-14.0.3 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs
wasmtime-14.0.1 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs
wasmtime-14.0.0 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs
wasmtime-13.0.0 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs
wasmtime-12.0.1 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs
wasmtime-12.0.0 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs
wasmtime-11.0.0 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs
wasmtime-10.0.1 ./ext/cargo-vendor/redox_syscall-0.2.16/src/scheme/seek.rs