Struct File

Source
pub struct File<Device = ()> { /* private fields */ }
Expand description

An encapsulated Linux file descriptor.

The methods of File are largely just thin wrappers around Linux system calls that work with file descriptors. Aside from type conversions to make the API safer and more ergonomic there are no additional userspace abstractions such as buffering.

When the std crate feature is enabled, a File also implements the std:io traits Read, Write, and Seek.

A File can have an optional Device type parameter, which if set to an implementation of IODevice enables the ioctl method to accept request constants that are declared as being compatible with that device. Otherwise, the ioctl method is unavailable.

Implementations§

Source§

impl File<()>

Source

pub fn open(path: &CStr, options: OpenOptions<OpenWithoutMode>) -> Result<Self>

Open an existing file.

Use this function for OpenOptions that don’t require a mode. If you set the “create” option then you will need to use Self::open_with_mode instead, to specify the mode of the new file.

Source

pub fn open_with_mode( path: &CStr, options: OpenOptions<OpenWithMode>, mode: mode_t, ) -> Result<Self>

Open a file, creating it if necessary using the given file mode.

Use this function only for OpenOptions that require a mode. For most options you can use Self::open instead.

Source

pub fn open_raw(path: &CStr, flags: int, mode: mode_t) -> Result<Self>

Open a file using the openat system call.

This function exposes the raw flags and mode arguments from the underlying system call, which the caller must populate appropriately.

Source

pub fn create_raw(path: &CStr, mode: mode_t) -> Result<Self>

Create a new file using the openat system call.

This function exposes the raw mode argument from the underlying system call, which the caller must populate appropriately.

Source

pub fn socket<Protocol: SocketProtocol>( domain: sa_family_t, typ: sock_type, protocol: Protocol, ) -> Result<File<Protocol::Device>>

Create a new socket using the socket system call.

The protocol is specifed as a special typed constant which carries both the protocol number expected by the kernel and the device type to use for the returned file, so the result can accept ioctl requests that are defined for that specific protocol.

Source

pub fn socket_raw<Protocol: SocketProtocol>( domain: sa_family_t, typ: sock_type, protocol: int, ) -> Result<File<SocketDevice>>

Create a new socket using the socket system call without automatically assigning a device type based on the protocol.

This is similar to Self::socket but allows specifying any arbitrary protocol number without needing a special implementation of super::socket::SocketProtocol. However, that means that the result will be typed only as a generic socket and so will not accept any protocol-specific ioctl requests.

Source§

impl<Device> File<Device>

Source

pub unsafe fn from_raw_fd(fd: int) -> Self

Wrap an existing raw file descriptor into a File.

Safety:

  • The given file descriptor must not belong to an active standard library file or any similar wrapping abstraction.
  • The file descriptor must remain open and valid for the full lifetime of the File object.
  • The same file descriptor must not be wrapped in instances of File, because the first one to be dropped will close the file descriptor.
Source

pub fn duplicate(&self) -> Result<Self>

Creates a new file descriptor referring to the same underlying file description as self.

Note that the read/write position of a file is a property of its file description rather than its descriptor, and so modifying the position (and some other aspects) of the new file will also affect the original.

Source

pub fn open_relative( &self, path: &CStr, options: OpenOptions<OpenWithoutMode>, ) -> Result<File<()>>

Open a file relative to the current file, which must represent a directory.

Source

pub fn open_relative_with_mode( &self, path: &CStr, options: OpenOptions<OpenWithMode>, mode: mode_t, ) -> Result<File<()>>

Open a file relative to the current file, which must represent a directory.

Source

pub fn open_relative_raw( &self, path: &CStr, flags: int, mode: mode_t, ) -> Result<File<()>>

Open a file using the openat system call.

This function exposes the raw flags and mode arguments from the underlying system call, which the caller must populate appropriately.

Source

pub fn fd(&self) -> int

Source

pub fn into_raw_fd(self) -> int

Consumes the file object and returns the underlying file descriptor without closing it.

Source

pub fn close(self) -> Result<()>

Consumes the file object and closes the underlying file descriptor.

If close fails then the file descriptor is always leaked, because there is no way to recover it once consumed.

Source

pub unsafe fn close_mut(&mut self) -> Result<()>

Closes the underlying file descriptor without consuming it.

Safety:

  • Callers must pass the file to core::mem::forget immediately after calling this function to prevent the implicit close in the Drop implementation.
  • Callers must not use the file object again after calling this method; file descriptor will either be dangling or will be referring to some other unrelated file.
Source

pub fn read(&self, buf: &mut [u8]) -> Result<usize>

Read some bytes from the file into the given buffer, returning the number of bytes that were read.

Source

pub unsafe fn read_raw(&self, buf: *mut void, count: size_t) -> Result<size_t>

A thin wrapper around the raw read system call against this file’s file descriptor.

Use File::read as a safe alternative.

Source

pub fn getdents<'a>(&self, buf: &'a mut [u8]) -> Result<DirEntries<'a>>

