io_engine/buffer/
utils.rs

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