@@ -399,34 +399,14 @@ alg(ConnectionHandler) ->
399
399
% %====================================================================
400
400
% % Intitialisation
401
401
% %====================================================================
402
-
403
402
init ([Role , Socket , Opts ]) when Role == client ; Role == server ->
404
- case inet :peername (Socket ) of
405
- {ok , PeerAddr } ->
406
- try
407
- {Protocol , Callback , CloseTag } = ? GET_OPT (transport , Opts ),
408
- D = # data {starter = ? GET_INTERNAL_OPT (user_pid , Opts ),
409
- socket = Socket ,
410
- transport_protocol = Protocol ,
411
- transport_cb = Callback ,
412
- transport_close_tag = CloseTag ,
413
- ssh_params = init_ssh_record (Role , Socket , PeerAddr , Opts ),
414
- connection_state = init_connection_record (Role , Socket , Opts )
415
- },
416
- process_flag (trap_exit , true ),
417
- {ok , {hello ,Role }, D }
418
- catch
419
- _ :{error ,Error } -> {stop , {error ,Error }};
420
- error :Error -> {stop , {error ,Error }}
421
- end ;
422
-
423
- {error ,Error } ->
424
- {stop , {shutdown ,Error }}
425
- end .
403
+ % % ssh_params will be updated after receiving socket_control event
404
+ % % in wait_for_socket state;
405
+ D = # data {socket = Socket , ssh_params = # ssh {opts = Opts }},
406
+ {ok , {wait_for_socket , Role }, D }.
426
407
427
408
% %%----------------------------------------------------------------
428
409
% %% Connection start and initialization helpers
429
-
430
410
init_connection_record (Role , Socket , Opts ) ->
431
411
{WinSz , PktSz } = init_inet_buffers_window (Socket ),
432
412
C = # connection {channel_cache = ssh_client_channel :cache_create (),
@@ -576,15 +556,40 @@ renegotiation(_) -> false.
576
556
{next_event ,internal ,{conn_msg ,Msg }}]).
577
557
578
558
% % . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
579
-
580
559
callback_mode () ->
581
560
[handle_event_function ,
582
561
state_enter ].
583
562
584
-
585
563
% %% ######## {hello, client|server} ####
586
- % % The very first event that is sent when the we are set as controlling process of Socket
587
- handle_event (cast , socket_control , {hello ,_ }= StateName , # data {ssh_params = Ssh0 } = D ) ->
564
+ % % The very first event that is sent when ssh_connection_handler
565
+ % % becomes owner process for Socket
566
+ handle_event (cast , socket_control , {wait_for_socket , Role },
567
+ # data {socket = Socket , ssh_params = # ssh {opts = Opts }}) ->
568
+ case inet :peername (Socket ) of
569
+ {ok , PeerAddr } ->
570
+ try
571
+ {Protocol , Callback , CloseTag } = ? GET_OPT (transport , Opts ),
572
+ D = # data {starter = ? GET_INTERNAL_OPT (user_pid , Opts ),
573
+ socket = Socket ,
574
+ transport_protocol = Protocol ,
575
+ transport_cb = Callback ,
576
+ transport_close_tag = CloseTag ,
577
+ ssh_params = init_ssh_record (Role , Socket , PeerAddr , Opts ),
578
+ connection_state = init_connection_record (Role , Socket , Opts )
579
+ },
580
+ process_flag (trap_exit , true ),
581
+ NextEvent = {next_event , internal , socket_ready },
582
+ {next_state , {hello ,Role }, D , NextEvent }
583
+ catch
584
+ _ :{error ,Error } -> {stop , {error ,Error }};
585
+ error :Error -> {stop , {error ,Error }}
586
+ end ;
587
+
588
+ {error ,Error } ->
589
+ {stop , {shutdown ,Error }}
590
+ end ;
591
+
592
+ handle_event (internal , socket_ready , {hello ,_ }= StateName , # data {ssh_params = Ssh0 } = D ) ->
588
593
VsnMsg = ssh_transport :hello_version_msg (string_version (Ssh0 )),
589
594
send_bytes (VsnMsg , D ),
590
595
case inet :getopts (Socket = D # data .socket , [recbuf ]) of
@@ -1363,6 +1368,10 @@ handle_event(Type, Ev, StateName, D0) ->
1363
1368
) -> term ().
1364
1369
1365
1370
% % . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1371
+ terminate (_ , {wait_for_socket , _ }, _ ) ->
1372
+ % % No need to to anything - maybe we have not yet gotten
1373
+ % % control over the socket
1374
+ ok ;
1366
1375
1367
1376
terminate (normal , _StateName , D ) ->
1368
1377
close_transport (D );
0 commit comments