Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/secure/master/cidr.c b/secure/master/cidr.c
new file mode 100644
index 0000000..c35ba21
--- /dev/null
+++ b/secure/master/cidr.c
@@ -0,0 +1,111 @@
+// MorgenGrauen MUDlib
+/** \file /secure/master/cidr.c
+* Funktionen zur Interpretation und Umrechnung von IP-Adressen in CIDR-Notation.
+* \author Zesstra
+* \date 05.02.2010
+* \version $Id$
+*/
+/* Changelog:
+*/
+
+private int IPv4_addr2int(string addr) {
+ int mask;
+
+ if (!stringp(addr) || !sizeof(addr))
+ return 0;
+ // irgendwelche Zeichen ausser 0-9, . und / drin?
+ if (sizeof(addr-"0123456789./"))
+ return 0;
+
+ string *parts = explode(addr, "/") - ({""});
+ // Netzmaske gegeben? -> Netzwerkadresse bestimmen
+ if (sizeof(parts) == 2) {
+ // a.b.c.d/x oder a.b.c.d/w.x.y.z
+ int res = IPv4_addr2int(parts[0]); // erstmal Wert von a.b.c.d...
+ if (strstr(parts[1], ".") > -1
+ && sizeof(explode(parts[1],".")) == 4)
+ // a.b.c.d/w.x.y.z -> Wert von w.x.y.z bestimmen
+ mask = IPv4_addr2int(parts[1]);
+ else {
+ mask = to_int(parts[1]);
+ // Wert von /x
+ mask = 0xffffffff - (to_int(pow(2, 32-mask))-1);
+ }
+ // verunden und Ende.
+ return res & mask;
+ }
+
+ parts = explode(parts[0], ".");
+ // Abgrekuerzte Adresse a la a.b.? Rest mit 0 ergaenzen.
+ switch(sizeof(parts - ({""})) ) {
+ case 1:
+ parts += ({"0","0","0"});
+ case 2:
+ parts += ({"0","0"});
+ case 3:
+ parts += ({"0"});
+ case 4:
+ break;
+ default:
+ return 0;
+ }
+
+ return( to_int(parts[0]) << 24)
+ + ( to_int(parts[1]) << 16)
+ + ( to_int(parts[2]) << 8 )
+ + to_int(parts[3]);
+}
+
+private int IPv4_net_size(string addr) {
+ if (!stringp(addr) || !sizeof(addr))
+ return 0;
+ // irgendwelche Zeichen ausser 0-9, . und / drin?
+ if (sizeof(addr-"0123456789./"))
+ return 0;
+
+ string *parts = explode(addr, "/") - ({""});
+ // Netzmaske gegeben? -> Netzwerkadresse bestimmen
+ if (sizeof(parts) == 2) {
+ // a.b.c.d/x oder a.b.c.d/w.x.y.z
+ if (strstr(parts[1], ".") > -1
+ && sizeof(explode(parts[1],".")) == 4)
+ // a.b.c.d/w.x.y.z
+ return 0xffffffff - (IPv4_addr2int(parts[1]) || 1) + 1;
+ else {
+ // Einfach 2^(32-mask) Adressen.
+ return to_int(pow(2, 32 - to_int(parts[1]) ) );
+ }
+ }
+
+ parts = explode(parts[0], ".");
+ switch(sizeof(parts - ({""})) ) {
+ case 1: // Class A
+ return 256*256*256;
+ case 2: // Class B
+ return 256*256;
+ case 3: // Class C
+ return 256;
+ case 4: // einzelne Adresse
+ return 1;
+ default: // ungueltige Adresse
+ return __INT_MAX__;
+ }
+
+ // hier sollte man gar nicht ankommen.
+ return __INT_MAX__;
+}
+
+string IPv4_int2addr(int ip) {
+ int *parts=allocate(4);
+ parts[0] = (ip & 0xff000000) >> 24;
+ parts[1] = (ip & 0x00ff0000) >> 16;
+ parts[2] = (ip & 0x0000ff00) >> 8;
+ parts[3] = (ip & 0x000000ff);
+ // int is signed. Anything > 127 would wrap around to -128 if we are on a
+ // machine with 32-bit wide ints.
+ if (parts[0] < 0)
+ parts[0] = 128 + (128-abs(parts[0]));
+
+ return implode(map(parts,#'to_string), ".");
+}
+