io_buffer/
utils.rs

1use rand::{Rng, distr::Alphanumeric, rng};
2
3extern crate libc;
4
5/// safe_copy regardless the size of buffer.
6#[inline]
7pub fn safe_copy(dst: &mut [u8], src: &[u8]) -> usize {
8    let len = dst.len();
9    let other_len = src.len();
10    if other_len > len {
11        dst.copy_from_slice(&src[0..len]);
12        return len;
13    } else if other_len < len {
14        dst[0..other_len].copy_from_slice(src);
15        return other_len;
16    } else {
17        dst.copy_from_slice(src);
18        return len;
19    }
20}
21
22/// Set a buffer to zero
23#[inline(always)]
24pub fn set_zero(dst: &mut [u8]) {
25    unsafe {
26        libc::memset(dst.as_mut_ptr() as *mut libc::c_void, 0, dst.len());
27    }
28}
29
30/// Produce ascii random string
31#[inline]
32pub fn rand_buffer<T: AsMut<[u8]>>(dst: &mut T) {
33    let s: &mut [u8] = dst.as_mut();
34    let len = s.len();
35    let mut rng = rng();
36    for i in 0..len {
37        s[i] = rng.sample(Alphanumeric) as u8;
38    }
39}
40
41/// Test whether a buffer is all set to zero
42#[inline(always)]
43pub fn is_all_zero(s: &[u8]) -> bool {
44    for c in s {
45        if *c != 0 {
46            return false;
47        }
48    }
49    true
50}
51
52#[cfg(test)]
53mod tests {
54
55    extern crate md5;
56    use super::*;
57
58    #[test]
59    fn test_safe_copy() {
60        let buf1: [u8; 10] = [0; 10];
61        let mut buf2: [u8; 10] = [1; 10];
62        let mut buf3: [u8; 10] = [2; 10];
63        let zero: usize = 0;
64        // dst zero size copy should be protected
65        assert_eq!(0, safe_copy(&mut buf2[0..zero], &buf3));
66        assert_eq!(&buf2, &[1; 10]);
67        assert_eq!(0, safe_copy(&mut buf2[10..], &buf3));
68        assert_eq!(&buf2, &[1; 10]);
69        // src zero size copy should be protected
70
71        // src zero size copy ?
72        assert_eq!(10, safe_copy(&mut buf2, &buf1));
73        assert_eq!(buf1, buf2);
74        assert_eq!(5, safe_copy(&mut buf2[5..], &buf3));
75        assert_eq!(buf1[0..5], buf2[0..5]);
76        assert_eq!(buf2[5..], buf3[5..]);
77        assert_eq!(5, safe_copy(&mut buf3[0..5], &buf1));
78        assert_eq!(buf2, buf3);
79    }
80
81    #[test]
82    fn test_rand_buffer() {
83        let mut buf1: [u8; 10] = [0; 10];
84        let mut buf2: [u8; 10] = [0; 10];
85        rand_buffer(&mut buf1);
86        rand_buffer(&mut buf2);
87        assert!(md5::compute(&buf1) != md5::compute(&buf2));
88    }
89
90    #[test]
91    fn test_set_zero() {
92        let mut buf1: [u8; 10] = [1; 10];
93        set_zero(&mut buf1);
94        for i in &buf1 {
95            assert_eq!(*i, 0)
96        }
97    }
98}