rm some cruft that got imported accidently
[lcore.git] / httpserver_20080306 / dnswin.pas
diff --git a/httpserver_20080306/dnswin.pas b/httpserver_20080306/dnswin.pas
deleted file mode 100755 (executable)
index bae0780..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-unit dnswin;\r
-\r
-interface\r
-uses binipstuff,classes,lcore;\r
-\r
-//on failure a null string or zeroed out binip will be retuned and error will be\r
-//set to a windows error code (error will be left untouched under non error\r
-//conditions).\r
-function winforwardlookup(name : string;ipv6preffered : boolean;var error:integer) : tbinip;\r
-function winreverselookup(ip:tbinip;var error:integer):string;\r
-\r
-\r
-type\r
-  //do not call destroy on a tdnswinasync instead call release and the\r
-  //dnswinasync will be freed when appropriate. Calling destroy will block\r
-  //the calling thread until the dns lookup completes.\r
-  //release should only be called from the main thread\r
-  tdnswinasync=class(tthread)\r
-  private\r
-    ipv6preffered : boolean;\r
-    freverse : boolean;\r
-    error : integer;\r
-    freewhendone : boolean;\r
-    hadevent : boolean;\r
-  protected\r
-    procedure execute; override;\r
-  public\r
-    onrequestdone:tsocketevent;\r
-    name : string;\r
-    ip : tbinip;\r
-\r
-    procedure forwardlookup(name:string;ipv6preffered:boolean);\r
-    procedure reverselookup(ip:tbinip);\r
-    destructor destroy; override;\r
-    procedure release;\r
-    constructor create;\r
-    property reverse : boolean read freverse;\r
-\r
-  end;\r
-\r
-implementation\r
-uses\r
-  lsocket,pgtypes,sysutils,winsock,windows,messages;\r
-\r
-type\r
-  //taddrinfo = record; //forward declaration\r
-  paddrinfo = ^taddrinfo;\r
-  taddrinfo = packed record\r
-    ai_flags : longint;\r
-    ai_family : longint;\r
-    ai_socktype : longint;\r
-    ai_protocol : longint;\r
-    ai_addrlen : taddrint;\r
-    ai_canonname : pchar;\r
-    ai_addr : pinetsockaddrv;\r
-    ai_next : paddrinfo;\r
-  end;\r
-  ppaddrinfo = ^paddrinfo;\r
-  tgetaddrinfo = function(nodename : pchar; servname : pchar; hints : paddrinfo;res : ppaddrinfo) : longint; stdcall;\r
-  tfreeaddrinfo = procedure(ai : paddrinfo); stdcall;\r
-  tgetnameinfo = function(sa:Pinetsockaddrv;salen : longint; host:pchar;hostlen : longint;serv:pchar;servlen:longint;flags:longint) : longint;stdcall;\r
-var\r
-  getaddrinfo : tgetaddrinfo;\r
-  freeaddrinfo : tfreeaddrinfo;\r
-  getnameinfo : tgetnameinfo;\r
-procedure v4onlyfreeaddrinfo(ai : paddrinfo); stdcall;\r
-begin\r
-  freemem(ai.ai_addr);\r
-  freemem(ai);\r
-end;\r
-\r
-type\r
-  plongint = ^longint;\r
-  pplongint = ^plongint;\r
-\r
-function v4onlygetaddrinfo(nodename : pchar; servname : pchar; hints : paddrinfo;res : ppaddrinfo) : longint; stdcall;\r
-var\r
-  output : paddrinfo;\r
-  hostent : phostent;\r
-begin\r
-  if hints.ai_family = af_inet then begin\r
-    result := 0;\r
-    getmem(output,sizeof(taddrinfo));\r
-    getmem(output.ai_addr,sizeof(tinetsockaddr));\r
-    output.ai_addr.InAddr.family := af_inet;\r
-    if servname <> nil then output.ai_addr.InAddr.port := htons(strtoint(servname)) else output.ai_addr.InAddr.port := 0;\r
-    hostent := gethostbyname(nodename);\r
-    if hostent = nil then begin\r
-      result := wsagetlasterror;\r
-      v4onlyfreeaddrinfo(output);\r
-      exit;\r
-    end;\r
-    output.ai_addr.InAddr.addr := pplongint(hostent.h_addr_list)^^;\r
-    output.ai_flags := 0;\r
-    output.ai_family := af_inet;\r
-    output.ai_socktype := 0;\r
-    output.ai_protocol := 0;\r
-    output.ai_addrlen := sizeof(tinetsockaddr);\r
-    output.ai_canonname := nil;\r
-    output.ai_next := nil;\r
-\r
-    res^ := output;\r
-  end else begin\r
-    result := WSANO_RECOVERY;\r
-  end;\r
-end;\r
-\r
-function min(a,b : integer):integer;\r
-begin\r
-  if a<b then result := a else result := b;\r
-end;\r
-\r
-function v4onlygetnameinfo(sa:Pinetsockaddrv;salen : longint; host:pchar;hostlen : longint;serv:pchar;servlen:longint;flags:longint) : longint;stdcall;\r
-var\r
-  hostent : phostent;\r
-  bytestocopy : integer;\r
-begin\r
-  if sa.InAddr.family = af_inet then begin\r
-    result := 0;\r
-    hostent := gethostbyaddr(@(sa.inaddr.addr),4,AF_INET);\r
-    if hostent = nil then begin\r
-      result := wsagetlasterror;\r
-      exit;\r
-    end;\r
-    bytestocopy := min(strlen(hostent.h_name)+1,hostlen);\r
-    move((hostent.h_name)^,host^,bytestocopy);\r
-\r
-\r
-  end else begin\r
-    result := WSANO_RECOVERY;\r
-  end;\r
-end;\r
-\r
-\r
-procedure populateprocvars;\r
-var\r
-  libraryhandle : hmodule;\r
-  i : integer;\r
-  dllname : string;\r
-\r
-begin\r
-  if assigned(getaddrinfo) then exit; //procvars already populated\r
-  for i := 0 to 1 do begin\r
-    if i=0 then dllname := 'Ws2_32.dll' else dllname := 'Wship6.dll';\r
-    libraryhandle := LoadLibrary(pchar(dllname));\r
-    getaddrinfo := getprocaddress(libraryhandle,'getaddrinfo');\r
-    freeaddrinfo := getprocaddress(libraryhandle,'freeaddrinfo');\r
-    getnameinfo := getprocaddress(libraryhandle,'getnameinfo');\r
-    if assigned(getaddrinfo) and assigned(freeaddrinfo) and assigned(getnameinfo) then begin\r
-      //writeln('found getaddrinfo and freeaddrinfo in'+dllname);\r
-      exit; //success\r
-    end;\r
-\r
-  end;\r
-  //writeln('could not find getaddrinfo and freeaddrinfo, falling back to ipv4 only lookup');\r
-  getaddrinfo := v4onlygetaddrinfo;\r
-  freeaddrinfo := v4onlyfreeaddrinfo;\r
-  getnameinfo := v4onlygetnameinfo;\r
-end;\r
-\r
-\r
-function winforwardlookup(name : string;ipv6preffered : boolean;var error : integer) : tbinip;\r
-var\r
-  hints: taddrinfo;\r
-  res : paddrinfo;\r
-  pass : boolean;\r
-  ipv6 : boolean;\r
-  getaddrinforesult : integer;\r
-begin\r
-  populateprocvars;\r
-\r
-  for pass := false to true do begin\r
-    ipv6 := ipv6preffered xor pass;\r
-    hints.ai_flags := 0;\r
-    if ipv6 then begin\r
-      hints.ai_family := AF_INET6;\r
-    end else begin\r
-      hints.ai_family := AF_INET;\r
-    end;\r
-    hints.ai_socktype := 0;\r
-    hints.ai_protocol := 0;\r
-    hints.ai_addrlen := 0;\r
-    hints.ai_canonname := nil;\r
-    hints.ai_addr := nil;\r
-    hints.ai_next := nil;\r
-    getaddrinforesult := getaddrinfo(pchar(name),'1',@hints,@res);\r
-    if getaddrinforesult = 0 then begin\r
-      if res.ai_family = af_inet then begin\r
-        result.family := af_inet;\r
-        result.ip := res.ai_addr.InAddr.addr;\r
-      end else if res.ai_family = af_inet6 then begin\r
-        result.family := af_inet6;\r
-        result.ip6 := res.ai_addr.InAddr6.sin6_addr;\r
-      end;\r
-\r
-      freeaddrinfo(res);\r
-      exit;\r
-    end;\r
-  end;\r
-  if getaddrinforesult <> 0 then begin\r
-    fillchar(result,0,sizeof(result));\r
-    error := getaddrinforesult;\r
-  end;\r
-end;\r
-\r
-function winreverselookup(ip:tbinip;var error : integer):string;\r
-var\r
-  sa : tinetsockaddrv;\r
-  getnameinforesult : integer;\r
-begin\r
-\r
-  if ip.family = AF_INET then begin\r
-    sa.InAddr.family := AF_INET;\r
-    sa.InAddr.port := 1;\r
-    sa.InAddr.addr := ip.ip;\r
-  end else if ip.family = AF_INET6 then begin\r
-    sa.InAddr6.sin6_family  := AF_INET6;\r
-    sa.InAddr6.sin6_port := 1;\r
-    sa.InAddr6.sin6_addr := ip.ip6;\r
-  end else begin\r
-    raise exception.create('unrecognised address family');\r
-  end;\r
-  populateprocvars;\r
-  setlength(result,1025);\r
-  getnameinforesult := getnameinfo(@sa,sizeof(tinetsockaddrv),pchar(result),length(result),nil,0,0);\r
-  if getnameinforesult <> 0 then begin\r
-    error := getnameinforesult;\r
-    result := '';\r
-    exit;\r
-  end;\r
-  if pos(#0,result) >= 0 then begin\r
-    setlength(result,pos(#0,result)-1);\r
-  end;\r
-end;\r
-\r
-var\r
-  hwnddnswin : hwnd;\r
-\r
-function MyWindowProc(\r
-    ahWnd   : HWND;\r
-    auMsg   : Integer;\r
-    awParam : WPARAM;\r
-    alParam : LPARAM): Integer; stdcall;\r
-var\r
-  dwas : tdnswinasync;\r
-begin\r
-  if (ahwnd=hwnddnswin) and (aumsg=wm_user) then begin\r
-    Dwas := tdnswinasync(alparam);\r
-    dwas.hadevent := true;\r
-    if assigned (dwas.onrequestdone) then dwas.onrequestdone(dwas,awparam);\r
-    if dwas.freewhendone then dwas.free;\r
-  end else begin\r
-    //not passing unknown messages on to defwindowproc will cause window\r
-    //creation to fail! --plugwash\r
-    Result := DefWindowProc(ahWnd, auMsg, awParam, alParam)\r
-  end;\r
-end;\r
-\r
-procedure tdnswinasync.forwardlookup(name:string;ipv6preffered:boolean);\r
-begin\r
-  self.name := name;\r
-  self.ipv6preffered := ipv6preffered;\r
-  freverse := false;\r
-  resume;\r
-end;\r
-procedure tdnswinasync.reverselookup(ip:tbinip);\r
-begin\r
-  self.ip := ip;\r
-  freverse := true;\r
-  resume;\r
-end;\r
-procedure tdnswinasync.execute;\r
-var\r
-  error : integer;\r
-begin\r
-  error := 0;\r
-  if reverse then begin\r
-    name := winreverselookup(ip,error);\r
-  end else begin\r
-    ip := winforwardlookup(name,ipv6preffered,error);\r
-\r
-  end;\r
-\r
-  postmessage(hwnddnswin,wm_user,error,taddrint(self));\r
-end;\r
-\r
-destructor tdnswinasync.destroy; \r
-begin\r
-  WaitFor;\r
-  inherited destroy;\r
-end;\r
-procedure tdnswinasync.release;\r
-begin\r
-  if hadevent then destroy else begin\r
-    onrequestdone := nil;\r
-    freewhendone := true;\r
-  end;\r
-end;\r
-\r
-constructor tdnswinasync.create;\r
-begin\r
-  inherited create(true);\r
-end;\r
-\r
-var\r
-  MyWindowClass : TWndClass = (style         : 0;\r
-                                 lpfnWndProc   : @MyWindowProc;\r
-                                 cbClsExtra    : 0;\r
-                                 cbWndExtra    : 0;\r
-                                 hInstance     : 0;\r
-                                 hIcon         : 0;\r
-                                 hCursor       : 0;\r
-                                 hbrBackground : 0;\r
-                                 lpszMenuName  : nil;\r
-                                 lpszClassName : 'dnswinClass');\r
-begin\r
-\r
-    if Windows.RegisterClass(MyWindowClass) = 0 then halt;\r
-  //writeln('about to create lcore handle, hinstance=',hinstance);\r
-  hwnddnswin := CreateWindowEx(WS_EX_TOOLWINDOW,\r
-                               MyWindowClass.lpszClassName,\r
-                               '',        { Window name   }\r
-                               WS_POPUP,  { Window Style  }\r
-                               0, 0,      { X, Y          }\r
-                               0, 0,      { Width, Height }\r
-                               0,         { hWndParent    }\r
-                               0,         { hMenu         }\r
-                               HInstance, { hInstance     }\r
-                               nil);      { CreateParam   }\r
-  //writeln('dnswin hwnd is ',hwnddnswin);\r
-  //writeln('last error is ',GetLastError);\r
-end.\r