Funktionen zur Interpretation und Umrechnung von IP-Adressen in CIDR-Notation. Mehr ...

gehe zum Quellcode dieser Datei
Funktionen | |
| private int | IPv4_addr2int (string addr) |
| private int | IPv4_net_size (string addr) |
| string | IPv4_int2addr (int ip) |
Funktionen zur Interpretation und Umrechnung von IP-Adressen in CIDR-Notation.
Definiert in Datei cidr.c.
| private int IPv4_addr2int | ( | string | addr | ) |
Definiert in Zeile 11 der Datei cidr.c.
Wird benutzt von IPv4_net_size(), QuerySBanished(), ReloadBanishFile() und SiteBanish().
00011 { 00012 int mask; 00013 00014 if (!stringp(addr) || !strlen(addr)) 00015 return 0; 00016 // irgendwelche Zeichen ausser 0-9, . und / drin? 00017 if (strlen(addr-"0123456789./")) 00018 return 0; 00019 00020 string *parts = explode(addr, "/") - ({""}); 00021 // Netzmaske gegeben? -> Netzwerkadresse bestimmen 00022 if (sizeof(parts) == 2) { 00023 // a.b.c.d/x oder a.b.c.d/w.x.y.z 00024 int res = IPv4_addr2int(parts[0]); // erstmal Wert von a.b.c.d... 00025 if (strstr(parts[1], ".") > -1 00026 && sizeof(explode(parts[1],".")) == 4) 00027 // a.b.c.d/w.x.y.z -> Wert von w.x.y.z bestimmen 00028 mask = IPv4_addr2int(parts[1]); 00029 else { 00030 mask = to_int(parts[1]); 00031 // Wert von /x 00032 mask = 0xffffffff - (to_int(pow(2, 32-mask))-1); 00033 } 00034 // verunden und Ende. 00035 return res & mask; 00036 } 00037 00038 parts = explode(parts[0], "."); 00039 // Abgrekuerzte Adresse a la a.b.? Rest mit 0 ergaenzen. 00040 switch(sizeof(parts - ({""})) ) { 00041 case 1: 00042 parts += ({"0","0","0"}); 00043 case 2: 00044 parts += ({"0","0"}); 00045 case 3: 00046 parts += ({"0"}); 00047 case 4: 00048 break; 00049 default: 00050 return 0; 00051 } 00052 00053 return( to_int(parts[0]) << 24) 00054 + ( to_int(parts[1]) << 16) 00055 + ( to_int(parts[2]) << 8 ) 00056 + to_int(parts[3]); 00057 }

| string IPv4_int2addr | ( | int | ip | ) |
Definiert in Zeile 98 der Datei cidr.c.
Benutzt abs.
Wird benutzt von sbanish() und UpdateSBanish().
00098 { 00099 int *parts=allocate(4); 00100 parts[0] = (ip & 0xff000000) >> 24; 00101 parts[1] = (ip & 0x00ff0000) >> 16; 00102 parts[2] = (ip & 0x0000ff00) >> 8; 00103 parts[3] = (ip & 0x000000ff); 00104 // int is signed. Anything > 127 would wrap around to -128 if we are on a 00105 // machine with 32-bit wide ints. 00106 if (parts[0] < 0) 00107 parts[0] = 128 + (128-abs(parts[0])); 00108 00109 return implode(map(parts,#'to_string), "."); 00110 }

| private int IPv4_net_size | ( | string | addr | ) |
Definiert in Zeile 59 der Datei cidr.c.
Benutzt IPv4_addr2int().
00059 { 00060 if (!stringp(addr) || !strlen(addr)) 00061 return 0; 00062 // irgendwelche Zeichen ausser 0-9, . und / drin? 00063 if (strlen(addr-"0123456789./")) 00064 return 0; 00065 00066 string *parts = explode(addr, "/") - ({""}); 00067 // Netzmaske gegeben? -> Netzwerkadresse bestimmen 00068 if (sizeof(parts) == 2) { 00069 // a.b.c.d/x oder a.b.c.d/w.x.y.z 00070 if (strstr(parts[1], ".") > -1 00071 && sizeof(explode(parts[1],".")) == 4) 00072 // a.b.c.d/w.x.y.z 00073 return 0xffffffff - (IPv4_addr2int(parts[1]) || 1) + 1; 00074 else { 00075 // Einfach 2^(32-mask) Adressen. 00076 return to_int(pow(2, 32 - to_int(parts[1]) ) ); 00077 } 00078 } 00079 00080 parts = explode(parts[0], "."); 00081 switch(sizeof(parts - ({""})) ) { 00082 case 1: // Class A 00083 return 256*256*256; 00084 case 2: // Class B 00085 return 256*256; 00086 case 3: // Class C 00087 return 256; 00088 case 4: // einzelne Adresse 00089 return 1; 00090 default: // ungueltige Adresse 00091 return __INT_MAX__; 00092 } 00093 00094 // hier sollte man gar nicht ankommen. 00095 return __INT_MAX__; 00096 }

1.6.3