@@ -205,35 +205,38 @@ pub struct Osockaddr {
205
205
pub sa_data : [ u8 ; 14 ] ,
206
206
}
207
207
208
- impl Osockaddr {
209
- // Converts the packed address structure into a SocketAddrV4
210
- pub fn to_socketaddr ( & self ) -> Option < SocketAddrV4 > {
208
+ impl From < & Osockaddr > for SocketAddrV4 {
209
+ fn from ( value : & Osockaddr ) -> Self {
211
210
// Extract the port
212
- let port = u16:: from_be_bytes ( [ self . sa_data [ 0 ] , self . sa_data [ 1 ] ] ) ;
211
+ let port = u16:: from_be_bytes ( [ value . sa_data [ 0 ] , value . sa_data [ 1 ] ] ) ;
213
212
214
213
// Extract the IP address
215
214
let ip = Ipv4Addr :: new (
216
- self . sa_data [ 2 ] ,
217
- self . sa_data [ 3 ] ,
218
- self . sa_data [ 4 ] ,
219
- self . sa_data [ 5 ] ,
215
+ value . sa_data [ 2 ] ,
216
+ value . sa_data [ 3 ] ,
217
+ value . sa_data [ 4 ] ,
218
+ value . sa_data [ 5 ] ,
220
219
) ;
221
220
222
- Some ( SocketAddrV4 :: new ( ip, port) )
221
+ Self :: new ( ip, port)
223
222
}
223
+ }
224
+
225
+ impl From < & SocketAddr > for Osockaddr {
226
+ fn from ( value : & SocketAddr ) -> Self {
227
+ match value {
228
+ SocketAddr :: V4 ( v) => Self :: from ( v) ,
229
+ SocketAddr :: V6 ( _) => unimplemented ! ( ) ,
230
+ }
231
+ }
232
+ }
233
+
234
+ impl From < & SocketAddrV4 > for Osockaddr {
235
+ fn from ( value : & SocketAddrV4 ) -> Self {
236
+ let ip = value. ip ( ) . to_string ( ) ;
237
+ let port = value. port ( ) ;
238
+ // TODO use as.bytes()
224
239
225
- /// Creates a new `sa_data` array from the given IP address and port.
226
- ///
227
- /// # Arguments
228
- ///
229
- /// * `ip` - A string slice representing the IP address (e.g., "192.168.1.1").
230
- /// * `port` - A u16 representing the port number.
231
- ///
232
- /// # Returns
233
- ///
234
- /// Returns an `Option<[u8; 14]>` containing the packed address if successful,
235
- /// or `None` if the IP address format is invalid.
236
- fn new ( ip : & str , port : u16 ) -> [ u8 ; 14 ] {
237
240
let mut sa_data: [ u8 ; 14 ] = [ 0 ; 14 ] ;
238
241
239
242
let ip_segments: Result < Vec < u8 > , _ > = ip. split ( '.' ) . map ( |s| s. parse :: < u8 > ( ) ) . collect ( ) ;
@@ -249,7 +252,10 @@ impl Osockaddr {
249
252
}
250
253
}
251
254
252
- sa_data
255
+ Self {
256
+ sa_family : 0 , // TODO use enum
257
+ sa_data,
258
+ }
253
259
}
254
260
}
255
261
@@ -464,9 +470,7 @@ fn handle_existing_invitation(
464
470
output_buffer : & mut String ,
465
471
res : & mut CtlRes ,
466
472
) -> Result < ( ) , TalkError > {
467
- let tcp_addr = res. addr . to_socketaddr ( ) . ok_or_else ( || {
468
- TalkError :: AddressResolutionFailed ( "Failed to convert address to socket address." . into ( ) )
469
- } ) ?;
473
+ let tcp_addr = SocketAddrV4 :: from ( & res. addr ) ;
470
474
471
475
// Establish a TCP connection to the `tcp_addr`. Map any IO errors to `TalkError::IoError`.
472
476
let stream = TcpStream :: connect ( tcp_addr) . map_err ( TalkError :: IoError ) ?;
@@ -916,6 +920,7 @@ fn send_byte(write_stream: &TcpStream, byte: u8) -> Result<(), io::Error> {
916
920
/// # Returns
917
921
///
918
922
/// A `Result` indicating success or a `TalkError`.
923
+ #[ allow( clippy:: too_many_arguments) ]
919
924
fn handle_new_invitation (
920
925
talkd_addr : SocketAddr ,
921
926
daemon_port : u16 ,
@@ -932,7 +937,7 @@ fn handle_new_invitation(
932
937
logger. set_state ( "[Service connection established.]" ) ;
933
938
934
939
// Create the socket address data and set it in the `msg`.
935
- let tcp_data = Osockaddr :: new ( & socket_addr. ip ( ) . to_string ( ) , socket_addr . port ( ) ) ;
940
+ let tcp_data = Osockaddr :: from ( & socket_addr) . sa_data ;
936
941
937
942
logger. set_state ( "[Waiting for your party to respond]" ) ;
938
943
0 commit comments