%% ``The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved via the world wide web at http://www.erlang.org/.
%% 
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%% 
%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
%% AB. All Rights Reserved.''
%% 
%% 
%%     $Id$
%%
%%-----------------------------------------------------------------
%% Purpose: Waiting in accept for new connections.
%%-----------------------------------------------------------------
-module(megaco_tcp_accept).

%%-----------------------------------------------------------------
%% Include files
%%-----------------------------------------------------------------
-include_lib("megaco/src/tcp/megaco_tcp.hrl").


%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
-export([
	 start_link/1
	]).


%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
-export([
	 net_accept/4
	]).


%%-----------------------------------------------------------------
%% External interface functions
%%-----------------------------------------------------------------
%%-----------------------------------------------------------------
%% Func: start
%% Description: Starts the proces that makes the accept call.
%%-----------------------------------------------------------------
start_link({TcpRec, SupPid, Listen}) ->
    Args = [TcpRec, SupPid, Listen, self()],
    Pid  = proc_lib:spawn_link(?MODULE, net_accept, Args),
    {ok, Pid}.

%%-----------------------------------------------------------------
%% Internal Interface Functions
%%-----------------------------------------------------------------
%%-----------------------------------------------------------------
%% Func: net_accept
%% Description: Loop function which calls accept and
%%              spawns a connection process when there is an initial
%%              contact.
%%-----------------------------------------------------------------
net_accept(TcpRec, SupPid, ListenFd, Parent) ->
    case gen_tcp:accept(ListenFd) of
	{ok, S} ->
	    ?tcp_debug(TcpRec, "tcp accept", []),
	    case megaco_tcp:start_connection(SupPid, 
					     TcpRec#megaco_tcp{socket=S}) of
		{ok, Pid} ->
		    case gen_tcp:controlling_process(S, Pid) of
			ok ->
			    ok;
			{error, _Reason} ->
			    tcp_clear(S),
			    gen_tcp:close(S)	
		    end;
			    
		{error, _Reason} ->
		    tcp_clear(S),
		    gen_tcp:close(S)	
	    end;
	{error, Reason} ->
	    ?tcp_debug(TcpRec, "tcp accept failed", [{error, Reason}])
    end,
    net_accept(TcpRec, SupPid, ListenFd, Parent).


tcp_clear(Socket) ->
    receive
        {tcp, Socket, _Data} ->
            tcp_clear(Socket);
        {tcp_closed, Socket} ->
            tcp_clear(Socket);
        {tcp_error, Socket} ->
            tcp_clear(Socket)
    after 0 -> 
            ok
    end.