Read some directory entries from the directory into the given buffer, and obtain an iterator over those directory entries.

The caller must fully-consume the returned iterator; any items not retrieved will be lost.

Once the iterator is dropped the original buffer contains the raw directory entries returned from the kernel, and can be used again for a subsequent call to this function.

Source

pub fn getdents_all<'file, 'buf, TF, R>( &'file self, buf: &'buf mut [u8], transform: TF, ) -> AllDirEntries<'_, '_, TF, R, Device>
where TF: for<'tmp> FnMut(DirEntry<'tmp>) -> R, 'buf: 'file,

Read a transformation of every directory entry from the directory.

This wrapper around Self::getdents returns an iterator that can call Self::getdents multiple times to visit all of the entries in the directory.

However, since all of the calls to Self::getdents write into the same buffer buf it isn’t possible for the iterator to directly return the borrowed directory entries. Instead, each entry is passed to the given function transform, which must then return a representation of that entry that can outlive the buffer contents.

This admittedly-awkward compromise means that the caller can decide how and whether to allocate memory to retain ownership of the directory entry names, so that this crate can avoid imposing any particular opinion about that.

Source

pub unsafe fn getdents_raw( &self, buf: *mut void, buf_len: int, ) -> Result<size_t>

A thin wrapper around the raw getdents64 system call against this file’s file descriptor.

Use File::getdents as a more convenient alternative.

Read the content of the symbolic link that the file refers to.

This makes sense only for a file that was opened with the “path only” and “no follow symlinks” options.

Read the content of a symbolic link relative to the file, which must represent a directory.

Source

pub fn exists_relative(&self, path: &CStr) -> Result<bool>

Use a statx system call to determine whether a particular path exists relative to the file, which must represent a directory.

Source

pub fn seek(&self, pos: impl Into<SeekFrom>) -> Result<u64>

Change the current read/write position of the file.

Source

pub fn sync(&self) -> Result<()>

Tell the kernel to flush any in-memory buffers and caches for the file.

Source

pub fn write(&self, buf: &[u8]) -> Result<usize>

Write bytes from the given buffer to the file, returning how many bytes were written.

Source

pub unsafe fn write_raw( &self, buf: *const void, count: size_t, ) -> Result<size_t>

A thin wrapper around the raw write system call against this file’s file descriptor.

Use File::write as a safe alternative.

Source

