resolve.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. {$MODE OBJFPC}
  2. {$H+}
  3. Unit resolve;
  4. {$ifndef win32}
  5. // Here till BSD supports the netbsd unit.
  6. {$ifdef linux}
  7. // Undefine this to use the C library resolve routines.
  8. // Don't use under win32, netdb does not work on Win32 (yet) !!
  9. {$define usenetdb}
  10. {$endif linux}
  11. {$endif}
  12. { --------------------------------------------------------------------
  13. Unit for internet domain calls.
  14. Copyright (C) 2003 Michael Van Canneyt
  15. This program is free software; you can redistribute it and/or modify
  16. it under the terms of the GNU General Public License as published by
  17. the Free Software Foundation; either version 1, or (at your option)
  18. any later version.
  19. This program is distributed in the hope that it will be useful,
  20. but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22. GNU General Public License for more details.
  23. You should have received a copy of the GNU General Public License
  24. along with this program; if not, write to the Free Software
  25. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26. ------------------------------------------------------------------- }
  27. interface
  28. uses
  29. Classes;
  30. Type
  31. THostAddr = array[1..4] of byte;
  32. PHostAddr = ^THostAddr;
  33. TNetAddr = THostAddr;
  34. PNetAddr = ^TNetAddr;
  35. Const
  36. NoAddress : THostAddr = (0,0,0,0);
  37. NoNet : TNetAddr = (0,0,0,0);
  38. { ---------------------------------------------------------------------
  39. Axuliary routines
  40. ---------------------------------------------------------------------}
  41. function HostAddrToStr (Entry : THostAddr) : String;
  42. function StrToHostAddr (IP : String) : THostAddr;
  43. function NetAddrToStr (Entry : TNetAddr) : String;
  44. function StrToNetAddr (IP : String) : TNetAddr;
  45. Function HostToNet (Host : ThostAddr) : ThostAddr;
  46. Function HostToNet (Host : Longint) : Longint;
  47. Function NetToHost (Net : Longint) : Longint;
  48. Function NetToHost (Net : TNetAddr) : TNetAddr;
  49. Function ShortHostToNet (Host : Word) : Word;
  50. Function ShortNetToHost (Net : Word) : Word;
  51. Type
  52. { ---------------------------------------------------------------------
  53. TResolver
  54. ---------------------------------------------------------------------}
  55. TResolver = Class (TComponent)
  56. Private
  57. FName : String;
  58. FAliases : TStringList;
  59. FRaiseOnError : Boolean;
  60. FLastError: Integer;
  61. Function GetAlias(Index : Integer) : STring;
  62. Function GetAliasCount : Integer;
  63. Function GetAliasSorted : Boolean;
  64. Procedure SetAliasSorted (Value : Boolean);
  65. Protected
  66. Procedure CheckOperation(Msg : String);
  67. Function NameLookup(Const S : String) : Boolean; virtual;
  68. Procedure SaveAliases(P : PPChar);
  69. Public
  70. Constructor Create(AOwner : TComponent); override;
  71. Destructor Destroy; override;
  72. Procedure ClearData; virtual;
  73. Property ResolvedName : String Read FName;
  74. Property Aliases [Index : integer ] : string Read GetAlias;
  75. Property AliasCount : Integer read GetAliasCount;
  76. Property SortAliases : Boolean Read GetAliasSorted Write SetAliasSorted;
  77. Property RaiseOnError : Boolean Read FRaiseOnError Write FRAiseOnError;
  78. Property LastError : Integer Read FlastError;
  79. end;
  80. { ---------------------------------------------------------------------
  81. THostResolver
  82. ---------------------------------------------------------------------}
  83. THostResolver = Class(TResolver)
  84. Private
  85. FHostAddress : THostAddr;
  86. FAddressCount : Integer;
  87. FAddresses : PHostAddr;
  88. Function GetAddress (Index : Integer) : THostAddr;
  89. Function GetNetAddress (Index : Integer) : THostAddr;
  90. Function GetNetHostAddress : THostAddr;
  91. Function GetAsString : String;
  92. Procedure SaveHostEntry (Entry : Pointer);
  93. Public
  94. Procedure ClearData; Override;
  95. Function NameLookup(Const S : String) : Boolean; override;
  96. Function AddressLookup(Const S : String) : Boolean; virtual;
  97. Function AddressLookup(Const Address : THostAddr) : Boolean; virtual;
  98. Property HostAddress : THostAddr Read FHostAddress;
  99. Property NetHostAddress : THostAddr Read GetNetHostAddress;
  100. Property AddressAsString : String Read GetAsString;
  101. Property AddressCount : Integer Read FAddressCount ;
  102. Property Addresses [Index : Integer] : ThostAddr Read GetAddress;
  103. Property NetAddresses [Index : Integer] : ThostAddr Read GetNetAddress;
  104. end;
  105. { ---------------------------------------------------------------------
  106. TNetResolver
  107. ---------------------------------------------------------------------}
  108. TNetResolver = Class(TResolver)
  109. Private
  110. FNetAddress : TNetAddr;
  111. FAddrType : Integer;
  112. Function GetAsString : String;
  113. Procedure SaveNetEntry(Entry : Pointer);
  114. Function GetNetAddress : TNetAddr;
  115. Public
  116. Procedure ClearData; override;
  117. Function NameLookup(Const S : String) : boolean; override;
  118. Function AddressLookup(Const S : String) : Boolean; virtual;
  119. Function AddressLookup(Const Address : TNetAddr) : Boolean; virtual;
  120. Property NetAddress : TNetAddr Read FNetAddress;
  121. Property NetNetAddress : TNetAddr Read GetNetAddress;
  122. Property AddressAsString : String Read GetAsString;
  123. Property AddressType : Integer Read FAddrType;
  124. end;
  125. { ---------------------------------------------------------------------
  126. TServiceResolver
  127. ---------------------------------------------------------------------}
  128. TServiceResolver = Class(TResolver)
  129. private
  130. FProtocol : String;
  131. FPort : Integer;
  132. Procedure SaveServiceEntry(Entry : Pointer);
  133. Function GetNetPort : Integer ;
  134. public
  135. Procedure ClearData; override;
  136. Function NameLookup (Const S : String) : boolean; override;
  137. Function NameLookup (Const S,Proto : String) : Boolean;
  138. Function PortLookup (APort : Longint; Proto: string) : Boolean;
  139. Property Protocol : String Read FProtocol;
  140. Property Port : Integer Read FPort;
  141. Property NetPort : Integer Read GetNetPort;
  142. end;
  143. Resourcestring
  144. SErrHostByName = 'Host by name';
  145. SErrHostByAddr = 'Host by address';
  146. SErrNetByName = 'Net by name';
  147. SErrServByName = 'Service by name';
  148. SErrServByPort = 'Service by port';
  149. Implementation
  150. { ---------------------------------------------------------------------
  151. Include system dependent stuff.
  152. ---------------------------------------------------------------------}
  153. {$ifdef usenetdb}
  154. uses netdb;
  155. {$else}
  156. {$i resolve.inc}
  157. {$endif}
  158. function HostAddrToStr (Entry : THostAddr) : String;
  159. Var Dummy : String[4];
  160. I : Longint;
  161. begin
  162. HostAddrToStr:='';
  163. For I:=1 to 4 do
  164. begin
  165. Str(Entry[I],Dummy);
  166. HostAddrToStr:=HostAddrToStr+Dummy;
  167. If I<4 Then
  168. HostAddrToStr:=HostAddrToStr+'.';
  169. end;
  170. end;
  171. function StrToHostAddr(IP : String) : THostAddr ;
  172. Var
  173. Dummy : String;
  174. I : Longint;
  175. J : Integer;
  176. Temp : THostAddr;
  177. begin
  178. Result:=NoAddress;
  179. For I:=1 to 4 do
  180. begin
  181. If I<4 Then
  182. begin
  183. J:=Pos('.',IP);
  184. If J=0 then
  185. exit;
  186. Dummy:=Copy(IP,1,J-1);
  187. Delete (IP,1,J);
  188. end
  189. else
  190. Dummy:=IP;
  191. Val (Dummy,Temp[I],J);
  192. If J<>0 then Exit;
  193. end;
  194. Result:=Temp;
  195. end;
  196. function NetAddrToStr (Entry : TNetAddr) : String;
  197. Var Dummy : String[4];
  198. I : Longint;
  199. begin
  200. NetAddrToStr:='';
  201. For I:=4 downto 1 do
  202. begin
  203. Str(Entry[I],Dummy);
  204. NetAddrToStr:=NetAddrToStr+Dummy;
  205. If I>1 Then
  206. NetAddrToStr:=NetAddrToStr+'.';
  207. end;
  208. end;
  209. function StrToNetAddr(IP : String) : TNetAddr;
  210. begin
  211. StrToNetAddr:=TNetAddr(StrToHostAddr(IP));
  212. end;
  213. Function HostToNet (Host : ThostAddr) : THostAddr;
  214. begin
  215. Result[1]:=Host[4];
  216. Result[2]:=Host[3];
  217. Result[3]:=Host[2];
  218. Result[4]:=Host[1];
  219. end;
  220. Function NetToHost (Net : TNetAddr) : TNetAddr;
  221. begin
  222. Result[1]:=Net[4];
  223. Result[2]:=Net[3];
  224. Result[3]:=Net[2];
  225. Result[4]:=Net[1];
  226. end;
  227. Function HostToNet (Host : Longint) : Longint;
  228. begin
  229. Result:=Longint(HostToNet(THostAddr(host)));
  230. end;
  231. Function NetToHost (Net : Longint) : Longint;
  232. begin
  233. Result:=Longint(NetToHost(TNetAddr(Net)));
  234. end;
  235. Function ShortHostToNet (Host : Word) : Word;
  236. begin
  237. ShortHostToNet:=lo(host)*256+Hi(Host);
  238. end;
  239. Function ShortNetToHost (Net : Word) : Word;
  240. begin
  241. ShortNetToHost:=lo(Net)*256+Hi(Net);
  242. end;
  243. { ---------------------------------------------------------------------
  244. TResolver
  245. ---------------------------------------------------------------------}
  246. Constructor TResolver.Create(AOwner : TComponent);
  247. begin
  248. Inherited;
  249. FAliases:=TstringList.Create;
  250. end;
  251. Destructor TResolver.Destroy;
  252. begin
  253. ClearData;
  254. FAliases.Free;
  255. end;
  256. Procedure TResolver.ClearData;
  257. begin
  258. FName:='';
  259. FAliases.Clear;
  260. end;
  261. Function TResolver.GetAlias(Index : Integer) : STring;
  262. begin
  263. Result:=FAliases[Index];
  264. end;
  265. Function TResolver.GetAliasCount : Integer;
  266. begin
  267. Result:=FAliases.Count;
  268. end;
  269. Function TResolver.GetAliasSorted : Boolean;
  270. begin
  271. Result:=FAliases.Sorted;
  272. end;
  273. Procedure TResolver.SetAliasSorted (Value : Boolean);
  274. begin
  275. FAliases.Sorted:=Value;
  276. end;
  277. Procedure TResolver.CheckOperation(Msg : String);
  278. begin
  279. end;
  280. Function TResolver.NameLookup(Const S : String) : Boolean;
  281. begin
  282. ClearData;
  283. FName:=S;
  284. Result:=True;
  285. end;
  286. Procedure TResolver.SaveAliases(P : PPChar);
  287. Var
  288. I : Integer;
  289. begin
  290. If (P<>Nil) then
  291. begin
  292. I:=0;
  293. While P[I]<>Nil do
  294. begin
  295. FAliases.Add(StrPas(P[I]));
  296. Inc(I);
  297. end;
  298. end;
  299. end;
  300. { ---------------------------------------------------------------------
  301. THostResolver
  302. ---------------------------------------------------------------------}
  303. Function THostResolver.GetAddress (Index : Integer) : THostAddr;
  304. begin
  305. If (Index>=0) and (Index<FAddressCount) then
  306. Result:=FAddresses[Index];
  307. end;
  308. Function THostResolver.GetAsString : String;
  309. begin
  310. Result:=HostAddrToStr(FHostAddress);
  311. end;
  312. Procedure THostResolver.ClearData;
  313. begin
  314. Inherited;
  315. FHostAddress:=NoAddress;
  316. If FAddressCount<>0 Then
  317. FreeMem(FAddresses);
  318. FAddressCount:=0;
  319. FAddresses:=Nil;
  320. end;
  321. Function THostResolver.AddressLookup(Const S : String) : Boolean;
  322. begin
  323. Result:=AddressLookup(StrToHostAddr(S));
  324. end;
  325. {$ifdef usenetdb}
  326. Function THostResolver.NameLookup (Const S : String) : Boolean;
  327. Var
  328. H : THostEntry;
  329. begin
  330. Result:=Inherited NameLookup(S);
  331. If Result then
  332. begin
  333. Result:=GetHostByName(S,H);
  334. If Result then
  335. SaveHostEntry(@H);
  336. end;
  337. end;
  338. Function THostResolver.AddressLookup (Const Address: THostAddr) : Boolean;
  339. Var
  340. H : THostEntry;
  341. begin
  342. ClearData;
  343. Result:=GetHostByAddr(Address,H);
  344. If Result then
  345. SaveHostEntry(@H);
  346. end;
  347. Procedure THostResolver.SaveHostEntry(Entry : Pointer);
  348. Var
  349. PH : ^THostEntry;
  350. I : Integer;
  351. begin
  352. PH:=ENtry;
  353. FName:=PH^.Name;
  354. FHostAddress:=PH^.Addr;
  355. FAddressCount:=1;
  356. GetMem(FAddresses,SizeOf(THostAddr));
  357. FAddresses[0]:=PH^.Addr;
  358. FAliases.CommaText:=PH^.Aliases;
  359. end;
  360. {$else}
  361. Function THostResolver.NameLookup (Const S : String) : Boolean;
  362. Var
  363. FHostEntry : PHostEntry;
  364. begin
  365. Result:=Inherited NameLookup(S);
  366. If Result then
  367. begin
  368. FHostEntry:=GetHostByName(pchar(FName));
  369. Result:=FHostEntry<>Nil;
  370. If Result then
  371. SaveHostEntry(FHostEntry)
  372. else
  373. begin
  374. FLastError:=GetDNSError;
  375. CheckOperation(SErrHostByName);
  376. end;
  377. end;
  378. end;
  379. Procedure THostResolver.SaveHostEntry(Entry : Pointer);
  380. Var
  381. P : Pointer;
  382. I,Count : Integer;
  383. begin
  384. With PHostEntry(Entry)^ do
  385. begin
  386. FName:=StrPas(H_Name);
  387. FAddressCount:=0;
  388. While H_Addr[FAddressCount]<>Nil do
  389. Inc(FAddressCount);
  390. If FAddressCount>0 then
  391. begin
  392. GetMem(FAddresses,FAddressCount*SizeOf(THostAddr));
  393. For I:=0 to FAddressCount-1 do
  394. FAddresses[I]:=PHostAddr(H_Addr[I])^;
  395. FHostAddress:=FAddresses[0];
  396. end;
  397. SaveAliases(H_Aliases);
  398. end;
  399. end;
  400. Function THostResolver.AddressLookup (Const Address: THostAddr) : Boolean;
  401. Var
  402. FHostEntry : PHostEntry;
  403. begin
  404. ClearData;
  405. FHostEntry:=GetHostByAddr(Pchar(@Address),SizeOf(Address),AF_INET);
  406. Result:=FHostEntry<>Nil;
  407. If Result then
  408. SaveHostEntry(FHostEntry)
  409. else
  410. begin
  411. FLastError:=GetDNSError;
  412. CheckOperation(SErrHostByAddr);
  413. end;
  414. end;
  415. {$endif}
  416. Function THostResolver.GetNetAddress (Index : Integer) : THostAddr;
  417. begin
  418. Result:=HostToNet(Addresses[Index]);
  419. end;
  420. Function THostResolver.GetNetHostAddress : THostAddr;
  421. begin
  422. Result:=HostToNet(FHostAddress);
  423. end;
  424. { ---------------------------------------------------------------------
  425. TNetResolver
  426. ---------------------------------------------------------------------}
  427. {$ifdef usenetdb}
  428. Function TNetResolver.AddressLookup (Const Address: TNetAddr) : boolean;
  429. Var
  430. N : TNetworkEntry;
  431. begin
  432. ClearData;
  433. Result:=GetNetworkByAddr(Address,N);
  434. If Result then
  435. SaveNetEntry(@N);
  436. end;
  437. Function TNetResolver.NameLookup (Const S : String) : Boolean;
  438. Var
  439. N : TNetworkEntry;
  440. begin
  441. Result:=Inherited NameLookup(S);
  442. If Result then
  443. begin
  444. Result:=GetNetworkByName(S,N);
  445. If Result then
  446. SaveNetEntry(@N);
  447. end;
  448. end;
  449. Procedure TNetResolver.SaveNetEntry(Entry : Pointer);
  450. Var
  451. PN : ^TNetworkEntry;
  452. begin
  453. PN:=ENtry;
  454. FName:=PN^.Name;
  455. FNetAddress:=PN^.Addr;
  456. FAliases.CommaText:=PN^.Aliases;
  457. end;
  458. {$else}
  459. Function TNetResolver.NameLookup (Const S : String) : Boolean;
  460. Var
  461. FNetEntry : PNetEntry;
  462. begin
  463. Result:=Inherited NameLookup(S);
  464. If Result then
  465. begin
  466. FNetEntry:=GetNetByName(pchar(S));
  467. Result:=FNetEntry<>Nil;
  468. If Result then
  469. SaveNetEntry(FNetEntry)
  470. else
  471. begin
  472. FLastError:=GetDNSError;
  473. Checkoperation(SErrNetByName);
  474. end;
  475. end;
  476. end;
  477. Procedure TNetResolver.SaveNetEntry(Entry : Pointer);
  478. begin
  479. With PNetEntry(Entry)^ do
  480. begin
  481. FName:=StrPas(N_Name);
  482. FAddrType:=N_addrtype;
  483. FNetAddress:=NetToHost(TNetAddr(N_net));
  484. SaveAliases(N_Aliases);
  485. end;
  486. end;
  487. Function TNetResolver.AddressLookup (Const Address: TNetAddr) : boolean;
  488. Var
  489. FNetEntry : PNetEntry;
  490. begin
  491. ClearData;
  492. {$ifndef win32}
  493. FNetEntry:=GetNetByAddr(Longint(HostToNet(Address)),AF_INET);
  494. {$else}
  495. FNetEntry:=Nil;
  496. {$endif}
  497. Result:=FNetEntry<>Nil;
  498. If Result then
  499. SaveNetEntry(FNetEntry)
  500. else
  501. begin
  502. FLastError:=GetDNSError;
  503. CheckOperation(SErrNetByName);
  504. end;
  505. end;
  506. {$endif}
  507. Function TNetResolver.AddressLookup(Const S : String) : Boolean;
  508. begin
  509. Result:=AddressLookup(StrToNetAddr(S));
  510. end;
  511. Function TNetResolver.GetAsString : String;
  512. begin
  513. Result:=HostAddrToStr(FNetAddress);
  514. end;
  515. Function TNetResolver.GetNetAddress : TNetAddr;
  516. begin
  517. Result:=HostToNet(FNetAddress);
  518. end;
  519. Procedure TNetResolver.ClearData;
  520. begin
  521. Inherited;
  522. FNetAddress:=NoAddress;
  523. FAddrType:=0;
  524. end;
  525. { ---------------------------------------------------------------------
  526. TServiceResolver
  527. ---------------------------------------------------------------------}
  528. Function TServiceResolver.NameLookup (Const S : String) : Boolean;
  529. begin
  530. Result:=NameLookup(S,'');
  531. end;
  532. {$ifdef usenetdb}
  533. Function TServiceResolver.NameLookup (Const S,Proto : String) : Boolean;
  534. Var
  535. E : TServiceEntry;
  536. begin
  537. ClearData;
  538. Result:=GetServiceByName(S,Proto,E);
  539. If Result then
  540. SaveServiceEntry(@E);
  541. end;
  542. Function TServiceResolver.PortLookup (APort: Longint; Proto : String) : Boolean;
  543. Var
  544. E : TServiceEntry;
  545. begin
  546. ClearData;
  547. Result:=GetServiceByPort(APort,Proto,E);
  548. If Result then
  549. SaveServiceEntry(@E);
  550. end;
  551. Procedure TServiceResolver.SaveServiceEntry(Entry : Pointer);
  552. Var
  553. PE : ^TServiceEntry;
  554. begin
  555. PE:=Entry;
  556. FName:=PE^.Name;
  557. FPort:=PE^.Port;
  558. FProtocol:=PE^.Protocol;
  559. FAliases.CommaText:=PE^.Aliases;
  560. end;
  561. {$else}
  562. Function TServiceResolver.NameLookup (Const S,Proto : String) : Boolean;
  563. Var
  564. FServiceEntry : PServEntry;
  565. begin
  566. ClearData;
  567. FName:=S;
  568. FProtocol:=Proto;
  569. If (proto='') then
  570. FServiceEntry:=GetServByName(pchar(S),Nil)
  571. else
  572. FServiceEntry:=GetServByName(pchar(S),PChar(FProtocol));
  573. Result:=FServiceEntry<>Nil;
  574. If Result then
  575. SaveServiceEntry(FServiceEntry)
  576. else
  577. begin
  578. FLastError:=GetDNSError;
  579. CheckOperation(SErrServByName);
  580. end;
  581. end;
  582. Function TServiceResolver.PortLookup (APort: Longint; Proto : String) : Boolean;
  583. Var
  584. FServiceEntry : PServEntry;
  585. begin
  586. ClearData;
  587. APort:=ShortHostToNet(APort);
  588. FProtoCol:=Proto;
  589. If (Proto='') then
  590. FServiceEntry:=GetServByPort(APort,Nil)
  591. else
  592. FServiceEntry:=GetServByPort(APort,pchar(Proto));
  593. Result:=FServiceEntry<>Nil;
  594. If Result then
  595. SaveServiceEntry(FServiceEntry)
  596. else
  597. begin
  598. FLastError:=GetDNSError;
  599. CheckOperation(SErrServByPort);
  600. end;
  601. end;
  602. Procedure TServiceResolver.SaveServiceEntry(Entry : Pointer);
  603. begin
  604. With PServEntry(Entry)^ do
  605. begin
  606. FName:=strpas(s_name);
  607. FPort:=ShortHostToNet(S_port);
  608. FProtocol:=strpas(s_proto);
  609. SaveAliases(S_aliases);
  610. end;
  611. end;
  612. {$endif}
  613. Procedure TServiceResolver.ClearData;
  614. begin
  615. Inherited;
  616. FProtocol:='';
  617. FPort:=0;
  618. end;
  619. Function TServiceResolver.GetNetPort : Integer;
  620. begin
  621. Result:=ShortHostToNet(FPort);
  622. end;
  623. {$ifdef usenetdb}
  624. Procedure InitResolve;
  625. begin
  626. end;
  627. Procedure FinalResolve;
  628. begin
  629. end;
  630. {$endif}
  631. Initialization
  632. InitResolve;
  633. Finalization
  634. FinalResolve;
  635. end.
  636. {
  637. $Log$
  638. Revision 1.3 2003-03-07 20:33:33 michael
  639. Use native pascal netdb on Linux
  640. Revision 1.2 2003/02/03 10:14:12 michael
  641. + Added init/final routines to initialize winsock library
  642. Revision 1.1 2003/02/01 16:50:38 michael
  643. + Added resolve unit for WIndows/unix
  644. }