From 74cc46a2383db5538d7e0392e4b79b7287775e9b Mon Sep 17 00:00:00 2001 From: MaxVerevkin Date: Thu, 7 Sep 2023 00:47:28 +0300 Subject: hyprland again --- src/utils.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/utils.rs') diff --git a/src/utils.rs b/src/utils.rs index e45785f..211c6bb 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,8 +1,38 @@ //! Some usefull functions +use std::io; +use std::os::fd::{AsFd, AsRawFd}; + use serde::Deserialize; use serde_json::{Deserializer, Error as JsonError}; +/// Read from a raw file descriptor to the vector. +/// +/// Appends data at the end of the buffer. Resizes vector as needed. +#[allow(clippy::needless_pass_by_ref_mut)] +pub fn read_to_vec(fd: &mut impl AsFd, buf: &mut Vec) -> io::Result { + if buf.capacity() - buf.len() < 1024 { + buf.reserve(buf.capacity().max(1024)); + } + + let res = unsafe { + libc::read( + fd.as_fd().as_raw_fd(), + buf.as_mut_ptr().add(buf.len()) as *mut libc::c_void, + (buf.capacity() - buf.len()) as libc::size_t, + ) + }; + + if res == -1 { + return Err(io::Error::last_os_error()); + } + + let read = res as usize; + unsafe { buf.set_len(buf.len() + read) }; + + Ok(read) +} + /// Retuns (`last_line`, `remaining`). See tests for examples. pub fn last_line(s: &[u8]) -> Option<(&[u8], &[u8])> { let mut it = memchr::memrchr_iter(b'\n', s); -- cgit v1.3.1