X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/d53fe26eaac895d1e7a0ba2b2b8965cf77932de8..5c04c841812bdb200cc3c73169b1542aef6c2fc3:/binipstuff.pas?ds=sidebyside diff --git a/binipstuff.pas b/binipstuff.pas old mode 100755 new mode 100644 index a1433fc..40b5f9f --- a/binipstuff.pas +++ b/binipstuff.pas @@ -8,11 +8,9 @@ interface {$include lcoreconfig.inc} -{$ifndef win32} -{$ifdef ipv6} -uses sockets; -{$endif} -{$endif} +uses + {$ifndef win32}{$ifdef ipv6}sockets,{$endif}{$endif} + pgtypes; {$ifdef fpc} {$mode delphi} @@ -23,7 +21,7 @@ uses sockets; {$include uint32.inc} const - hexchars:array[0..15] of char='0123456789abcdef'; + hexchars:array[0..15] of ansichar='0123456789abcdef'; AF_INET=2; {$ifdef win32} AF_INET6=23; @@ -86,12 +84,19 @@ type - {$ifdef ipv6} + {$ifdef ipv6} {$ifdef ver1_0} cuint16=word; cuint32=dword; sa_family_t=word; + TInetSockAddr6 = packed record + sin6_family: word; + sin6_port: word; + sin6_flowinfo: uint32; + sin6_addr: tin6_addr; + sin6_scope_id: uint32; + end; {$endif} {$endif} TinetSockAddrv = packed record @@ -113,7 +118,7 @@ bin IP list code, by beware while this is really just a string, on the interface side it must be treated as an opaque var which is passed as "var" when it needs to be modified} - tbiniplist=string; + tbiniplist=tipstring; function biniplist_new:tbiniplist; procedure biniplist_add(var l:tbiniplist;ip:tbinip); @@ -123,18 +128,18 @@ procedure biniplist_set(var l:tbiniplist;index:integer;ip:tbinip); procedure biniplist_setcount(var l:tbiniplist;newlen:integer); procedure biniplist_free(var l:tbiniplist); procedure biniplist_addlist(var l:tbiniplist;const l2:tbiniplist); -function biniplist_tostr(const l:tbiniplist):string; +function biniplist_tostr(const l:tbiniplist):tipstring; function isbiniplist(const l:tbiniplist):boolean; function htons(w:word):word; function htonl(i:uint32):uint32; -function ipstrtobin(const s:string;var binip:tbinip):boolean; -function ipstrtobinf(const s:string):tbinip; -function ipbintostr(const binip:tbinip):string; +function ipstrtobin(const s:tipstring;var binip:tbinip):boolean; +function ipstrtobinf(const s:tipstring):tbinip; +function ipbintostr(const binip:tbinip):tipstring; {$ifdef ipv6} -function ip6bintostr(const bin:tin6_addr):string; -function ip6strtobin(const s:string;var bin:tin6_addr):boolean; +function ip6bintostr(const bin:tin6_addr):tipstring; +function ip6strtobin(const s:tipstring;var bin:tin6_addr):boolean; {$endif} function comparebinip(const ip1,ip2:tbinip):boolean; @@ -144,12 +149,13 @@ function comparebinipmask(ip1,ip2:tbinip;bits:integer):boolean; procedure addipsoffamily(var l:tbiniplist;const l2:tbiniplist;family:integer); {deprecated} -function longip(s:string):longint; +function longip(s:tipstring):longint; +function needconverttov4(const ip:tbinip):boolean; procedure converttov4(var ip:tbinip); function inaddrvtobinip(inaddrv:tinetsockaddrv):tbinip; -function makeinaddrv(addr:tbinip;port:string;var inaddr:tinetsockaddrv):integer; +function makeinaddrv(addr:tbinip;port:ansistring;var inaddr:tinetsockaddrv):integer; function inaddrsize(inaddr:tinetsockaddrv):integer; implementation @@ -184,7 +190,7 @@ begin {$endif} end; -function makeinaddrv(addr:tbinip;port:string;var inaddr:tinetsockaddrv):integer; +function makeinaddrv(addr:tbinip;port:ansistring;var inaddr:tinetsockaddrv):integer; begin result := 0; { biniptemp := forwardlookup(addr,10);} @@ -216,11 +222,11 @@ end; {internal} {converts dotted v4 IP to longint. returns host endian order} -function longip(s:string):longint; +function longip(s:tipstring):longint; var l:longint; a,b:integer; -function convertbyte(const s:string):integer; +function convertbyte(const s:ansistring):integer; begin result := strtointdef(s,-1); if result < 0 then begin @@ -271,7 +277,7 @@ begin ipstrtobin(s,result); end; -function ipstrtobin(const s:string;var binip:tbinip):boolean; +function ipstrtobin(const s:tipstring;var binip:tbinip):boolean; begin binip.family := 0; result := false; @@ -293,7 +299,7 @@ begin end; end; -function ipbintostr(const binip:tbinip):string; +function ipbintostr(const binip:tbinip):tipstring; var a:integer; begin @@ -316,7 +322,7 @@ end; { IPv6 address binary to/from string conversion routines -written by beware (steendijk at xs4all dot nl) +written by beware - implementation does not depend on other ipv6 code such as the tin6_addr type, the parameter can also be untyped. @@ -329,9 +335,9 @@ written by beware (steendijk at xs4all dot nl) {fpc has hostaddrtostr6 and strtohostaddr6 but the later isnt implemented yet} -function ip6bintostr(const bin:tin6_addr):string; +function ip6bintostr(const bin:tin6_addr):tipstring; {base16 with lowercase output} -function makehex(w:word):string; +function makehex(w:word):ansistring; begin result := ''; if w >= 4096 then result := result + hexchars[w shr 12]; @@ -387,10 +393,10 @@ begin end; end; -function ip6strtobin(const s:string;var bin:tin6_addr):boolean; +function ip6strtobin(const s:tipstring;var bin:tin6_addr):boolean; var a,b:integer; - fields:array[0..7] of string; + fields:array[0..7] of ansistring; fieldcount:integer; emptyfield:integer; wordcount:integer; @@ -501,26 +507,42 @@ begin result := comparebinip(ip1,ip2); end; -{converts a binary IP to v4 if it is a v6 IP in the v4 range} -procedure converttov4(var ip:tbinip); +function needconverttov4(const ip:tbinip):boolean; begin {$ifdef ipv6} if ip.family = AF_INET6 then begin if (ip.ip6.u6_addr32[0] = 0) and (ip.ip6.u6_addr32[1] = 0) and (ip.ip6.u6_addr16[4] = 0) and (ip.ip6.u6_addr16[5] = $ffff) then begin - ip.family := AF_INET; - ip.ip := ip.ip6.s6_addr32[3]; + result := true; + exit; end; end; {$endif} + + result := false; +end; + +{converts a binary IP to v4 if it is a v6 IP in the v4 range} +procedure converttov4(var ip:tbinip); +begin + {$ifdef ipv6} + if needconverttov4(ip) then begin + ip.family := AF_INET; + ip.ip := ip.ip6.s6_addr32[3]; + end; + {$endif} end; {-----------biniplist stuff--------------------------------------------------} const - biniplist_prefix='bipl'#0; - biniplist_prefixlen=length(biniplist_prefix); + biniplist_prefix: ansistring = 'bipl'#0; + //fpc 1.0.x doesn't seem to like use of length function in a constant + //definition + //biniplist_prefixlen=length(biniplist_prefix); + biniplist_prefixlen=5; + function biniplist_new:tbiniplist; begin result := biniplist_prefix; @@ -570,7 +592,7 @@ begin l := l + copy(l2,biniplist_prefixlen+1,maxlongint); end; -function biniplist_tostr(const l:tbiniplist):string; +function biniplist_tostr(const l:tbiniplist):tipstring; var a:integer; begin