@@ -5,10 +5,11 @@ use super::err2io;
5
5
use crate :: io:: { self , IoSlice , IoSliceMut , SeekFrom } ;
6
6
use crate :: mem;
7
7
use crate :: net:: Shutdown ;
8
+ use crate :: os:: raw:: c_int;
8
9
9
10
#[ derive( Debug ) ]
10
11
pub struct WasiFd {
11
- fd : wasi :: Fd ,
12
+ fd : c_int ,
12
13
}
13
14
14
15
fn iovec < ' a > ( a : & ' a mut [ IoSliceMut < ' _ > ] ) -> & ' a [ wasi:: Iovec ] {
@@ -26,38 +27,38 @@ fn ciovec<'a>(a: &'a [IoSlice<'_>]) -> &'a [wasi::Ciovec] {
26
27
}
27
28
28
29
impl WasiFd {
29
- pub unsafe fn from_raw ( fd : wasi :: Fd ) -> WasiFd {
30
+ pub unsafe fn from_raw ( fd : c_int ) -> WasiFd {
30
31
WasiFd { fd }
31
32
}
32
33
33
- pub fn into_raw ( self ) -> wasi :: Fd {
34
+ pub fn into_raw ( self ) -> c_int {
34
35
let ret = self . fd ;
35
36
mem:: forget ( self ) ;
36
37
ret
37
38
}
38
39
39
- pub fn as_raw ( & self ) -> wasi :: Fd {
40
+ pub fn as_raw ( & self ) -> c_int {
40
41
self . fd
41
42
}
42
43
43
44
pub fn datasync ( & self ) -> io:: Result < ( ) > {
44
- unsafe { wasi:: fd_datasync ( self . fd ) . map_err ( err2io) }
45
+ unsafe { wasi:: fd_datasync ( self . fd as wasi :: Fd ) . map_err ( err2io) }
45
46
}
46
47
47
48
pub fn pread ( & self , bufs : & mut [ IoSliceMut < ' _ > ] , offset : u64 ) -> io:: Result < usize > {
48
- unsafe { wasi:: fd_pread ( self . fd , iovec ( bufs) , offset) . map_err ( err2io) }
49
+ unsafe { wasi:: fd_pread ( self . fd as wasi :: Fd , iovec ( bufs) , offset) . map_err ( err2io) }
49
50
}
50
51
51
52
pub fn pwrite ( & self , bufs : & [ IoSlice < ' _ > ] , offset : u64 ) -> io:: Result < usize > {
52
- unsafe { wasi:: fd_pwrite ( self . fd , ciovec ( bufs) , offset) . map_err ( err2io) }
53
+ unsafe { wasi:: fd_pwrite ( self . fd as wasi :: Fd , ciovec ( bufs) , offset) . map_err ( err2io) }
53
54
}
54
55
55
56
pub fn read ( & self , bufs : & mut [ IoSliceMut < ' _ > ] ) -> io:: Result < usize > {
56
- unsafe { wasi:: fd_read ( self . fd , iovec ( bufs) ) . map_err ( err2io) }
57
+ unsafe { wasi:: fd_read ( self . fd as wasi :: Fd , iovec ( bufs) ) . map_err ( err2io) }
57
58
}
58
59
59
60
pub fn write ( & self , bufs : & [ IoSlice < ' _ > ] ) -> io:: Result < usize > {
60
- unsafe { wasi:: fd_write ( self . fd , ciovec ( bufs) ) . map_err ( err2io) }
61
+ unsafe { wasi:: fd_write ( self . fd as wasi :: Fd , ciovec ( bufs) ) . map_err ( err2io) }
61
62
}
62
63
63
64
pub fn seek ( & self , pos : SeekFrom ) -> io:: Result < u64 > {
@@ -66,37 +67,37 @@ impl WasiFd {
66
67
SeekFrom :: End ( pos) => ( wasi:: WHENCE_END , pos) ,
67
68
SeekFrom :: Current ( pos) => ( wasi:: WHENCE_CUR , pos) ,
68
69
} ;
69
- unsafe { wasi:: fd_seek ( self . fd , offset, whence) . map_err ( err2io) }
70
+ unsafe { wasi:: fd_seek ( self . fd as wasi :: Fd , offset, whence) . map_err ( err2io) }
70
71
}
71
72
72
73
pub fn tell ( & self ) -> io:: Result < u64 > {
73
- unsafe { wasi:: fd_tell ( self . fd ) . map_err ( err2io) }
74
+ unsafe { wasi:: fd_tell ( self . fd as wasi :: Fd ) . map_err ( err2io) }
74
75
}
75
76
76
77
// FIXME: __wasi_fd_fdstat_get
77
78
78
79
pub fn set_flags ( & self , flags : wasi:: Fdflags ) -> io:: Result < ( ) > {
79
- unsafe { wasi:: fd_fdstat_set_flags ( self . fd , flags) . map_err ( err2io) }
80
+ unsafe { wasi:: fd_fdstat_set_flags ( self . fd as wasi :: Fd , flags) . map_err ( err2io) }
80
81
}
81
82
82
83
pub fn set_rights ( & self , base : wasi:: Rights , inheriting : wasi:: Rights ) -> io:: Result < ( ) > {
83
- unsafe { wasi:: fd_fdstat_set_rights ( self . fd , base, inheriting) . map_err ( err2io) }
84
+ unsafe { wasi:: fd_fdstat_set_rights ( self . fd as wasi :: Fd , base, inheriting) . map_err ( err2io) }
84
85
}
85
86
86
87
pub fn sync ( & self ) -> io:: Result < ( ) > {
87
- unsafe { wasi:: fd_sync ( self . fd ) . map_err ( err2io) }
88
+ unsafe { wasi:: fd_sync ( self . fd as wasi :: Fd ) . map_err ( err2io) }
88
89
}
89
90
90
91
pub fn advise ( & self , offset : u64 , len : u64 , advice : wasi:: Advice ) -> io:: Result < ( ) > {
91
- unsafe { wasi:: fd_advise ( self . fd , offset, len, advice) . map_err ( err2io) }
92
+ unsafe { wasi:: fd_advise ( self . fd as wasi :: Fd , offset, len, advice) . map_err ( err2io) }
92
93
}
93
94
94
95
pub fn allocate ( & self , offset : u64 , len : u64 ) -> io:: Result < ( ) > {
95
- unsafe { wasi:: fd_allocate ( self . fd , offset, len) . map_err ( err2io) }
96
+ unsafe { wasi:: fd_allocate ( self . fd as wasi :: Fd , offset, len) . map_err ( err2io) }
96
97
}
97
98
98
99
pub fn create_directory ( & self , path : & str ) -> io:: Result < ( ) > {
99
- unsafe { wasi:: path_create_directory ( self . fd , path) . map_err ( err2io) }
100
+ unsafe { wasi:: path_create_directory ( self . fd as wasi :: Fd , path) . map_err ( err2io) }
100
101
}
101
102
102
103
pub fn link (
@@ -107,7 +108,14 @@ impl WasiFd {
107
108
new_path : & str ,
108
109
) -> io:: Result < ( ) > {
109
110
unsafe {
110
- wasi:: path_link ( self . fd , old_flags, old_path, new_fd. fd , new_path) . map_err ( err2io)
111
+ wasi:: path_link (
112
+ self . fd as wasi:: Fd ,
113
+ old_flags,
114
+ old_path,
115
+ new_fd. fd as wasi:: Fd ,
116
+ new_path,
117
+ )
118
+ . map_err ( err2io)
111
119
}
112
120
}
113
121
@@ -122,33 +130,42 @@ impl WasiFd {
122
130
) -> io:: Result < WasiFd > {
123
131
unsafe {
124
132
wasi:: path_open (
125
- self . fd ,
133
+ self . fd as wasi :: Fd ,
126
134
dirflags,
127
135
path,
128
136
oflags,
129
137
fs_rights_base,
130
138
fs_rights_inheriting,
131
139
fs_flags,
132
140
)
133
- . map ( |fd| WasiFd :: from_raw ( fd) )
141
+ . map ( |fd| WasiFd :: from_raw ( fd as c_int ) )
134
142
. map_err ( err2io)
135
143
}
136
144
}
137
145
138
146
pub fn readdir ( & self , buf : & mut [ u8 ] , cookie : wasi:: Dircookie ) -> io:: Result < usize > {
139
- unsafe { wasi:: fd_readdir ( self . fd , buf. as_mut_ptr ( ) , buf. len ( ) , cookie) . map_err ( err2io) }
147
+ unsafe {
148
+ wasi:: fd_readdir ( self . fd as wasi:: Fd , buf. as_mut_ptr ( ) , buf. len ( ) , cookie)
149
+ . map_err ( err2io)
150
+ }
140
151
}
141
152
142
153
pub fn readlink ( & self , path : & str , buf : & mut [ u8 ] ) -> io:: Result < usize > {
143
- unsafe { wasi:: path_readlink ( self . fd , path, buf. as_mut_ptr ( ) , buf. len ( ) ) . map_err ( err2io) }
154
+ unsafe {
155
+ wasi:: path_readlink ( self . fd as wasi:: Fd , path, buf. as_mut_ptr ( ) , buf. len ( ) )
156
+ . map_err ( err2io)
157
+ }
144
158
}
145
159
146
160
pub fn rename ( & self , old_path : & str , new_fd : & WasiFd , new_path : & str ) -> io:: Result < ( ) > {
147
- unsafe { wasi:: path_rename ( self . fd , old_path, new_fd. fd , new_path) . map_err ( err2io) }
161
+ unsafe {
162
+ wasi:: path_rename ( self . fd as wasi:: Fd , old_path, new_fd. fd as wasi:: Fd , new_path)
163
+ . map_err ( err2io)
164
+ }
148
165
}
149
166
150
167
pub fn filestat_get ( & self ) -> io:: Result < wasi:: Filestat > {
151
- unsafe { wasi:: fd_filestat_get ( self . fd ) . map_err ( err2io) }
168
+ unsafe { wasi:: fd_filestat_get ( self . fd as wasi :: Fd ) . map_err ( err2io) }
152
169
}
153
170
154
171
pub fn filestat_set_times (
@@ -157,19 +174,21 @@ impl WasiFd {
157
174
mtim : wasi:: Timestamp ,
158
175
fstflags : wasi:: Fstflags ,
159
176
) -> io:: Result < ( ) > {
160
- unsafe { wasi:: fd_filestat_set_times ( self . fd , atim, mtim, fstflags) . map_err ( err2io) }
177
+ unsafe {
178
+ wasi:: fd_filestat_set_times ( self . fd as wasi:: Fd , atim, mtim, fstflags) . map_err ( err2io)
179
+ }
161
180
}
162
181
163
182
pub fn filestat_set_size ( & self , size : u64 ) -> io:: Result < ( ) > {
164
- unsafe { wasi:: fd_filestat_set_size ( self . fd , size) . map_err ( err2io) }
183
+ unsafe { wasi:: fd_filestat_set_size ( self . fd as wasi :: Fd , size) . map_err ( err2io) }
165
184
}
166
185
167
186
pub fn path_filestat_get (
168
187
& self ,
169
188
flags : wasi:: Lookupflags ,
170
189
path : & str ,
171
190
) -> io:: Result < wasi:: Filestat > {
172
- unsafe { wasi:: path_filestat_get ( self . fd , flags, path) . map_err ( err2io) }
191
+ unsafe { wasi:: path_filestat_get ( self . fd as wasi :: Fd , flags, path) . map_err ( err2io) }
173
192
}
174
193
175
194
pub fn path_filestat_set_times (
@@ -181,33 +200,33 @@ impl WasiFd {
181
200
fstflags : wasi:: Fstflags ,
182
201
) -> io:: Result < ( ) > {
183
202
unsafe {
184
- wasi:: path_filestat_set_times ( self . fd , flags, path, atim, mtim, fstflags)
203
+ wasi:: path_filestat_set_times ( self . fd as wasi :: Fd , flags, path, atim, mtim, fstflags)
185
204
. map_err ( err2io)
186
205
}
187
206
}
188
207
189
208
pub fn symlink ( & self , old_path : & str , new_path : & str ) -> io:: Result < ( ) > {
190
- unsafe { wasi:: path_symlink ( old_path, self . fd , new_path) . map_err ( err2io) }
209
+ unsafe { wasi:: path_symlink ( old_path, self . fd as wasi :: Fd , new_path) . map_err ( err2io) }
191
210
}
192
211
193
212
pub fn unlink_file ( & self , path : & str ) -> io:: Result < ( ) > {
194
- unsafe { wasi:: path_unlink_file ( self . fd , path) . map_err ( err2io) }
213
+ unsafe { wasi:: path_unlink_file ( self . fd as wasi :: Fd , path) . map_err ( err2io) }
195
214
}
196
215
197
216
pub fn remove_directory ( & self , path : & str ) -> io:: Result < ( ) > {
198
- unsafe { wasi:: path_remove_directory ( self . fd , path) . map_err ( err2io) }
217
+ unsafe { wasi:: path_remove_directory ( self . fd as wasi :: Fd , path) . map_err ( err2io) }
199
218
}
200
219
201
220
pub fn sock_recv (
202
221
& self ,
203
222
ri_data : & mut [ IoSliceMut < ' _ > ] ,
204
223
ri_flags : wasi:: Riflags ,
205
224
) -> io:: Result < ( usize , wasi:: Roflags ) > {
206
- unsafe { wasi:: sock_recv ( self . fd , iovec ( ri_data) , ri_flags) . map_err ( err2io) }
225
+ unsafe { wasi:: sock_recv ( self . fd as wasi :: Fd , iovec ( ri_data) , ri_flags) . map_err ( err2io) }
207
226
}
208
227
209
228
pub fn sock_send ( & self , si_data : & [ IoSlice < ' _ > ] , si_flags : wasi:: Siflags ) -> io:: Result < usize > {
210
- unsafe { wasi:: sock_send ( self . fd , ciovec ( si_data) , si_flags) . map_err ( err2io) }
229
+ unsafe { wasi:: sock_send ( self . fd as wasi :: Fd , ciovec ( si_data) , si_flags) . map_err ( err2io) }
211
230
}
212
231
213
232
pub fn sock_shutdown ( & self , how : Shutdown ) -> io:: Result < ( ) > {
@@ -216,14 +235,14 @@ impl WasiFd {
216
235
Shutdown :: Write => wasi:: SDFLAGS_WR ,
217
236
Shutdown :: Both => wasi:: SDFLAGS_WR | wasi:: SDFLAGS_RD ,
218
237
} ;
219
- unsafe { wasi:: sock_shutdown ( self . fd , how) . map_err ( err2io) }
238
+ unsafe { wasi:: sock_shutdown ( self . fd as wasi :: Fd , how) . map_err ( err2io) }
220
239
}
221
240
}
222
241
223
242
impl Drop for WasiFd {
224
243
fn drop ( & mut self ) {
225
244
// FIXME: can we handle the return code here even though we can't on
226
245
// unix?
227
- let _ = unsafe { wasi:: fd_close ( self . fd ) } ;
246
+ let _ = unsafe { wasi:: fd_close ( self . fd as wasi :: Fd ) } ;
228
247
}
229
248
}
0 commit comments