ndbmkhosts.c (4332B)
1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include <ndb.h> 5 #include <ip.h> 6 7 typedef struct x 8 { 9 Ndbtuple *t; 10 Ndbtuple *it; 11 Ndbtuple *nt; 12 } X; 13 14 X x[4096]; 15 int nx; 16 char *domname = "research.att.com"; 17 int domnamlen; 18 19 char* 20 upper(char *x) 21 { 22 char *p; 23 int c; 24 25 for(p = x; c = *p; p++) 26 *p = toupper(c); 27 return x; 28 } 29 30 void 31 printArecord(int fd, X *p) 32 { 33 Ndbtuple *nt; 34 char *c; 35 char *dom = 0; 36 char *curdom = 0; 37 int i, cdlen = 0; 38 int mxweight = 0; 39 40 if(p->nt) { 41 return; 42 } 43 for(nt=p->t; nt; nt = nt->entry) { 44 /* we are only going to handle things in the specified domain */ 45 c = strchr(nt->val, '.'); 46 if (c==0 || strcmp(++c, domname)!=0) 47 continue; 48 i = c - nt->val - 1; 49 if(strcmp(nt->attr, "dom") == 0) { 50 curdom = nt->val; 51 cdlen = i; 52 if (dom == 0) { 53 dom = curdom; 54 fprint(fd, "%-.*s%.*s IN A %s\n", i, nt->val, 15-i, " ", p->it->val); 55 } else 56 fprint(fd, "%-.*s%.*s IN CNAME %s.\n", i, nt->val, 15-i, " ", dom); 57 } else if(strcmp(nt->attr, "mx") == 0) { 58 if (curdom != 0) 59 fprint(fd, "%-.*s%.*s MX %d %s.\n", cdlen, curdom, 15-cdlen, " ", mxweight++, nt->val); 60 } 61 } 62 } 63 64 void 65 printentry(int fd, X *p) 66 { 67 Ndbtuple *nt; 68 69 if(p->nt) 70 return; 71 fprint(fd, "%s ", p->it->val); 72 for(nt = p->t; nt; nt = nt->entry) 73 if(strcmp(nt->attr, "dom") == 0) 74 fprint(fd, " %s", nt->val); 75 for(nt = p->t; nt; nt = nt->entry) 76 if(strcmp(nt->attr, "sys") == 0) 77 fprint(fd, " %s", nt->val); 78 fprint(fd, "\n"); 79 } 80 81 void 82 printsys(int fd, X *p) 83 { 84 Ndbtuple *nt; 85 86 for(nt = p->t; nt; nt = nt->entry) 87 if(strcmp(nt->attr, "dom") == 0) 88 fprint(fd, "%s\n", nt->val); 89 } 90 91 void 92 printtxt(int fd, X *p) 93 { 94 int i; 95 Ndbtuple *nt; 96 97 if(p->nt){ 98 for(;;){ 99 i = strlen(p->it->val); 100 if(strcmp(p->it->val+i-2, ".0") == 0) 101 p->it->val[i-2] = 0; 102 else 103 break; 104 } 105 fprint(fd, "\nNET : %s : %s\n", p->it->val, upper(p->nt->val)); 106 return; 107 } 108 fprint(fd, "HOST : %s :", p->it->val); 109 i = 0; 110 for(nt = p->t; nt; nt = nt->entry) 111 if(strcmp(nt->attr, "dom") == 0){ 112 if(i++ == 0) 113 fprint(fd, " %s", upper(nt->val)); 114 else 115 fprint(fd, ", %s", upper(nt->val)); 116 } 117 fprint(fd, "\n"); 118 } 119 120 void 121 parse(char *file) 122 { 123 int i; 124 Ndb *db; 125 Ndbtuple *t, *nt, *tt, *ipnett; 126 char *p; 127 128 db = ndbopen(file); 129 if(db == 0) 130 exits("no database"); 131 while(t = ndbparse(db)){ 132 for(nt = t; nt; nt = nt->entry){ 133 if(strcmp(nt->attr, "ip") == 0) 134 break; 135 if(strcmp(nt->attr, "flavor") == 0 136 && strcmp(nt->val, "console") == 0) 137 return; 138 } 139 if(nt == 0){ 140 ndbfree(t); 141 continue; 142 } 143 144 /* dump anything not on our nets */ 145 ipnett = 0; 146 for(tt = t; tt; tt = tt->entry){ 147 if(strcmp(tt->attr, "ipnet") == 0){ 148 ipnett = tt; 149 break; 150 } 151 if(strcmp(tt->attr, "dom") == 0){ 152 i = strlen(tt->val); 153 p = tt->val+i-domnamlen; 154 if(p >= tt->val && strcmp(p, domname) == 0) 155 break; 156 } 157 } 158 if(tt == 0){ 159 ndbfree(t); 160 continue; 161 } 162 163 for(; nt; nt = nt->entry){ 164 if(strcmp(nt->attr, "ip") != 0) 165 continue; 166 x[nx].it = nt; 167 x[nx].nt = ipnett; 168 x[nx++].t = t; 169 } 170 } 171 } 172 173 void 174 main(int argc, char *argv[]) 175 { 176 int i, fd; 177 char fn[128]; 178 179 if (argc>1) 180 domname = argv[1]; 181 domnamlen = strlen(domname); 182 if(argc > 2){ 183 for(i = 2; i < argc; i++) 184 parse(argv[i]); 185 } else { 186 parse(unsharp("#9/ndb/local")); 187 parse(unsharp("#9/ndb/friends")); 188 } 189 190 /* sprint(fn, "/lib/ndb/hosts.%-.21s", domname); */ 191 /* fd = create(fn, OWRITE, 0664); */ 192 /* if(fd < 0){ */ 193 /* fprint(2, "can't create %s: %r\n", fn); */ 194 /* exits("boom"); */ 195 /* } */ 196 /* for(i = 0; i < nx; i++) */ 197 /* printentry(fd, &x[i]); */ 198 /* close(fd); */ 199 200 201 sprint(fn, "/lib/ndb/db.%-.24s", domname); 202 fd = create(fn, OWRITE, 0664); 203 if(fd < 0){ 204 fprint(2, "can't create %s: %r\n", fn); 205 exits("boom"); 206 } 207 fprint(fd, "; This file is generated automatically, do not edit!\n"); 208 for(i = 0; i < nx; i++) 209 printArecord(fd, &x[i]); 210 close(fd); 211 212 sprint(fn, "/lib/ndb/equiv.%-.21s", domname); 213 fd = create(fn, OWRITE, 0664); 214 if(fd < 0){ 215 fprint(2, "can't create %s: %r\n", fn); 216 exits("boom"); 217 } 218 for(i = 0; i < nx; i++) 219 printsys(fd, &x[i]); 220 close(fd); 221 222 sprint(fn, "/lib/ndb/txt.%-.23s", domname); 223 fd = create(fn, OWRITE, 0664); 224 if(fd < 0){ 225 fprint(2, "can't create %s: %r\n", fn); 226 exits("boom"); 227 } 228 for(i = 0; i < nx; i++) 229 printtxt(fd, &x[i]); 230 close(fd); 231 232 exits(0); 233 }