I'm sending back XML for sofia.conf from my ERLang code, but after the reply is sent, Freeswitch is locking up. It's only based on the template/default values for mod_sofia, but if I send the not found reply, Freeswitch locks up as well. Any ideas? Code follows... %% Author: mark %% Created: Sep 15, 2009 %% Description: TODO: Add description to freeswitch_callback -module(freeswitch_callback). -behaviour(gen_server). -record(st, {fsnode, pbxpid}). -export([start/3, terminate/2, code_change/3, init/1, handle_call/3, handle_cast/2, handle_info/2, fetch_handler/1, xml_fetch/1]). start(Node, Section, Pid) -> gen_server:start(?MODULE, [Node, Section, Pid], []). init([Node, Section, Pid]) -> io:format( "freeswitch_callback:init( [Node=~w, Section=~w, Pid=~w])~n", [Node, Section, Pid] ), {ok, #st{fsnode=Node, pbxpid=Pid}}. terminate(_Reason, _State) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. %% %% Callback for freeswitch:start_fetch_handler() called in freeswitch_bind:init() %% fetch_handler( FreeswitchNode ) -> receive { nodedown, Node } -> io:format( "freeswitch_callback:fetch_handler() Node ~w is down~n", [Node] ), ok; { fetch, Section, Tag, Key, Value, FetchId, Params } -> io:format( "freeswitch_callback:fetch_handler() Invoking xml_fetch()~n" ), {ok, Xml} = xml_fetch( {fetch, Section, Tag, Key, Value, Params} ), io:format( "freeswitch_callback:fetch_handler() Sending reply to FreeswitchNode ~w: ~s~n", [FreeswitchNode, Xml] ), {api, FreeswitchNode} ! {fetch_reply, FetchId, Xml}, %% FreeswitchNode ! { fetch_reply, FetchId, Xml }, io:format( "freeswitch_callback:fetch_handler() Reply sent~n" ) %% io:format( "freeswitch_callback:fetch_handler() Waiting for confirmation reply was received~n"), %% receive %% ok -> %% io:format( "freeswitch_callback:fetch_handler() Reply receipt confirmed~n" ), %% ok; %% {error, Reason} -> %% io:format( "freeswitch_callback:fetch_handler() Reply receipt failed due to error ~s~n", [Reason] ), %% {error, Reason} %% end end, { ok } = fetch_handler( FreeswitchNode ), { ok }. dumpParams( Params ) -> case Params of [] -> ok; [ H | T ] -> case H of undefined -> io:format( " undefined~n" ); { Key, Value } -> io:format( " ~s=~s~n", [Key, Value ] ) end, dumpParams( T ) end. %% %% Configuration handler for mod_sofia. %% xml_fetch({fetch, configuration, "configuration", "name", "sofia.conf", Params}) -> io:format( "freeswitch_callback:handle_call( {fetch, configuration, Tag=\"configuration\", Key=\"name\", Value=\"sofia.conf\", Params=...} )~n"), dumpParams( Params ), Xml = "<document type=\"freeswitch/xml\"> <section name=\"configuration\"> <configuration name=\"sofia.conf\" description=\"sofia Endpoint\"> <global_settings> <param name=\"log-level\" value=\"0\" /> <param name=\"auto-restart\" value=\"false\" /> <param name=\"debug-presence\" value=\"0\" /> </glogal_settings> <settings> <!-- ADD parameters here --> </settings> <profiles> <profile name=\"external\"> <gateways> <!-- Add gateways here --> <gateway name=\"asterlink.com\"> <param name=\"\" value=\"\" /> <param name=\"\" value=\"\" /> <param name=\"\" value=\"\" /> <param name=\"\" value=\"\" /> <param name=\"\" value=\"\" /> <param name=\"\" value=\"\" /> <param name=\"\" value=\"\" /> </gateway> </gateways> <aliases> <alias name=\"outbound\" /> <alias name=\"nat\" /> </aliases> <domains> <domain name=\"all\" alias=\"false\" parse=\"true\" /> </domains> <settings> <param name=\"debug\" value=\"0\" /> <param name=\"sip-trace\" value=\"no\" /> <param name=\"rfc2833-pt\" value=\"101\" /> <param name=\"sip-port\" value=\"6080\" /> <param name=\"dialplan\" value=\"XML\" /> <param name=\"context\" value=\"public\" /> <param name=\"dtmf-duration\" value=\"100\" /> <param name=\"codec-prefs\" value=\"PCMU,PCMA,GSM\" /> <param name=\"hold-music\" value=\"local_stream://moh\" /> <param name=\"rtp-timer-name\" value=\"soft\" /> <!--param name=\"enable-100rel\" value=\"true\" / --> <param name=\"manage-presence\" value=\"false\" /> <!-- param name=\"dbname\" value=\"share_presence\" / --> <!-- param name=\"presence-hosts\" value=\"10.77.0.254\" / --> <!-- param name=\"force-register-domain\" value=\"10.77.0.254\" / --> <!-- param name=\"force-register-db-domain\" value=\"10.77.0.254\" / --> <!-- param name=\"aggressive-nat-detection\" value=\"true\" / --> <param name=\"inbound-codec-negotiation\" value=\"generous\" /> <param name=\"nonce-ttl\" value=\"60\" /> <param name=\"auth-calls\" value=\"false\" /> <param name=\"rtp-timeout-sec\" value=\"1800\" /> <param name=\"rtp-ip\" value=\"10.77.0.254\" /> <param name=\"sip-ip\" value=\"10.77.0.254\" /> <param name=\"ext-rtp-ip\" value=\"stun:stun.freeswitch.org\" /> <param name=\"ext-sip-ip\" value=\"stun:stun.freeswitch.org\" /> <param name=\"rtp-timout-sec\" value=\"300\" /> <param name=\"rtp-hold-timeout-sec\" value=\"1800\" /> <!-- param name=\"enable-3pcc\" value=\"true\" / --> <param name=\"tls-bind-params\" value=\"transport=tls\" /> <param name=\"tls-sip-port\" value=\"6081\" /> <param name=\"tls-cert-dir\" value=\"/opt/freeswitch/conf/ssl\" /> <param name=\"tls-version\" value=\"tlsv1\" /> <!-- param name=\"rtp-autoflush-during-bridge\" value=\"false\" / --> <!-- param name=\"rtp-rewrite-timestamp\" value=\"true\" / --> <!-- param name=\"pass-rfc2833\" value=\"true\" / --> <!-- param name=\"odbc-dsn\" value=\"dsn:user:pass\" / --> <!-- param name=\"inbound-bypass-media\" value=\"true\" / --> <!-- param name=\"inbound-proxy-media\" value=\"true\" / --> <!-- param name=\"inbound-late-negotiation\" value=\"true\" / --> <!-- param name=\"accept-blind-reg\" value=\"true\" / --> <!-- param name=\"accept-blind-auth\" value=\"true\" / --> <!-- param name=\"suppress-cng\" value=\"true\" / --> <param name=\"nonce-ttl\" value=\"60\" /> <!-- param name=\"disable-transcoding\" value=\"true\" / --> <!-- param name=\"disable-transfer\" value=\"true\" / --> <!-- param name=\"NDLB-broken-auth-hash\" value=\"true\" / --> <!-- param name=\"NDLB-received-in-nat-reg-contact\" value=\"true\" / --> <param name=\"auth-calls\" value=\"true\" /> <param name=\"inbound-reg-force-matching-username\" value=\"true\" /> <param name=\"auth-all-packets\" value=\"false\" /> <!-- param name=\"ext-rtp-ip\" value=\"stun.freeswitch.org\" / --> <!-- param name=\"ext-sip-ip\" value=\"stun.freeswitch.org\" / --> <param name=\"rtp-timeout-sec\" value=\"300\" /> <param name=\"rtp-hold-timeout-sec\" value=\"1800\" /> <!-- param name=\"vad\" value=\"in\" / --> <!-- param name=\"vad\" value=\"out\" / --> <!-- param name=\"vad\" value=\"both\" / --> <!-- param name=\"alias\" value=\"sip:10.77.0.231:5555\" / --> <param name=\"force-register-domain\" value=\"10.77.0.231\" /> <param name=\"force-register-db-domain\" value=\"10.77.0.231\" /> <!-- param name=\"force-subscription-expires\" value=\"60\" / --> <!-- param name=\"disable-transfer\" value=\"true\" / --> <!-- param name=\"disable-register\" value=\"true\" / --> <!-- param name=\"enable-3pcc\" value=\"true\" / --> <!-- param name=\"NDLB-force-rport\" value=\"true\" / --> <param name=\"challenge-realm\" value=\"auto_from\" /> <!-- param name=\"disable-rtp-auto-adjust\" value=\"true\" / --> <!-- param name=\"inbound-use-callid-as-uuid\" value=\"true\" / --> <!-- param name=\"outbound-use-uuid-as-callid\" value=\"true\" / --> <!-- param name=\"rtp-autofix-timing\" value=\"false\" / --> <!-- param name=\"auto-rtp-bugs\" data=\"clear\" / --> <!-- param name=\"disable-srv\" value=\"false\" / --> <!-- param name=\"disable-naptr\" value=\"false\" / --> <!-- param name=\"timer-T1\" value=\"800\" / --> <!-- param name=\"timer-T1X64\" value=\"32000\" / --> <!-- param name=\"timer-T2\" value=\"4000\" / --> <!-- param name=\"timer-T4\" value=\"4000\" / --> </settings> </profile> </profiles> </configuration> </section> </document>", {ok, Xml }; %% %% Configuration handler replies that the requested document section, tag, and key are not %% found. %% xml_fetch({fetch, configuration, Tag, Key, Value, Params}) -> io:format( "freeswitch_callback:handle_call( {fetch, configuration, Tag=~s, Key=~s, Value=~s, Params=...} )~n", [Tag, Key, Value]), dumpParams( Params ), Xml = "<document type=\"freeswitch/xml\"> <section name=\"result\"> <result status=\"not found\" /> </section> </document>", {ok, Xml }; %% %% Directory handler replies that the requested document section, tag, and key are not %% found. %% xml_fetch({fetch, directory, Tag, Key, Value, Params}) -> io:format( "freeswitch_callback:xml_fetch( {fetch, directory, Tag=~s, Key=~s, Value=~s, Params=...} )~n", [Tag, Key, Value]), dumpParams( Params ), Xml = "<document type=\"freeswitch/xml\"> <section name=\"result\"> <result status=\"not found\" /> </section> </document>", {ok, Xml }; %% %% Dialplan handler replies that the requested document section, tag, and key are not %% found. %% xml_fetch({fetch, dialplan, Tag, Key, Value, Params}) -> io:format( "freeswitch_callback:xml_fetch( {fetch, dialplan, Tag=~s, Key=~s, Value=~s, Params=...} )~n", [Tag, Key, Value]), dumpParams( Params ), Xml = "<document type=\"freeswitch/xml\"> <section name=\"result\"> <result status=\"not found\" /> </section> </document>", {ok, Xml }; %% %% Default handler replies that the requested document section, tag, and key are not %% found. %% xml_fetch({fetch, Section, Tag, Key, Value, Params}) -> io:format( "freeswitch_callback:xml_fetch( {fetch, Section=~w, Tag=~s, Key=~s, Value=~s, Params=...} )~n", [Section, Tag, Key, Value]), dumpParams( Params ), Xml = "<document type=\"freeswitch/xml\"> <section name=\"result\"> <result status=\"not found\" /> </section> </document>", {ok, Xml }; %% %% If the request isn't recognized, just log it. %% xml_fetch( Request ) -> io:format( "freeswitch_callback:xml_fetch( Request=~w ) not recognized~n", [Request]), Xml = "<document type=\"freeswitch/xml\"> <section name=\"result\"> <result status=\"not found\" /> </section> </document>", {ok, Xml }. %% %% If the request isn't recognized, just log it and do nothing. %% handle_call(Request, _From, State) -> io:format("freeswitch_callback:handle_call( ~w, _From, State) unrecognized request~n", [Request]), {reply, {error, unrecognized_request}, State}. handle_cast(Message, State) -> error_logger:error_msg("~p received unrecognized cast ~p~n", [self(), Message]), {noreply, State}. handle_info(Info, State) -> io:format( "freeswitch_callback:handle_info() Info=~w~n", [Info]), {noreply, State}. %%handle_info({fetch, Section, Tag, Key, Value, FetchID, Params}, #st{fsnode=Node, pbxpid=Pid}=State) -> %% {ok, XML} = gen_server:call(Pid, {fetch, Section, Tag, Key, Value, Params}), %% {api, Node} ! {fetch_reply, FetchID, XML}, %% receive %% ok -> %% {noreply, State}; %% {error, Reason} -> %% {stop, {error, Reason}, State} %% end.