testlookup.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. #include <bio.h>
  5. #include <ndb.h>
  6. static uchar noether[6];
  7. Ndb *db;
  8. static void
  9. recursesubnet(Ndb *db, uchar *addr, uchar *mask, char *attr, char *name, char *name1)
  10. {
  11. Ndbs s;
  12. Ndbtuple *t, *nt;
  13. uchar submask[IPaddrlen], net[IPaddrlen];
  14. char ip[Ndbvlen];
  15. int found;
  16. maskip(addr, mask, net);
  17. sprint(ip, "%I", net);
  18. t = ndbsearch(db, &s, "ip", ip);
  19. if(t == 0)
  20. return;
  21. for(nt = t; nt; nt = nt->entry){
  22. if(strcmp(nt->attr, "ipmask") == 0){
  23. parseip(submask, nt->val);
  24. if(memcmp(submask, mask, IPaddrlen) != 0)
  25. recursesubnet(db, addr, submask, attr, name, name1);
  26. break;
  27. }
  28. }
  29. if(name[0] == 0){
  30. found = 0;
  31. for(nt = t; nt; nt = nt->entry){
  32. if(strcmp(nt->attr, attr) == 0){
  33. if(found){
  34. strcpy(name, nt->val);
  35. name1[0] = 0;
  36. found = 1;
  37. } else {
  38. strcpy(name1, nt->val);
  39. break;
  40. }
  41. }
  42. }
  43. }
  44. ndbfree(t);
  45. }
  46. /*
  47. * lookup an ip address
  48. */
  49. static int
  50. getipaddr(Ndb *db, char *name, uchar *to, Ipinfo *iip)
  51. {
  52. Ndbtuple *t, *nt;
  53. char buf[Ndbvlen];
  54. uchar subnet[IPaddrlen];
  55. Ndbs s;
  56. char *attr;
  57. attr = ipattr(name);
  58. if(strcmp(attr, "ip") == 0){
  59. parseip(to, name);
  60. return 1;
  61. }
  62. t = ndbgetval(db, &s, attr, name, "ip", buf);
  63. if(t){
  64. /* first look for match on same subnet */
  65. for(nt = t; nt; nt = nt->entry){
  66. if(strcmp(nt->attr, "ip") != 0)
  67. continue;
  68. parseip(to, nt->val);
  69. maskip(to, iip->ipmask, subnet);
  70. if(memcmp(subnet, iip->ipnet, sizeof(subnet)) == 0)
  71. return 1;
  72. }
  73. /* otherwise, just take what we have */
  74. ndbfree(t);
  75. parseip(to, buf);
  76. return 1;
  77. }
  78. return 0;
  79. }
  80. /*
  81. * return the ip addresses for a type of server for system ip
  82. */
  83. int
  84. lookupserver(char *attr, uchar ipaddrs[2][IPaddrlen], Ipinfo *iip)
  85. {
  86. Ndbtuple *t, *nt;
  87. Ndbs s;
  88. char ip[32];
  89. char name[Ndbvlen];
  90. char name1[Ndbvlen];
  91. int i;
  92. name[0] = name1[0] = 0;
  93. snprint(ip, sizeof(ip), "%I", iip->ipaddr);
  94. t = ndbsearch(db, &s, "ip", ip);
  95. while(t){
  96. for(nt = t; nt; nt = nt->entry){
  97. if(strcmp(attr, nt->attr) == 0){
  98. if(*name == 0)
  99. strcpy(name, nt->val);
  100. else {
  101. strcpy(name1, nt->val);
  102. break;
  103. }
  104. }
  105. }
  106. if(name[0])
  107. break;
  108. t = ndbsnext(&s, "ip", ip);
  109. }
  110. if(name[0] == 0)
  111. recursesubnet(db, iip->ipaddr, classmask[CLASS(iip->ipaddr)], attr, name, name1);
  112. i = 0;
  113. if(name[0] && getipaddr(db, name, *ipaddrs, iip) == 1){
  114. ipaddrs++;
  115. i++;
  116. }
  117. if(name1[0] && getipaddr(db, name1, *ipaddrs, iip) == 1)
  118. i++;
  119. return i;
  120. }
  121. void
  122. main(int argc, char **argv)
  123. {
  124. Ipinfo ii;
  125. uchar addrs[2][IPaddrlen];
  126. int i, j;
  127. db = ndbopen(0);
  128. fmtinstall('E', eipconv);
  129. fmtinstall('I', eipconv);
  130. if(argc < 2)
  131. exits(0);
  132. if(strchr(argv[1], '.')){
  133. if(ipinfo(db, 0, argv[1], 0, &ii) < 0)
  134. exits(0);
  135. } else {
  136. if(ipinfo(db, argv[1], 0, 0, &ii) < 0)
  137. exits(0);
  138. }
  139. print("a %I m %I n %I f %s e %E a %I\n", ii.ipaddr,
  140. ii.ipmask, ii.ipnet, ii.bootf, ii.etheraddr, ii.auip);
  141. i = lookupserver("auth", addrs, &ii);
  142. print("lookupserver returns %d\n", i);
  143. for(j = 0; j < i; j++)
  144. print("%I\n", addrs[j]);
  145. i = lookupserver("dns", addrs, &ii);
  146. print("lookupserver returns %d\n", i);
  147. for(j = 0; j < i; j++)
  148. print("%I\n", addrs[j]);
  149. }