2
2
#![ allow( improper_ctypes) ]
3
3
4
4
use { Errno , Result } ;
5
- use libc:: { c_int, c_void, size_t, off_t} ;
5
+ use libc:: { self , c_int, c_void, size_t, off_t} ;
6
6
use std:: marker:: PhantomData ;
7
7
use std:: os:: unix:: io:: RawFd ;
8
8
9
- mod ffi {
10
- use super :: IoVec ;
11
- use libc:: { ssize_t, c_int, size_t, off_t, c_void} ;
12
- use std:: os:: unix:: io:: RawFd ;
13
-
14
- extern {
15
- // vectorized version of write
16
- // doc: http://man7.org/linux/man-pages/man2/writev.2.html
17
- pub fn writev ( fd : RawFd , iov : * const IoVec < & [ u8 ] > , iovcnt : c_int ) -> ssize_t ;
18
-
19
- // vectorized version of read
20
- // doc: http://man7.org/linux/man-pages/man2/readv.2.html
21
- pub fn readv ( fd : RawFd , iov : * const IoVec < & mut [ u8 ] > , iovcnt : c_int ) -> ssize_t ;
22
-
23
- // vectorized write at a specified offset
24
- // doc: http://man7.org/linux/man-pages/man2/pwritev.2.html
25
- #[ cfg( feature = "preadv_pwritev" ) ]
26
- pub fn pwritev ( fd : RawFd , iov : * const IoVec < & [ u8 ] > , iovcnt : c_int ,
27
- offset : off_t ) -> ssize_t ;
28
-
29
- // vectorized read at a specified offset
30
- // doc: http://man7.org/linux/man-pages/man2/preadv.2.html
31
- #[ cfg( feature = "preadv_pwritev" ) ]
32
- pub fn preadv ( fd : RawFd , iov : * const IoVec < & mut [ u8 ] > , iovcnt : c_int ,
33
- offset : off_t ) -> ssize_t ;
34
-
35
- // write to a file at a specified offset
36
- // doc: http://man7.org/linux/man-pages/man2/pwrite.2.html
37
- pub fn pwrite ( fd : RawFd , buf : * const c_void , nbyte : size_t ,
38
- offset : off_t ) -> ssize_t ;
39
-
40
- // read from a file at a specified offset
41
- // doc: http://man7.org/linux/man-pages/man2/pread.2.html
42
- pub fn pread ( fd : RawFd , buf : * mut c_void , nbyte : size_t , offset : off_t )
43
- -> ssize_t ;
44
- }
45
- }
46
-
47
9
pub fn writev ( fd : RawFd , iov : & [ IoVec < & [ u8 ] > ] ) -> Result < usize > {
48
- let res = unsafe { ffi :: writev ( fd, iov. as_ptr ( ) , iov. len ( ) as c_int ) } ;
10
+ let res = unsafe { libc :: writev ( fd, iov. as_ptr ( ) as * const libc :: iovec , iov. len ( ) as c_int ) } ;
49
11
50
12
Errno :: result ( res) . map ( |r| r as usize )
51
13
}
52
14
53
15
pub fn readv ( fd : RawFd , iov : & mut [ IoVec < & mut [ u8 ] > ] ) -> Result < usize > {
54
- let res = unsafe { ffi :: readv ( fd, iov. as_ptr ( ) , iov. len ( ) as c_int ) } ;
16
+ let res = unsafe { libc :: readv ( fd, iov. as_ptr ( ) as * const libc :: iovec , iov. len ( ) as c_int ) } ;
55
17
56
18
Errno :: result ( res) . map ( |r| r as usize )
57
19
}
@@ -60,7 +22,7 @@ pub fn readv(fd: RawFd, iov: &mut [IoVec<&mut [u8]>]) -> Result<usize> {
60
22
pub fn pwritev ( fd : RawFd , iov : & [ IoVec < & [ u8 ] > ] ,
61
23
offset : off_t ) -> Result < usize > {
62
24
let res = unsafe {
63
- ffi :: pwritev ( fd, iov. as_ptr ( ) , iov. len ( ) as c_int , offset)
25
+ libc :: pwritev ( fd, iov. as_ptr ( ) as * const libc :: iovec , iov. len ( ) as c_int , offset)
64
26
} ;
65
27
66
28
Errno :: result ( res) . map ( |r| r as usize )
@@ -70,15 +32,15 @@ pub fn pwritev(fd: RawFd, iov: &[IoVec<&[u8]>],
70
32
pub fn preadv ( fd : RawFd , iov : & mut [ IoVec < & mut [ u8 ] > ] ,
71
33
offset : off_t ) -> Result < usize > {
72
34
let res = unsafe {
73
- ffi :: preadv ( fd, iov. as_ptr ( ) , iov. len ( ) as c_int , offset)
35
+ libc :: preadv ( fd, iov. as_ptr ( ) as * const libc :: iovec , iov. len ( ) as c_int , offset)
74
36
} ;
75
37
76
38
Errno :: result ( res) . map ( |r| r as usize )
77
39
}
78
40
79
41
pub fn pwrite ( fd : RawFd , buf : & [ u8 ] , offset : off_t ) -> Result < usize > {
80
42
let res = unsafe {
81
- ffi :: pwrite ( fd, buf. as_ptr ( ) as * const c_void , buf. len ( ) as size_t ,
43
+ libc :: pwrite ( fd, buf. as_ptr ( ) as * const c_void , buf. len ( ) as size_t ,
82
44
offset)
83
45
} ;
84
46
@@ -87,19 +49,15 @@ pub fn pwrite(fd: RawFd, buf: &[u8], offset: off_t) -> Result<usize> {
87
49
88
50
pub fn pread ( fd : RawFd , buf : & mut [ u8 ] , offset : off_t ) -> Result < usize > {
89
51
let res = unsafe {
90
- ffi :: pread ( fd, buf. as_mut_ptr ( ) as * mut c_void , buf. len ( ) as size_t ,
52
+ libc :: pread ( fd, buf. as_mut_ptr ( ) as * mut c_void , buf. len ( ) as size_t ,
91
53
offset)
92
54
} ;
93
55
94
56
Errno :: result ( res) . map ( |r| r as usize )
95
57
}
96
58
97
59
#[ repr( C ) ]
98
- pub struct IoVec < T > {
99
- iov_base : * mut c_void ,
100
- iov_len : size_t ,
101
- phantom : PhantomData < T >
102
- }
60
+ pub struct IoVec < T > ( libc:: iovec , PhantomData < T > ) ;
103
61
104
62
impl < T > IoVec < T > {
105
63
#[ inline]
@@ -108,29 +66,27 @@ impl<T> IoVec<T> {
108
66
109
67
unsafe {
110
68
slice:: from_raw_parts (
111
- self . iov_base as * const u8 ,
112
- self . iov_len as usize )
69
+ self . 0 . iov_base as * const u8 ,
70
+ self . 0 . iov_len as usize )
113
71
}
114
72
}
115
73
}
116
74
117
75
impl < ' a > IoVec < & ' a [ u8 ] > {
118
76
pub fn from_slice ( buf : & ' a [ u8 ] ) -> IoVec < & ' a [ u8 ] > {
119
- IoVec {
77
+ IoVec ( libc :: iovec {
120
78
iov_base : buf. as_ptr ( ) as * mut c_void ,
121
79
iov_len : buf. len ( ) as size_t ,
122
- phantom : PhantomData
123
- }
80
+ } , PhantomData )
124
81
}
125
82
}
126
83
127
84
impl < ' a > IoVec < & ' a mut [ u8 ] > {
128
85
pub fn from_mut_slice ( buf : & ' a mut [ u8 ] ) -> IoVec < & ' a mut [ u8 ] > {
129
- IoVec {
86
+ IoVec ( libc :: iovec {
130
87
iov_base : buf. as_ptr ( ) as * mut c_void ,
131
88
iov_len : buf. len ( ) as size_t ,
132
- phantom : PhantomData
133
- }
89
+ } , PhantomData )
134
90
}
135
91
}
136
92
0 commit comments