cidr.c-Dateireferenz

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

Dieser Graph zeigt, welche Datei direkt oder indirekt diese Datei enthält:

gehe zum Quellcode dieser Datei

Funktionen

private int IPv4_addr2int (string addr)
private int IPv4_net_size (string addr)
string IPv4_int2addr (int ip)

Ausführliche Beschreibung

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

Autor:
Zesstra
Datum:
05.02.2010
Version:
$Id$

Definiert in Datei cidr.c.


Dokumentation der Funktionen

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Erzeugt am Thu Jun 3 14:41:29 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3