release
[hcoop/zz_old/debian/djbdns.git] / random-ip.c
CommitLineData
dc0d77d7
CE
1#include "buffer.h"
2#include "exit.h"
3#include "fmt.h"
4#include "scan.h"
5#include "dns.h"
6
7char ip[4];
8int ipfixed = 0;
9unsigned long loops = 10000;
10unsigned char tab[256];
11
12char strnum[FMT_ULONG];
13
14char seed[128];
15
16int main(int argc,char **argv)
17{
18 unsigned long u;
19 int i;
20 int j;
21 unsigned char c;
22
23 dns_random_init(seed);
24
25 for (i = 0;i < 256;++i) tab[i] = i;
26 for (j = 256;j > 0;--j) {
27 i = dns_random(j);
28 c = tab[j - 1];
29 tab[j - 1] = tab[i];
30 tab[i] = c;
31 }
32
33 if (*argv) ++argv;
34 if (*argv) scan_ulong(*argv++,&loops);
35 if (*argv) { scan_ulong(*argv++,&u); ip[0] = u; ipfixed = 1; }
36 if (*argv) { scan_ulong(*argv++,&u); ip[1] = u; ipfixed = 2; }
37 if (*argv) { scan_ulong(*argv++,&u); ip[2] = u; ipfixed = 3; }
38 if (*argv) { scan_ulong(*argv++,&u); ip[3] = u; ipfixed = 4; }
39
40 if (ipfixed >= 1) if (loops > 16777216) loops = 16777216;
41 if (ipfixed >= 2) if (loops > 65536) loops = 65536;
42 if (ipfixed >= 3) if (loops > 256) loops = 256;
43 if (ipfixed >= 4) if (loops > 1) loops = 1;
44
45 while (loops) {
46 --loops;
47 u = loops;
48 for (i = ipfixed;i < 4;++i) { ip[i] = u & 255; u >>= 8; }
49 if (ipfixed == 3) {
50 c = ip[3];
51 ip[3] = tab[c];
52 }
53 else if (ipfixed < 3) {
54 c = 0;
55 for (j = 0;j < 100;++j) {
56 for (i = ipfixed;i < 4;++i) {
57 c ^= (unsigned char) ip[i];
58 c = tab[c];
59 ip[i] = c;
60 }
61 }
62 }
63
64 u = (unsigned char) ip[0];
65 buffer_put(buffer_1,strnum,fmt_ulong(strnum,u));
66 buffer_puts(buffer_1,".");
67 u = (unsigned char) ip[1];
68 buffer_put(buffer_1,strnum,fmt_ulong(strnum,u));
69 buffer_puts(buffer_1,".");
70 u = (unsigned char) ip[2];
71 buffer_put(buffer_1,strnum,fmt_ulong(strnum,u));
72 buffer_puts(buffer_1,".");
73 u = (unsigned char) ip[3];
74 buffer_put(buffer_1,strnum,fmt_ulong(strnum,u));
75 buffer_puts(buffer_1,"\n");
76 }
77
78 buffer_flush(buffer_1);
79 _exit(0);
80}