|
@@ -219,9 +219,193 @@ begin
|
|
|
{$endif}
|
|
|
end;
|
|
|
|
|
|
+Type array4int = array[1..4] of byte;
|
|
|
+
|
|
|
+function NetAddrToStr (Entry : in_addr) : AnsiString;
|
|
|
+
|
|
|
+Var Dummy : Ansistring;
|
|
|
+ i,j : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ NetAddrToStr:='';
|
|
|
+ j:=entry.s_addr;
|
|
|
+ For I:=1 to 4 do
|
|
|
+ begin
|
|
|
+ Str(array4int(j)[i],Dummy);
|
|
|
+ NetAddrToStr:=NetAddrToStr+Dummy;
|
|
|
+ If I>1 Then
|
|
|
+ NetAddrToStr:=NetAddrToStr+'.';
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function HostAddrToStr (Entry : in_addr) : AnsiString;
|
|
|
+
|
|
|
+Var x: in_addr;
|
|
|
+
|
|
|
+begin
|
|
|
+ x.s_addr:=htonl(entry.s_addr);
|
|
|
+ HostAddrToStr:=NetAddrToStr(x);
|
|
|
+end;
|
|
|
+
|
|
|
+function StrToHostAddr(IP : AnsiString) : in_addr ;
|
|
|
+
|
|
|
+Var
|
|
|
+ Dummy : AnsiString;
|
|
|
+ I,j,k : Longint;
|
|
|
+ Temp : in_addr;
|
|
|
+
|
|
|
+begin
|
|
|
+ strtohostaddr.s_addr:=0; //:=NoAddress;
|
|
|
+ For I:=1 to 4 do
|
|
|
+ begin
|
|
|
+ If I<4 Then
|
|
|
+ begin
|
|
|
+ J:=Pos('.',IP);
|
|
|
+ If J=0 then
|
|
|
+ exit;
|
|
|
+ Dummy:=Copy(IP,1,J-1);
|
|
|
+ Delete (IP,1,J);
|
|
|
+ end
|
|
|
+ else
|
|
|
+ Dummy:=IP;
|
|
|
+ Val (Dummy,k,J);
|
|
|
+ array4int(temp.s_addr)[i]:=k;
|
|
|
+ If J<>0 then Exit;
|
|
|
+ end;
|
|
|
+ strtohostaddr.s_addr:=ntohl(Temp.s_addr);
|
|
|
+end;
|
|
|
+
|
|
|
+function StrToNetAddr(IP : AnsiString) : in_addr;
|
|
|
+
|
|
|
+begin
|
|
|
+ StrToNetAddr.s_addr:=htonl(StrToHostAddr(IP).s_addr);
|
|
|
+end;
|
|
|
+
|
|
|
+Function HostToNet (Host : in_addr):in_addr;
|
|
|
+
|
|
|
+begin
|
|
|
+ HostToNet.s_addr:=htonl(host.s_addr);
|
|
|
+end;
|
|
|
+
|
|
|
+Function NetToHost (Net : in_addr) : in_addr;
|
|
|
+
|
|
|
+begin
|
|
|
+ NetToHost.s_addr:=ntohl(net.s_addr);
|
|
|
+end;
|
|
|
+
|
|
|
+Function HostToNet (Host : Longint) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ HostToNet:=htonl(host);
|
|
|
+end;
|
|
|
+
|
|
|
+Function NetToHost (Net : Longint) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ NetToHost:=ntohl(net);
|
|
|
+end;
|
|
|
+
|
|
|
+Function ShortHostToNet (Host : Word) : Word;
|
|
|
+
|
|
|
+begin
|
|
|
+ ShortHostToNet:=htons(host);
|
|
|
+end;
|
|
|
+
|
|
|
+Function ShortNetToHost (Net : Word) : Word;
|
|
|
+
|
|
|
+begin
|
|
|
+ ShortNEtToHost:=ntohs(net);
|
|
|
+end;
|
|
|
+
|
|
|
+const digittab : shortstring = ('0123456789ABCDEF');
|
|
|
+
|
|
|
+function lclinttohex (i:integer;digits:longint): ansistring;
|
|
|
+
|
|
|
+var j,k : integer;
|
|
|
+
|
|
|
+begin
|
|
|
+ SetLength(lclinttohex,4);
|
|
|
+ lclinttohex[4]:=digittab[1+(i and 15)];
|
|
|
+ lclinttohex[3]:=digittab[1+((i shr 4) and 15)];
|
|
|
+ lclinttohex[2]:=digittab[1+((i shr 8) and 15)];
|
|
|
+ lclinttohex[1]:=digittab[1+((i shr 12) and 15)];;
|
|
|
+end;
|
|
|
+
|
|
|
+function HostAddrToStr6 (Entry : TIn6_Addr) :ansiString;
|
|
|
+var
|
|
|
+ i: byte;
|
|
|
+ zr1,zr2: set of byte;
|
|
|
+ zc1,zc2: byte;
|
|
|
+ have_skipped: boolean;
|
|
|
+begin
|
|
|
+ zr1 := [];
|
|
|
+ zr2 := [];
|
|
|
+ zc1 := 0;
|
|
|
+ zc2 := 0;
|
|
|
+ for i := 0 to 7 do begin
|
|
|
+ if Entry.u6_addr16[i] = 0 then begin
|
|
|
+ include(zr2, i);
|
|
|
+ inc(zc2);
|
|
|
+ end else begin
|
|
|
+ if zc1 < zc2 then begin
|
|
|
+ zc1 := zc2;
|
|
|
+ zr1 := zr2;
|
|
|
+ zc2 := 0; zr2 := [];
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ if zc1 < zc2 then begin
|
|
|
+ zc1 := zc2;
|
|
|
+ zr1 := zr2;
|
|
|
+ end;
|
|
|
+ SetLength(HostAddrToStr6, 8*5-1);
|
|
|
+ SetLength(HostAddrToStr6, 0);
|
|
|
+ have_skipped := false;
|
|
|
+ for i := 0 to 7 do begin
|
|
|
+ if not (i in zr1) then begin
|
|
|
+ if have_skipped then begin
|
|
|
+ if HostAddrToStr6 = ''
|
|
|
+ then HostAddrToStr6 := '::'
|
|
|
+ else HostAddrToStr6 := HostAddrToStr6 + ':';
|
|
|
+ have_skipped := false;
|
|
|
+ end;
|
|
|
+ // FIXME: is that shortnettohost really proper there? I wouldn't be too sure...
|
|
|
+ HostAddrToStr6 := HostAddrToStr6 +lclIntToHex(ShortNetToHost(Entry.u6_addr16[i]), 1) + ':';
|
|
|
+ end else begin
|
|
|
+ have_skipped := true;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ if have_skipped then
|
|
|
+ if HostAddrToStr6 = ''
|
|
|
+ then HostAddrToStr6 := '::'
|
|
|
+ else HostAddrToStr6 := HostAddrToStr6 + ':';
|
|
|
+
|
|
|
+ if HostAddrToStr6 = '' then HostAddrToStr6 := '::';
|
|
|
+ if not (7 in zr1) then
|
|
|
+ SetLength(HostAddrToStr6, Length(HostAddrToStr6)-1);
|
|
|
+end;
|
|
|
+
|
|
|
+function StrToHostAddr6(IP : String) : TIn6_addr;
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+function NetAddrToStr6 (Entry : TIn6_Addr) : ansiString;
|
|
|
+begin
|
|
|
+ netaddrtostr6 := HostAddrToStr6((Entry));
|
|
|
+end;
|
|
|
+
|
|
|
+function StrToNetAddr6(IP : ansiString) : TIn6_Addr;
|
|
|
+begin
|
|
|
+ StrToNetAddr6 := StrToHostAddr6(IP);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.14 2004-11-01 19:39:19 peter
|
|
|
+ Revision 1.15 2005-02-13 19:59:57 marco
|
|
|
+ * More htons like functionality. IPV6 string support still missing
|
|
|
+
|
|
|
+ Revision 1.14 2004/11/01 19:39:19 peter
|
|
|
* disable inline for 1.9.4
|
|
|
|
|
|
Revision 1.13 2004/11/01 17:29:47 marco
|