@@ -87,6 +87,7 @@ struct UnixSocketInner {
8787 listening : bool ,
8888 peer : Option < Arc < UnixSocket > > ,
8989 connected : bool ,
90+ address : SocketAddrUnix ,
9091}
9192
9293pub struct UnixSocket {
@@ -110,9 +111,22 @@ impl UnixSocket {
110111 } )
111112 }
112113
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+
113122 pub fn sref ( & self ) -> Arc < Self > {
114123 self . weak . upgrade ( ) . unwrap ( )
115124 }
125+
126+ /// Returns wether the socket is connected or not.
127+ pub fn is_connected ( & self ) -> bool {
128+ self . inner . lock_irq ( ) . connected
129+ }
116130}
117131
118132impl INodeInterface for UnixSocket {
@@ -160,6 +174,7 @@ impl INodeInterface for UnixSocket {
160174
161175 // create the socket inode.
162176 DirEntry :: from_socket_inode ( fs:: lookup_path ( parent) ?, String :: from ( name) , self . sref ( ) ) ?;
177+ self . set_address ( address. clone ( ) ) ;
163178
164179 Ok ( ( ) )
165180 }
@@ -204,7 +219,11 @@ impl INodeInterface for UnixSocket {
204219 return Err ( FileSystemError :: ConnectionRefused ) ;
205220 }
206221
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+ }
208227
209228 let peer = this
210229 . backlog
@@ -224,12 +243,31 @@ impl INodeInterface for UnixSocket {
224243 peer_data. connected = true ;
225244 }
226245
246+ sock. set_address ( peer. get_address ( ) ) ;
247+
227248 peer. wq . notify_complete ( ) ;
228249 Ok ( sock)
229250 }
230251
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 > ( ) )
233271 }
234272
235273 fn poll ( & self , table : Option < & mut PollTable > ) -> Result < PollFlags > {
0 commit comments