newbie having difficulty with inet_res:nslookup

Jeff Macdonald macfisherman@REDACTED
Sun Sep 13 17:29:16 CEST 2009


I forgot to say Mac OS X (.5), erlang 12B I think (what's the way to
have the shell give the erlang version?).


On Sun, Sep 13, 2009 at 11:27 AM, Jeff Macdonald <macfisherman@REDACTED> wrote:
> Hi All,
>
> I wrote a fairly simple program to look up MX records for domains and
> then look up the exhanger's A and AAAA records. I'm trying to see how
> many MX's have IPv6 capable hosts.
>
> My program simply reads a file which contains a domain per line and
> spawns a processes/thread/child for each domain. The spawned process
> then does the MX, A and AAAA lookups and prints the results to STDOUT
> as a erlang tupple. This seems to work fine for a small sample set of
> 10 rows but when trying 100 rows or more I get:
>
> =ERROR REPORT==== 12-Sep-2009::23:06:41 ===
> Error in process <0.11161.0> with exit value:
> {function_clause,[{lists,map,[#Fun<mx.0.117750125>,emfile]},{mx,do_lookups,1}]}
>
> My program is below. Usage is:
>
> mx:init({192,168, 1, 1}). (replace that tupple with the IP of your DNS server)
> mx:process_file("file-with-domains").
>
> I currently can't share a list of domains because it is customer data,
> but I sure there is some lists somewhere.
>
> I suspect that I'm overloading the DNS server at home. That is just
> whatever is running in my linksys router. Any other suggestions about
> the code welcomed. I know I could probably run the A and AAAA queries
> in parallel. I also can probably skip queries when the data is present
> in the MX results. For now, I'm just trying to get the basics.
>
> TIA
>
>
>
> %% Author: jeff
> %% Created: Sep 10, 2009
> %% Description: TODO: Add description to mx
> -module(mx).
>
> %%
> %% Include files
> %%
> -include_lib("kernel/src/inet_dns.hrl").
>
> %%
> %% Exported Functions
> %%
> -export([init/1, process_file/1, do_lookups/1]).
>
> %%
> %% API Functions
> %%
>
> init(Resolver)  ->
>        inet_db:add_ns(Resolver).
>
> process_file(Filename)  ->
>        {ok,Fh}=file:open(Filename, [read]),
>        read_file(Fh).
>
> do_lookups(Domain)      ->
>        MX_list=lookup_mx(Domain),
>        Address=lists:map(fun lookup_address/1, MX_list),
>    io:format("~p:~n\t~p~n~n", [Domain, Address]).
>
> %%
> %% Local Functions
> %%
>
> read_file(Fh)   ->
>        case io:get_line(Fh, "") of
>                eof                             -> done;
>                {error, Reason} -> {error, Reason};
>                Data                    ->
>                        process_data(string:strip(Data,right,$\n)),
>                        read_file(Fh)
>        end.
>
> process_data(Data)      ->
>        spawn(mx, do_lookups, [Data]).
>
>
> lookup_mx(Domain)       ->
>        case inet_res:nslookup(Domain, 1, mx) of
>                {error, Reason} -> Reason;
>                {ok, #dns_rec{ anlist = Ans }} -> lists:map(fun parse_mx/1, Ans)
>        end.
>
> lookup_address(Host)    ->
>        { Host, {a, lookup_address(Host, a)},
>                        {aaaa, lookup_address(Host, aaaa)} }.
>
> lookup_address(Host, a) ->
>        case inet_res:nslookup(Host, 1, a) of
>                {error, Reason} -> Reason;
>                {ok, #dns_rec{ anlist = Ans }} -> lists:map(fun parse_a/1, Ans)
>        end;
>
> lookup_address(Host, aaaa)      ->
>        case inet_res:nslookup(Host, 1, aaaa) of
>                {error, Reason} -> Reason;
>                {ok, #dns_rec{ anlist = Ans }} -> Host,lists:map(fun parse_aaaa/1, Ans)
>        end.
>
> parse_mx( RR )  ->
>        #dns_rr{ type=mx, data={ _Pref, Exchange} } = RR,
>        Exchange.
>
> parse_a( RR )   ->
>        #dns_rr{ type=a, data=Address } = RR,
>        Address.
>
> parse_aaaa( RR )        ->
>        #dns_rr{ type=aaaa, data=Address } = RR,
>        Address.
>
>
>
>
> --
> Jeff Macdonald
> Ayer, MA
>



-- 
Jeff Macdonald
Ayer, MA


More information about the erlang-questions mailing list