|
30 | 30 | -define(IF(Cond), (case (Cond) of true -> (0); false -> (1) end)). |
31 | 31 |
|
32 | 32 | apiversion() -> |
33 | | - "8.6.1". |
| 33 | + "8.6.2". |
34 | 34 |
|
35 | 35 | getapiversion() -> |
36 | 36 | io:format("API Version: ~p~n", [apiversion()]). |
@@ -369,18 +369,57 @@ query(Ip) -> |
369 | 369 | Result = case inet:parse_address(Ip) of |
370 | 370 | {ok, {X1, X2, X3, X4}} -> |
371 | 371 | Ipnum = (X1 bsl 24) + (X2 bsl 16) + (X3 bsl 8) + (X4), |
372 | | - search4(S, Ipnum, Databasetype, 0, Ipv4databasecount, Ipv4databaseaddr, Ipv4indexbaseaddr, Ipv4columnsize); |
| 372 | + if |
| 373 | + Ipnum == 4294967295 -> |
| 374 | + Ipnum2 = Ipnum - 1; |
| 375 | + true -> |
| 376 | + Ipnum2 = Ipnum |
| 377 | + end, |
| 378 | + search4(S, Ipnum2, Databasetype, 0, Ipv4databasecount, Ipv4databaseaddr, Ipv4indexbaseaddr, Ipv4columnsize); |
373 | 379 | {ok, {X1, X2, X3, X4, X5, X6, X7, X8}} -> |
374 | 380 | Ipnum = (X1 bsl 112) + (X2 bsl 96) + (X3 bsl 80) + (X4 bsl 64) + (X5 bsl 48) + (X6 bsl 32) + (X7 bsl 16) + X8, |
375 | 381 | if |
376 | 382 | Ipnum >= Fromv4mapped andalso Ipnum =< Tov4mapped -> |
377 | | - search4(S, Ipnum - Fromv4mapped, Databasetype, 0, Ipv4databasecount, Ipv4databaseaddr, Ipv4indexbaseaddr, Ipv4columnsize); |
| 383 | + Ipnum2 = Ipnum - Fromv4mapped, |
| 384 | + if |
| 385 | + Ipnum2 == 4294967295 -> |
| 386 | + Ipnum3 = Ipnum2 - 1; |
| 387 | + true -> |
| 388 | + Ipnum3 = Ipnum2 |
| 389 | + end, |
| 390 | + search4(S, Ipnum3, Databasetype, 0, Ipv4databasecount, Ipv4databaseaddr, Ipv4indexbaseaddr, Ipv4columnsize); |
378 | 391 | Ipnum >= From6to4 andalso Ipnum =< To6to4 -> |
379 | | - search4(S, (Ipnum bsr 80) band Last32bits, Databasetype, 0, Ipv4databasecount, Ipv4databaseaddr, Ipv4indexbaseaddr, Ipv4columnsize); |
| 392 | + Ipnum2 = (Ipnum bsr 80) band Last32bits, |
| 393 | + if |
| 394 | + Ipnum2 == 4294967295 -> |
| 395 | + Ipnum3 = Ipnum2 - 1; |
| 396 | + true -> |
| 397 | + Ipnum3 = Ipnum2 |
| 398 | + end, |
| 399 | + search4(S, Ipnum3, Databasetype, 0, Ipv4databasecount, Ipv4databaseaddr, Ipv4indexbaseaddr, Ipv4columnsize); |
380 | 400 | Ipnum >= Fromteredo andalso Ipnum =< Toteredo -> |
381 | | - search4(S, ((bnot Ipnum) band Last32bits), Databasetype, 0, Ipv4databasecount, Ipv4databaseaddr, Ipv4indexbaseaddr, Ipv4columnsize); |
| 401 | + Ipnum2 = (bnot Ipnum) band Last32bits, |
| 402 | + if |
| 403 | + Ipnum2 == 4294967295 -> |
| 404 | + Ipnum3 = Ipnum2 - 1; |
| 405 | + true -> |
| 406 | + Ipnum3 = Ipnum2 |
| 407 | + end, |
| 408 | + search4(S, Ipnum3, Databasetype, 0, Ipv4databasecount, Ipv4databaseaddr, Ipv4indexbaseaddr, Ipv4columnsize); |
382 | 409 | true -> |
383 | | - search6(S, Ipnum, Databasetype, 0, Ipv6databasecount, Ipv6databaseaddr, Ipv6indexbaseaddr, Ipv6columnsize) |
| 410 | + if |
| 411 | + Ipv6databasecount > 0 -> |
| 412 | + if |
| 413 | + Ipnum == 340282366920938463463374607431768211455 -> |
| 414 | + Ipnum2 = Ipnum - 1; |
| 415 | + true -> |
| 416 | + Ipnum2 = Ipnum |
| 417 | + end, |
| 418 | + search6(S, Ipnum2, Databasetype, 0, Ipv6databasecount, Ipv6databaseaddr, Ipv6indexbaseaddr, Ipv6columnsize); |
| 419 | + true -> |
| 420 | + io:format("Error: IPv6 address is missing in IPv4 BIN.~n", []), |
| 421 | + {} % return empty |
| 422 | + end |
384 | 423 | end; |
385 | 424 | {_, _} -> |
386 | 425 | io:format("Error: Invalid IP address.~n", []), |
|
0 commit comments