Blame


1 87a52e04 2005-12-26 devnull #include <u.h>
2 87a52e04 2005-12-26 devnull #include <libc.h>
3 87a52e04 2005-12-26 devnull #include <ip.h>
4 87a52e04 2005-12-26 devnull #include <bio.h>
5 87a52e04 2005-12-26 devnull #include <ndb.h>
6 87a52e04 2005-12-26 devnull
7 87a52e04 2005-12-26 devnull static uchar noether[6];
8 87a52e04 2005-12-26 devnull
9 87a52e04 2005-12-26 devnull /*
10 87a52e04 2005-12-26 devnull * Look for a pair with the given attribute. look first on the same line,
11 87a52e04 2005-12-26 devnull * then in the whole entry.
12 87a52e04 2005-12-26 devnull */
13 87a52e04 2005-12-26 devnull static Ndbtuple*
14 87a52e04 2005-12-26 devnull lookval(Ndbtuple *entry, Ndbtuple *line, char *attr, char *to)
15 87a52e04 2005-12-26 devnull {
16 87a52e04 2005-12-26 devnull Ndbtuple *nt;
17 87a52e04 2005-12-26 devnull
18 87a52e04 2005-12-26 devnull /* first look on same line (closer binding) */
19 87a52e04 2005-12-26 devnull for(nt = line;;){
20 87a52e04 2005-12-26 devnull if(strcmp(attr, nt->attr) == 0){
21 87a52e04 2005-12-26 devnull strncpy(to, nt->val, Ndbvlen);
22 87a52e04 2005-12-26 devnull return nt;
23 87a52e04 2005-12-26 devnull }
24 87a52e04 2005-12-26 devnull nt = nt->line;
25 87a52e04 2005-12-26 devnull if(nt == line)
26 87a52e04 2005-12-26 devnull break;
27 87a52e04 2005-12-26 devnull }
28 87a52e04 2005-12-26 devnull /* search whole tuple */
29 87a52e04 2005-12-26 devnull for(nt = entry; nt; nt = nt->entry)
30 87a52e04 2005-12-26 devnull if(strcmp(attr, nt->attr) == 0){
31 87a52e04 2005-12-26 devnull strncpy(to, nt->val, Ndbvlen);
32 87a52e04 2005-12-26 devnull return nt;
33 87a52e04 2005-12-26 devnull }
34 87a52e04 2005-12-26 devnull return 0;
35 87a52e04 2005-12-26 devnull }
36 87a52e04 2005-12-26 devnull
37 87a52e04 2005-12-26 devnull /*
38 87a52e04 2005-12-26 devnull * lookup an ip address
39 87a52e04 2005-12-26 devnull */
40 87a52e04 2005-12-26 devnull static uchar*
41 87a52e04 2005-12-26 devnull lookupip(Ndb *db, char *name, uchar *to, Ipinfo *iip)
42 87a52e04 2005-12-26 devnull {
43 87a52e04 2005-12-26 devnull Ndbtuple *t, *nt;
44 87a52e04 2005-12-26 devnull char buf[Ndbvlen];
45 87a52e04 2005-12-26 devnull uchar subnet[IPaddrlen];
46 87a52e04 2005-12-26 devnull Ndbs s;
47 87a52e04 2005-12-26 devnull char *attr;
48 87a52e04 2005-12-26 devnull
49 87a52e04 2005-12-26 devnull attr = ipattr(name);
50 87a52e04 2005-12-26 devnull if(strcmp(attr, "ip") == 0){
51 87a52e04 2005-12-26 devnull parseip(to, name);
52 87a52e04 2005-12-26 devnull return to;
53 87a52e04 2005-12-26 devnull }
54 87a52e04 2005-12-26 devnull
55 87a52e04 2005-12-26 devnull t = ndbgetval(db, &s, attr, name, "ip", buf);
56 87a52e04 2005-12-26 devnull if(t){
57 87a52e04 2005-12-26 devnull /* first look for match on same subnet */
58 87a52e04 2005-12-26 devnull for(nt = t; nt; nt = nt->entry){
59 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "ip") != 0)
60 87a52e04 2005-12-26 devnull continue;
61 87a52e04 2005-12-26 devnull parseip(to, nt->val);
62 87a52e04 2005-12-26 devnull maskip(to, iip->ipmask, subnet);
63 87a52e04 2005-12-26 devnull if(memcmp(subnet, iip->ipnet, sizeof(subnet)) == 0)
64 87a52e04 2005-12-26 devnull return to;
65 87a52e04 2005-12-26 devnull }
66 87a52e04 2005-12-26 devnull
67 87a52e04 2005-12-26 devnull /* otherwise, just take what we have */
68 87a52e04 2005-12-26 devnull ndbfree(t);
69 87a52e04 2005-12-26 devnull parseip(to, buf);
70 87a52e04 2005-12-26 devnull return to;
71 87a52e04 2005-12-26 devnull }
72 87a52e04 2005-12-26 devnull return 0;
73 87a52e04 2005-12-26 devnull }
74 87a52e04 2005-12-26 devnull
75 87a52e04 2005-12-26 devnull /*
76 87a52e04 2005-12-26 devnull * lookup a subnet and fill in anything we can
77 87a52e04 2005-12-26 devnull */
78 87a52e04 2005-12-26 devnull static void
79 87a52e04 2005-12-26 devnull recursesubnet(Ndb *db, uchar *mask, Ipinfo *iip, char *fs, char *gw, char *au)
80 87a52e04 2005-12-26 devnull {
81 87a52e04 2005-12-26 devnull Ndbs s;
82 87a52e04 2005-12-26 devnull Ndbtuple *t;
83 87a52e04 2005-12-26 devnull uchar submask[IPaddrlen];
84 87a52e04 2005-12-26 devnull char ip[Ndbvlen];
85 87a52e04 2005-12-26 devnull
86 87a52e04 2005-12-26 devnull memmove(iip->ipmask, mask, 4);
87 87a52e04 2005-12-26 devnull maskip(iip->ipaddr, iip->ipmask, iip->ipnet);
88 87a52e04 2005-12-26 devnull sprint(ip, "%I", iip->ipnet);
89 87a52e04 2005-12-26 devnull t = ndbsearch(db, &s, "ip", ip);
90 87a52e04 2005-12-26 devnull print("%s->", ip);
91 87a52e04 2005-12-26 devnull if(t){
92 87a52e04 2005-12-26 devnull /* look for a further subnet */
93 87a52e04 2005-12-26 devnull if(lookval(t, s.t, "ipmask", ip)){
94 87a52e04 2005-12-26 devnull parseip(submask, ip);
95 87a52e04 2005-12-26 devnull
96 87a52e04 2005-12-26 devnull /* recurse only if it has changed */
97 87a52e04 2005-12-26 devnull if(!equivip(submask, mask))
98 87a52e04 2005-12-26 devnull recursesubnet(db, submask, iip, fs, gw, au);
99 87a52e04 2005-12-26 devnull
100 87a52e04 2005-12-26 devnull }
101 87a52e04 2005-12-26 devnull
102 87a52e04 2005-12-26 devnull /* fill in what we don't have */
103 87a52e04 2005-12-26 devnull if(gw[0] == 0)
104 87a52e04 2005-12-26 devnull lookval(t, s.t, "ipgw", gw);
105 87a52e04 2005-12-26 devnull if(fs[0] == 0)
106 87a52e04 2005-12-26 devnull lookval(t, s.t, "fs", fs);
107 87a52e04 2005-12-26 devnull if(au[0] == 0)
108 87a52e04 2005-12-26 devnull lookval(t, s.t, "auth", au);
109 87a52e04 2005-12-26 devnull
110 87a52e04 2005-12-26 devnull ndbfree(t);
111 87a52e04 2005-12-26 devnull }
112 87a52e04 2005-12-26 devnull }
113 87a52e04 2005-12-26 devnull #ifdef foo
114 87a52e04 2005-12-26 devnull /*
115 87a52e04 2005-12-26 devnull * find out everything we can about a system from what has been
116 87a52e04 2005-12-26 devnull * specified.
117 87a52e04 2005-12-26 devnull */
118 87a52e04 2005-12-26 devnull int
119 87a52e04 2005-12-26 devnull ipinfo(Ndb *db, char *etherin, char *ipin, char *name, Ipinfo *iip)
120 87a52e04 2005-12-26 devnull {
121 87a52e04 2005-12-26 devnull Ndbtuple *t;
122 87a52e04 2005-12-26 devnull Ndbs s;
123 87a52e04 2005-12-26 devnull char ether[Ndbvlen];
124 87a52e04 2005-12-26 devnull char ip[Ndbvlen];
125 87a52e04 2005-12-26 devnull char fsname[Ndbvlen];
126 87a52e04 2005-12-26 devnull char gwname[Ndbvlen];
127 87a52e04 2005-12-26 devnull char auname[Ndbvlen];
128 87a52e04 2005-12-26 devnull
129 87a52e04 2005-12-26 devnull memset(iip, 0, sizeof(Ipinfo));
130 87a52e04 2005-12-26 devnull fsname[0] = 0;
131 87a52e04 2005-12-26 devnull gwname[0] = 0;
132 87a52e04 2005-12-26 devnull auname[0] = 0;
133 87a52e04 2005-12-26 devnull
134 87a52e04 2005-12-26 devnull /*
135 87a52e04 2005-12-26 devnull * look for a matching entry
136 87a52e04 2005-12-26 devnull */
137 87a52e04 2005-12-26 devnull t = 0;
138 87a52e04 2005-12-26 devnull if(etherin)
139 87a52e04 2005-12-26 devnull t = ndbgetval(db, &s, "ether", etherin, "ip", ip);
140 87a52e04 2005-12-26 devnull if(t == 0 && ipin)
141 87a52e04 2005-12-26 devnull t = ndbsearch(db, &s, "ip", ipin);
142 87a52e04 2005-12-26 devnull if(t == 0 && name)
143 87a52e04 2005-12-26 devnull t = ndbgetval(db, &s, ipattr(name), name, "ip", ip);
144 87a52e04 2005-12-26 devnull if(t){
145 87a52e04 2005-12-26 devnull /*
146 87a52e04 2005-12-26 devnull * copy in addresses and name
147 87a52e04 2005-12-26 devnull */
148 87a52e04 2005-12-26 devnull if(lookval(t, s.t, "ip", ip))
149 87a52e04 2005-12-26 devnull parseip(iip->ipaddr, ip);
150 87a52e04 2005-12-26 devnull if(lookval(t, s.t, "ether", ether))
151 87a52e04 2005-12-26 devnull parseether(iip->etheraddr, ether);
152 87a52e04 2005-12-26 devnull lookval(t, s.t, "dom", iip->domain);
153 87a52e04 2005-12-26 devnull
154 87a52e04 2005-12-26 devnull /*
155 87a52e04 2005-12-26 devnull * Look for bootfile, fs, and gateway.
156 87a52e04 2005-12-26 devnull * If necessary, search through all entries for
157 87a52e04 2005-12-26 devnull * this ip address.
158 87a52e04 2005-12-26 devnull */
159 87a52e04 2005-12-26 devnull while(t){
160 87a52e04 2005-12-26 devnull if(iip->bootf[0] == 0)
161 87a52e04 2005-12-26 devnull lookval(t, s.t, "bootf", iip->bootf);
162 87a52e04 2005-12-26 devnull if(fsname[0] == 0)
163 87a52e04 2005-12-26 devnull lookval(t, s.t, "fs", fsname);
164 87a52e04 2005-12-26 devnull if(gwname[0] == 0)
165 87a52e04 2005-12-26 devnull lookval(t, s.t, "ipgw", gwname);
166 87a52e04 2005-12-26 devnull if(auname[0] == 0)
167 87a52e04 2005-12-26 devnull lookval(t, s.t, "auth", auname);
168 87a52e04 2005-12-26 devnull ndbfree(t);
169 87a52e04 2005-12-26 devnull if(iip->bootf[0] && fsname[0] && gwname[0] && auname[0])
170 87a52e04 2005-12-26 devnull break;
171 87a52e04 2005-12-26 devnull t = ndbsnext(&s, "ether", ether);
172 87a52e04 2005-12-26 devnull }
173 87a52e04 2005-12-26 devnull } else if(ipin) {
174 87a52e04 2005-12-26 devnull /*
175 87a52e04 2005-12-26 devnull * copy in addresses (all we know)
176 87a52e04 2005-12-26 devnull */
177 87a52e04 2005-12-26 devnull parseip(iip->ipaddr, ipin);
178 87a52e04 2005-12-26 devnull if(etherin)
179 87a52e04 2005-12-26 devnull parseether(iip->etheraddr, etherin);
180 87a52e04 2005-12-26 devnull } else
181 87a52e04 2005-12-26 devnull return -1;
182 87a52e04 2005-12-26 devnull
183 87a52e04 2005-12-26 devnull /*
184 87a52e04 2005-12-26 devnull * Look up the client's network and find a subnet mask for it.
185 87a52e04 2005-12-26 devnull * Fill in from the subnet (or net) entry anything we can't figure
186 87a52e04 2005-12-26 devnull * out from the client record.
187 87a52e04 2005-12-26 devnull */
188 87a52e04 2005-12-26 devnull recursesubnet(db, classmask[CLASS(iip->ipaddr)], iip, fsname, gwname, auname);
189 87a52e04 2005-12-26 devnull
190 87a52e04 2005-12-26 devnull /* lookup fs's and gw's ip addresses */
191 fa325e9b 2020-01-10 cross
192 87a52e04 2005-12-26 devnull if(fsname[0])
193 87a52e04 2005-12-26 devnull lookupip(db, fsname, iip->fsip, iip);
194 87a52e04 2005-12-26 devnull if(gwname[0])
195 87a52e04 2005-12-26 devnull lookupip(db, gwname, iip->gwip, iip);
196 87a52e04 2005-12-26 devnull if(auname[0])
197 87a52e04 2005-12-26 devnull lookupip(db, auname, iip->auip, iip);
198 87a52e04 2005-12-26 devnull return 0;
199 87a52e04 2005-12-26 devnull }
200 87a52e04 2005-12-26 devnull #endif
201 87a52e04 2005-12-26 devnull void
202 87a52e04 2005-12-26 devnull main(int argc, char **argv)
203 87a52e04 2005-12-26 devnull {
204 87a52e04 2005-12-26 devnull Ipinfo ii;
205 87a52e04 2005-12-26 devnull Ndb *db;
206 87a52e04 2005-12-26 devnull
207 87a52e04 2005-12-26 devnull db = ndbopen(0);
208 87a52e04 2005-12-26 devnull
209 87a52e04 2005-12-26 devnull fmtinstall('E', eipconv);
210 87a52e04 2005-12-26 devnull fmtinstall('I', eipconv);
211 87a52e04 2005-12-26 devnull if(argc < 2)
212 87a52e04 2005-12-26 devnull exits(0);
213 87a52e04 2005-12-26 devnull if(strchr(argv[1], '.')){
214 87a52e04 2005-12-26 devnull if(ipinfo(db, 0, argv[1], 0, &ii) < 0)
215 87a52e04 2005-12-26 devnull exits(0);
216 87a52e04 2005-12-26 devnull } else {
217 87a52e04 2005-12-26 devnull if(ipinfo(db, argv[1], 0, 0, &ii) < 0)
218 87a52e04 2005-12-26 devnull exits(0);
219 87a52e04 2005-12-26 devnull }
220 87a52e04 2005-12-26 devnull fprint(2, "a %I m %I n %I f %s e %E\n", ii.ipaddr,
221 87a52e04 2005-12-26 devnull ii.ipmask, ii.ipnet, ii.bootf, ii.etheraddr);
222 87a52e04 2005-12-26 devnull }