pub fn fcntl<'a, Cmd: FcntlCmd<'a>>( &'a self, cmd: Cmd, arg: Cmd::ExtArg, ) -> Result<Cmd::Result>

Safe wrapper for the fcntl system call.

The safety of this wrapper relies on being passed only correct implementations of fcntl::FcntlCmd, some of which are predefined as constants in the fcntl module.

The type of the argument depends on which cmd you choose.

Source

pub unsafe fn fcntl_raw(&self, cmd: int, arg: impl AsRawV) -> Result<int>

Direct wrapper around the raw fcntl system call.

This system call is particularly unsafe because it interprets its last argument differently depending on the value of cmd. Self::fcntl provides a slightly safer abstraction around this operation.

Source

pub unsafe fn to_device<T: IoDevice>(self, devty: T) -> File<T>

Adds a device type parameter to the type of a file, allowing the Self::ioctl method to accept request constants that are compatible with that device type.

Safety:

  • Caller must guarantee that the underlying file descriptor really is representing a device of the given type, because the kernel has some overloaded ioctl request numbers that have different meaning depending on driver and using the wrong one can corrupt memory.
Source

pub unsafe fn ioctl_raw(&self, request: ulong, arg: impl AsRawV) -> Result<int>

Direct wrapper around the raw ioctl system call.

This system call is particularly unsafe because it interprets its last argument differently depending on the value of request. Self::ioctl provides a slightly safer abstraction around this operation.

Source

pub fn bind(&self, addr: impl SockAddr) -> Result<()>

Bind an address to a socket.

Source

pub unsafe fn bind_raw( &self, addr: *const sockaddr, addrlen: socklen_t, ) -> Result<()>

Bind an address to a socket using a raw pointer.

Source

pub fn connect(&self, addr: impl SockAddr) -> Result<()>

Initiate a connection on a socket.

Source

pub unsafe fn connect_raw( &self, addr: *const sockaddr, addrlen: socklen_t, ) -> Result<()>

Initiate a connection on a socket using a raw pointer.

Source

pub fn listen(&self, backlog: int) -> Result<()>

Listen for incoming connections on this socket.

Source

pub fn getsockopt<'a, O: GetSockOpt<'a>>(&self, opt: O) -> Result<O::Result>

Get a socket option for a file descriptor representing a socket.

The value for opt is typically a constant defined elsewhere in this crate, or possibly in another crate, which describes both the level and optname for the underlying call and the type of the result.

Source

pub unsafe fn getsockopt_raw( &self, level: int, optname: int, optval: *mut void, optlen: *mut socklen_t, ) -> Result<int>

Get a socket option for a file descriptor representing a socket using the raw arguments to the getsockopt system call.

Source

pub fn setsockopt<'a, O: SetSockOpt<'a>>( &self, opt: O, arg: O::ExtArg, ) -> Result<O::Result>

Set a socket option for a file descriptor representing a socket.

The value for opt is typically a constant defined elsewhere in this crate, or possibly in another crate, which describes both the level and optname for the underlying call and the type of the argument.

Source

pub unsafe fn setsockopt_raw( &self, level: int, optname: int, optval: *const void, optlen: socklen_t, ) -> Result<int>

Set a socket option for a file descriptor representing a socket using the raw arguments to the setsockopt system call.

Source

pub unsafe fn mmap_raw( &self, offset: off_t, length: size_t, addr: *mut void, prot: int, flags: int, ) -> Result<*mut void>

Map the file into memory using the mmap system call.

There is no safe wrapper for this because mapping a file into memory is inherently unsafe. Callers must take care to ensure they use the returned pointer in a safe way and to release the mapping with linux_unsafe::munmap when it’s no longer needed.

Source§

impl<Device: IoDevice> File<Device>

Files that have been marked as representing a particular device type using File::to_device can support ioctl requests that are designated for that device.

Source

pub fn ioctl<'a, ReqDevice: IoDevice, Req: IoctlReq<'a, ReqDevice>>( &'a self, request: Req, arg: Req::ExtArg, ) -> Result<Req::Result>
where Device: SubDevice<ReqDevice>,

Safe wrapper for the ioctl system call.

The safety of this wrapper relies on being passed only correct implementations of ioctl::IoctlReq, some of which are predefined as constants elsewhere in this crate, while others will appear in device-specific support crates.

The type of the argument depends on which request you choose. Some requests expect no argument, in which case you should pass ().

Trait Implementations§

Source§

impl<Device> AsFd for File<Device>

Available on crate feature std only.
Source§

fn as_fd(&self) -> BorrowedFd<'_>

Borrows the file descriptor. Read more
Source§

impl<Device> Debug for File<Device>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<Device> Drop for File<Device>

Source§

fn drop(&mut self)

Attempts to close the file when it’s no longer in scope.

This implicit close ignores errors, which might cause data loss if the final commit of data to disk fails. Use File::close explicitly if you need to detect errors.

Source§

impl From<OwnedFd> for File<()>

Available on crate feature std only.
Source§

fn from(value: OwnedFd) -> Self

Converts to this type from the input type.
Source§

impl FromFcntlResult for File

Source§

unsafe fn prepare_result(raw: int) -> Self

Source§

impl<Device: IoDevice> FromIoctlResult<i32> for File<Device>

Source§

fn from_ioctl_result(raw: &int) -> Self

Source§

impl<Device> Read for File<Device>

Available on crate feature std only.
Source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

Pull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: Read, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

impl<Device> Seek for File<Device>

Available on crate feature std only.
Source§

fn seek(&mut self, pos: SeekFrom) -> Result<u64>

Seek to an offset, in bytes, in a stream. Read more
1.55.0 · Source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
Source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.51.0 · Source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
1.80.0 · Source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

Seeks relative to the current position. Read more
Source§

impl<Device> Write for File<Device>

Available on crate feature std only.
Source§

fn write(&mut self, buf: &[u8]) -> Result<usize>

Writes a buffer into this writer, returning how many bytes were written. Read more
Source§

fn flush(&mut self) -> Result<()>

Flushes this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
1.36.0 · Source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

Like write, except that it writes from a slice of buffers. Read more
Source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored implementation. Read more
1.0.0 · Source§

fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

Attempts to write an entire buffer into this writer. Read more
Source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
1.0.0 · Source§

fn write_fmt(&mut self, args: Arguments<'_>) -> Result<(), Error>

Writes a formatted string into this writer, returning any error encountered. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adapter for this instance of Write. Read more
Source§

impl<T> Write for File<T>

File implements core::fmt::Write by passing UTF-8 encoded bytes directly to the write method.

Source§

fn write_str(&mut self, s: &str) -> Result

Writes a string slice into this writer, returning whether the write succeeded. Read more
1.1.0 · Source§

fn write_char(&mut self, c: char) -> Result<(), Error>

Writes a char into this writer, returning whether the write succeeded. Read more
1.0.0 · Source§

fn write_fmt(&mut self, args: Arguments<'_>) -> Result<(), Error>

Glue for usage of the write! macro with implementors of this trait. Read more

Auto Trait Implementations§

§

impl<Device> Freeze for File<Device>

§

impl<Device> RefUnwindSafe for File<Device>
where Device: RefUnwindSafe,

§

impl<Device> Send for File<Device>
where Device: Send,

§

impl<Device> Sync for File<Device>
where Device: Sync,

§

impl<Device> Unpin for File<Device>
where Device: Unpin,

§

impl<Device> UnwindSafe for File<Device>
where Device: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.