X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/6cb6b7ede2d178e03fa817bc28474c175f5a93b9..42a61c59a81b03130f61e805474198eada033cd8:/httpserver_20080306/dnsasync.pas diff --git a/httpserver_20080306/dnsasync.pas b/httpserver_20080306/dnsasync.pas deleted file mode 100755 index 682f95f..0000000 --- a/httpserver_20080306/dnsasync.pas +++ /dev/null @@ -1,241 +0,0 @@ -{ Copyright (C) 2005 Bas Steendijk and Peter Green - For conditions of distribution and use, see copyright notice in zlib_license.txt - which is included in the package - ----------------------------------------------------------------------------- } - -//FIXME: this code only ever seems to use one dns server for a request and does -//not seem to have any form of retry code. - -unit dnsasync; - -interface - -uses - {$ifdef win32} - dnswin, - {$endif} - lsocket,lcore, - classes,binipstuff,dnscore,btime; - - -type - //after completion or cancelation a dnswinasync may be reused - tdnsasync=class(tcomponent) - - private - //made a load of stuff private that does not appear to be part of the main - //public interface. If you make any of it public again please consider the - //consequences when using windows dns. --plugwash. - sock:twsocket; - - sockopen:boolean; - - - state:tdnsstate; - - dnsserverid:integer; - startts:double; - {$ifdef win32} - dwas : tdnswinasync; - {$endif} - - - procedure asyncprocess; - procedure receivehandler(sender:tobject;error:word); - function sendquery(const packet:tdnspacket;len:integer):boolean; - {$ifdef win32} - procedure winrequestdone(sender:tobject;error:word); - {$endif} - public - onrequestdone:tsocketevent; - - //addr and port allow the application to specify a dns server specifically - //for this dnsasync object. This is not a reccomended mode of operation - //because it limits the app to one dns server but is kept for compatibility - //and special uses. - addr,port:string; - - //A family value of AF_INET6 will give only - //ipv6 results. Any other value will give ipv4 results in preference and ipv6 - //results if ipv4 results are not available; - forwardfamily:integer; - - procedure cancel;//cancel an outstanding dns request - function dnsresult:string; //get result of dnslookup as a string - procedure dnsresultbin(var binip:tbinip); //get result of dnslookup as a tbinip - procedure forwardlookup(const name:string); //start forward lookup, - //preffering ipv4 - procedure reverselookup(const binip:tbinip); //start reverse lookup - - constructor create(aowner:tcomponent); override; - destructor destroy; override; - - end; - -implementation - -uses sysutils; - -constructor tdnsasync.create; -begin - inherited create(aowner); - dnsserverid := -1; - sock := twsocket.create(self); -end; - -destructor tdnsasync.destroy; -begin - if dnsserverid >= 0 then begin - reportlag(dnsserverid,-1); - dnsserverid := -1; - end; - sock.release; - setstate_request_init('',state); - inherited destroy; -end; - -procedure tdnsasync.receivehandler; -begin - if dnsserverid >= 0 then begin - reportlag(dnsserverid,trunc((unixtimefloat-startts)*1000)); - dnsserverid := -1; - end; -{ writeln('received reply');} - fillchar(state.recvpacket,sizeof(state.recvpacket),0); - state.recvpacketlen := twsocket(sender).Receive(@state.recvpacket, SizeOf(state.recvpacket)); - state.parsepacket := true; - asyncprocess; -end; - -function tdnsasync.sendquery; -begin -{ writeln('sendquery ',decodename(state.packet,state.packetlen,12,0,a),' ',state.requesttype);} - result := false; - if len = 0 then exit; {no packet} - if not sockopen then begin - if addr <> '' then sock.addr := addr else sock.addr := getcurrentsystemnameserver(dnsserverid);//getunixnameservercached; - startts := unixtimefloat; - if port = '' then port := '53'; - sock.port := port; - sock.Proto := 'udp'; - sock.ondataavailable := receivehandler; - try - sock.connect; - except - on e:exception do begin - //writeln('exception '+e.message); - exit; - end; - end; - sockopen := true; - end; - sock.send(@packet,len); - result := true; -end; - -procedure tdnsasync.asyncprocess; -begin - state_process(state); - case state.resultaction of - action_ignore: begin {do nothing} end; - action_done: begin - onrequestdone(self,0); - end; - action_sendquery:begin - sendquery(state.sendpacket,state.sendpacketlen); - end; - end; -end; - -procedure tdnsasync.forwardlookup; -begin - {$ifdef win32} - if usewindns or (addr = '') then begin - dwas := tdnswinasync.create; - dwas.onrequestdone := winrequestdone; - if forwardfamily = AF_INET6 then begin - dwas.forwardlookup(name,true); - end else begin - dwas.forwardlookup(name,false); - end; - end; - {$endif} - - ipstrtobin(name,state.resultbin); - if state.resultbin.family <> 0 then begin - onrequestdone(self,0); - exit; - end; - - - setstate_forward(name,state,forwardfamily); - asyncprocess; - -end; - -procedure tdnsasync.reverselookup; - -begin - {$ifdef win32} - if usewindns or (addr = '') then begin - dwas := tdnswinasync.create; - dwas.onrequestdone := winrequestdone; - dwas.reverselookup(binip); - end; - {$endif} - - setstate_reverse(binip,state); - asyncprocess; -end; - -function tdnsasync.dnsresult; -begin - if state.resultstr <> '' then result := state.resultstr else begin - result := ipbintostr(state.resultbin); - end; -end; - -procedure tdnsasync.dnsresultbin(var binip:tbinip); -begin - move(state.resultbin,binip,sizeof(binip)); -end; - -procedure tdnsasync.cancel; -begin - {$ifdef win32} - if assigned(dwas) then begin - dwas.release; - dwas := nil; - end else - {$endif} - begin - - if dnsserverid >= 0 then begin - reportlag(dnsserverid,-1); - dnsserverid := -1; - end; - if sockopen then begin - sock.close; - sockopen := false; - end; - end; - setstate_failure(state); - onrequestdone(self,0); -end; - -{$ifdef win32} - procedure tdnsasync.winrequestdone(sender:tobject;error:word); - begin - if dwas.reverse then begin - state.resultstr := dwas.name; - end else begin - state.resultbin := dwas.ip; - if (forwardfamily = AF_INET6) and (state.resultbin.family = AF_INET) then begin - fillchar(state.resultbin,sizeof(tbinip),0); - end; - end; - dwas.release; - onrequestdone(self,error); - end; -{$endif} -end.