@@ -87,6 +87,7 @@ struct UnixSocketInner {
87
87
listening : bool ,
88
88
peer : Option < Arc < UnixSocket > > ,
89
89
connected : bool ,
90
+ address : SocketAddrUnix ,
90
91
}
91
92
92
93
pub struct UnixSocket {
@@ -110,9 +111,22 @@ impl UnixSocket {
110
111
} )
111
112
}
112
113
114
+ pub fn set_address ( & self , address : SocketAddrUnix ) {
115
+ self . inner . lock_irq ( ) . address = address;
116
+ }
117
+
118
+ pub fn get_address ( & self ) -> SocketAddrUnix {
119
+ self . inner . lock_irq ( ) . address . clone ( )
120
+ }
121
+
113
122
pub fn sref ( & self ) -> Arc < Self > {
114
123
self . weak . upgrade ( ) . unwrap ( )
115
124
}
125
+
126
+ /// Returns wether the socket is connected or not.
127
+ pub fn is_connected ( & self ) -> bool {
128
+ self . inner . lock_irq ( ) . connected
129
+ }
116
130
}
117
131
118
132
impl INodeInterface for UnixSocket {
@@ -160,6 +174,7 @@ impl INodeInterface for UnixSocket {
160
174
161
175
// create the socket inode.
162
176
DirEntry :: from_socket_inode ( fs:: lookup_path ( parent) ?, String :: from ( name) , self . sref ( ) ) ?;
177
+ self . set_address ( address. clone ( ) ) ;
163
178
164
179
Ok ( ( ) )
165
180
}
@@ -204,7 +219,11 @@ impl INodeInterface for UnixSocket {
204
219
return Err ( FileSystemError :: ConnectionRefused ) ;
205
220
}
206
221
207
- let mut this = self . wq . block_on ( & self . inner , |e| e. backlog . len ( ) != 0 ) ?;
222
+ let mut this = self . inner . lock_irq ( ) ;
223
+
224
+ if this. backlog . len ( ) == 0 {
225
+ return Err ( FileSystemError :: WouldBlock ) ;
226
+ }
208
227
209
228
let peer = this
210
229
. backlog
@@ -224,12 +243,31 @@ impl INodeInterface for UnixSocket {
224
243
peer_data. connected = true ;
225
244
}
226
245
246
+ sock. set_address ( peer. get_address ( ) ) ;
247
+
227
248
peer. wq . notify_complete ( ) ;
228
249
Ok ( sock)
229
250
}
230
251
231
- fn recv ( & self , _message_header : & mut MessageHeader ) -> Result < ( ) > {
232
- Ok ( ( ) )
252
+ fn recv ( & self , header : & mut MessageHeader ) -> Result < usize > {
253
+ if !self . is_connected ( ) {
254
+ return Err ( FileSystemError :: NotConnected ) ;
255
+ }
256
+
257
+ let size = header. iovecs ( ) . iter ( ) . map ( |e| e. len ( ) ) . sum :: < usize > ( ) ;
258
+
259
+ let mut buffer = self . wq . block_on ( & self . buffer , |e| e. len ( ) >= size) ?;
260
+ log:: trace!( "UnixSocket::recv(): recieved total of {size} bytes" ) ;
261
+
262
+ header
263
+ . name_mut :: < SocketAddrUnix > ( )
264
+ . map ( |e| * e = self . inner . lock_irq ( ) . peer . as_ref ( ) . unwrap ( ) . get_address ( ) ) ;
265
+
266
+ Ok ( header
267
+ . iovecs_mut ( )
268
+ . iter_mut ( )
269
+ . map ( |iovec| buffer. read_data ( iovec. as_mut_slice ( ) ) )
270
+ . sum :: < usize > ( ) )
233
271
}
234
272
235
273
fn poll ( & self , table : Option < & mut PollTable > ) -> Result < PollFlags > {
0 commit comments