dnarea.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <ndb.h>
  5. #include <ip.h>
  6. #include "dns.h"
  7. Area *owned;
  8. Area *delegated;
  9. /*
  10. * true if a name is in our area
  11. */
  12. Area*
  13. inmyarea(char *name)
  14. {
  15. int len;
  16. Area *s, *d;
  17. len = strlen(name);
  18. for(s = owned; s; s = s->next){
  19. if(s->len > len)
  20. continue;
  21. if(cistrcmp(s->soarr->owner->name, name + len - s->len) == 0)
  22. if(len == s->len || name[len - s->len - 1] == '.')
  23. break;
  24. }
  25. if(s == 0)
  26. return 0;
  27. for(d = delegated; d; d = d->next){
  28. if(d->len > len)
  29. continue;
  30. if(cistrcmp(d->soarr->owner->name, name + len - d->len) == 0)
  31. if(len == d->len || name[len - d->len - 1] == '.')
  32. return 0;
  33. }
  34. return s;
  35. }
  36. /*
  37. * our area is the part of the domain tree that
  38. * we serve
  39. */
  40. void
  41. addarea(DN *dp, RR *rp, Ndbtuple *t)
  42. {
  43. Area **l, *s;
  44. if(t->val[0])
  45. l = &delegated;
  46. else
  47. l = &owned;
  48. /*
  49. * The area contains a copy of the soa rr that created it.
  50. * The owner of the the soa rr should stick around as long
  51. * as the area does.
  52. */
  53. s = emalloc(sizeof(*s));
  54. s->len = strlen(dp->name);
  55. rrcopy(rp, &s->soarr);
  56. s->soarr->owner = dp;
  57. s->soarr->db = 1;
  58. s->soarr->ttl = Hour;
  59. s->neednotify = 1;
  60. s->needrefresh = 0;
  61. syslog(0, logfile, "new area %s", dp->name);
  62. s->next = *l;
  63. *l = s;
  64. }
  65. void
  66. freearea(Area **l)
  67. {
  68. Area *s;
  69. while(s = *l){
  70. *l = s->next;
  71. rrfree(s->soarr);
  72. free(s);
  73. }
  74. }
  75. /*
  76. * refresh all areas that need it
  77. * this entails running a command 'zonerefreshprogram'. This could
  78. * copy over databases from elsewhere or just do a zone transfer.
  79. */
  80. void
  81. refresh_areas(Area *s)
  82. {
  83. int pid;
  84. Waitmsg *w;
  85. for(; s != nil; s = s->next){
  86. if(!s->needrefresh)
  87. continue;
  88. if(zonerefreshprogram == nil){
  89. s->needrefresh = 0;
  90. continue;
  91. }
  92. switch(pid = fork()){
  93. case -1:
  94. break;
  95. case 0:
  96. execl(zonerefreshprogram, "zonerefresh", s->soarr->owner->name, 0);
  97. exits(0);
  98. break;
  99. default:
  100. for(;;){
  101. w = wait();
  102. if(w == nil)
  103. break;
  104. if(w->pid == pid){
  105. if(w->msg == nil || *w->msg == 0)
  106. s->needrefresh = 0;
  107. free(w);
  108. break;
  109. }
  110. free(w);
  111. }
  112. }
  113. }
  114. }