dualserver.cpp
上传用户:raihanchen
上传日期:2022-08-07
资源大小:129k
文件大小:227k
源码类别:

网络

开发平台:

Visual C++

  1. if (!strcasecmp(sectionName, "DHCP-RANGE"))
  2. addMacRange(optionData->rangeSetInd, value);
  3. else
  4. {
  5. sprintf(logBuff, "Warning: section [%s] option %s not allowed in this section, option ignored", sectionName, iniStrPtr);
  6. logDHCPMess(logBuff, 1);
  7. }
  8. continue;
  9. }
  10. else if (!strcasecmp(name, "Filter_Vendor_Class"))
  11. {
  12. if (!strcasecmp(sectionName, "DHCP-RANGE"))
  13. addVendClass(optionData->rangeSetInd, value, valueSize);
  14. else
  15. {
  16. sprintf(logBuff, "Warning: section [%s] option %s not allowed in this section, option ignored", sectionName, iniStrPtr);
  17. logDHCPMess(logBuff, 1);
  18. }
  19. continue;
  20. }
  21. else if (!strcasecmp(name, "Filter_User_Class"))
  22. {
  23. if (!strcasecmp(sectionName, "DHCP-RANGE"))
  24. addUserClass(optionData->rangeSetInd, value, valueSize);
  25. else
  26. {
  27. sprintf(logBuff, "Warning: section [%s] option %s not allowed in this section, option ignored", sectionName, iniStrPtr);
  28. logDHCPMess(logBuff, 1);
  29. }
  30. continue;
  31. }
  32. else if (!strcasecmp(name, "Hostname") && (!strcasecmp(sectionName, "DHCP-OPTIONS") || !strcasecmp(sectionName, "DHCP-RANGE")))
  33. {
  34. sprintf(logBuff, "Warning: section [%s] option %s not allowed in this section, option ignored", sectionName, iniStrPtr);
  35. logDHCPMess(logBuff, 1);
  36. continue;
  37. }
  38. else if (!strcasecmp(name, "Hostname") && strchr(name, '.'))
  39. {
  40. sprintf(logBuff, "Warning: section [%s] option %s should be bare name", sectionName, name);
  41. logDHCPMess(logBuff, 1);
  42. continue;
  43. }
  44. else if (!strcasecmp(name, "IP_Addr"))
  45. {
  46. if (!strcasecmp(sectionName, "DHCP-OPTIONS") || !strcasecmp(sectionName, "DHCP-RANGE"))
  47. {
  48. sprintf(logBuff, "Warning: section [%s] option %s not allowed in this section, option ignored", sectionName, iniStrPtr);
  49. logDHCPMess(logBuff, 1);
  50. }
  51. else if (!isIP(value))
  52. {
  53. sprintf(logBuff, "Warning: section [%s] option %s Invalid IP Addr %s option ignored", sectionName, value);
  54. logDHCPMess(logBuff, 1);
  55. }
  56. else
  57. optionData->ip = my_inet_addr(value);
  58. continue;
  59. }
  60. if (isInt(name))
  61. opTag = atoi(name);
  62. for (BYTE i = 0; i < maxInd; i++)
  63. if (!strcasecmp(name, opData[i].opName) || (opTag && opTag == opData[i].opTag))
  64. {
  65. opTag = opData[i].opTag;
  66. opType = opData[i].opType;
  67. tagFound = true;
  68. break;
  69. }
  70. if (!opTag)
  71. {
  72. sprintf(logBuff, "Warning: section [%s] invalid option %s, ignored", sectionName, iniStrPtr);
  73. logDHCPMess(logBuff, 1);
  74. continue;
  75. }
  76. if (valType == 2)
  77. {
  78. if (tagFound)
  79. {
  80. if (opType == 0 && valueSize % 4)
  81. {
  82. sprintf(logBuff, "Warning: section [%s] option %s, value should be multiples of 4 hex bytes, ignored", sectionName, iniStrPtr);
  83. logDHCPMess(logBuff, 1);
  84. continue;
  85. }
  86. else if (opType < 255 && valueSize != opType)
  87. {
  88. sprintf(logBuff, "Warning: section [%s] option %s, value should be %i hex bytes, ignored", sectionName, iniStrPtr, opType);
  89. logDHCPMess(logBuff, 1);
  90. continue;
  91. }
  92. }
  93. if (buffsize > (valueSize + 2))
  94. {
  95. *dp = opTag;
  96. dp++;
  97. *dp = valueSize;
  98. dp++;
  99. memcpy(dp, hoption, valueSize);
  100. dp += valueSize;
  101. buffsize -= (valueSize + 2);
  102. }
  103. else
  104. {
  105. sprintf(logBuff, "Warning: section [%s] option %s no more space for options", sectionName, name);
  106. logDHCPMess(logBuff, 1);
  107. }
  108. continue;
  109. }
  110. if (!tagFound)
  111. {
  112. switch (valType)
  113. {
  114. case 1:
  115. opType = 255;
  116. break;
  117. case 3:
  118. opType = 0;
  119. break;
  120. case 4:
  121. opType = 4;
  122. break;
  123. case 5:
  124. opType = 2;
  125. break;
  126. case 6:
  127. opType = 1;
  128. break;
  129. }
  130. }
  131. //printf("Tag %i ValType %i opType %i value=%sn", opTag, valType, opType, value);
  132. switch (opType)
  133. {
  134. case 0:
  135. {
  136. if (valType != 3)
  137. {
  138. sprintf(logBuff, "Warning: section [%s] option %s Value should be 4 octates, option ignored", sectionName, name);
  139. logDHCPMess(logBuff, 1);
  140. }
  141. else
  142. {
  143. DWORD inetAddr = my_inet_addr(value);
  144. if (buffsize > 6)
  145. {
  146. if (lastOptionIndex && *lastOptionIndex == opTag)
  147. *(lastOptionIndex + 1) += 4;
  148. else
  149. {
  150. lastOptionIndex = dp;
  151. *dp = opTag;
  152. dp++;
  153. *dp = 4;
  154. dp++;
  155. buffsize -= 2;
  156. }
  157. dp += pIP(dp, inetAddr);
  158. buffsize -= 4;
  159. }
  160. else
  161. {
  162. sprintf(logBuff, "Warning: section [%s] option %s no more space for options", sectionName, name);
  163. logDHCPMess(logBuff, 1);
  164. }
  165. }
  166. }
  167. break;
  168. case 1:
  169. {
  170. if (valType != 6)
  171. {
  172. sprintf(logBuff, "Warning: section [%s] option %s Value should be between 0 & %u, option ignored", sectionName, name, UCHAR_MAX);
  173. logDHCPMess(logBuff, 1);
  174. }
  175. else if (buffsize > 3)
  176. {
  177. lastOptionIndex = 0;
  178. BYTE j = atol(value);
  179. *dp = opTag;
  180. dp++;
  181. *dp = 1;
  182. dp++;
  183. *dp = j;
  184. dp++;
  185. buffsize -= 3;
  186. }
  187. else
  188. {
  189. sprintf(logBuff, "Warning: section [%s] option %s no more space for options", sectionName, name);
  190. logDHCPMess(logBuff, 1);
  191. }
  192. }
  193. break;
  194. case 2:
  195. {
  196. if (valType < 5)
  197. {
  198. sprintf(logBuff, "Warning: section [%s] option %s Value should be between 0 & %u, option ignored", sectionName, name, USHRT_MAX);
  199. logDHCPMess(logBuff, 1);
  200. }
  201. else if (buffsize > 4)
  202. {
  203. lastOptionIndex = 0;
  204. WORD j = atol(value);
  205. *dp = opTag;
  206. dp++;
  207. *dp = 2;
  208. dp++;
  209. dp += pUShort(dp, j);
  210. buffsize -= 4;
  211. }
  212. else
  213. {
  214. sprintf(logBuff, "Warning: section [%s] option %s no more space for options", sectionName, name);
  215. logDHCPMess(logBuff, 1);
  216. }
  217. }
  218. break;
  219. case 4:
  220. {
  221. if (valType < 4)
  222. {
  223. sprintf(logBuff, "Warning: section [%s] option %s Value should be between 0 & %u, option ignored", sectionName, name, ULONG_MAX);
  224. logDHCPMess(logBuff, 1);
  225. }
  226. else if (buffsize > 6)
  227. {
  228. lastOptionIndex = 0;
  229. DWORD j = atol(value);
  230. if (opTag == DHCP_OPTION_IPADDRLEASE)
  231. {
  232. if (!strcasecmp(sectionName, "DHCP-OPTIONS"))
  233. {
  234. sprintf(logBuff, "Warning: section [%s] option %s not allowed in this section, please set it in [TIMINGS] section", sectionName, iniStrPtr);
  235. logDHCPMess(logBuff, 1);
  236. continue;
  237. }
  238. if (j == 0)
  239. j = cfig.lease;
  240. else if (j > cfig.lease)
  241. {
  242. sprintf(logBuff, "Warning: section [%s] option %s value should be less then %u, ignored", sectionName, name, cfig.lease);
  243. logDHCPMess(logBuff, 1);
  244. j = cfig.lease;
  245. }
  246. }
  247. *dp = opTag;
  248. dp++;
  249. *dp = 4;
  250. dp++;
  251. dp += pULong(dp, j);
  252. buffsize -= 6;
  253. //printf("%s=%u=%un",opData[op_index].opName,opData[op_index].opType,htonl(j));
  254. }
  255. else
  256. {
  257. sprintf(logBuff, "Warning: section [%s] option %s no more space for options", sectionName, name);
  258. logDHCPMess(logBuff, 1);
  259. }
  260. }
  261. break;
  262. case 255:
  263. {
  264. lastOptionIndex = NULL;
  265. if (opTag == DHCP_OPTION_DOMAINNAME)
  266. {
  267. sprintf(logBuff, "Warning: section [%s] option %u should be under [DOMAIN-NAME], ignored", sectionName, opTag);
  268. logDHCPMess(logBuff, 1);
  269. continue;
  270. }
  271. if (valType != 1)
  272. {
  273. sprintf(logBuff, "Warning: section [%s] option %s, invalid value, option ignored", sectionName, name);
  274. logDHCPMess(logBuff, 1);
  275. }
  276. else if (buffsize > strlen(value) + 2)
  277. {
  278. *dp = opTag;
  279. dp++;
  280. *dp = strlen(value);
  281. dp++;
  282. memcpy(dp, value, strlen(value));
  283. dp += (strlen(value));
  284. buffsize -= (strlen(value) + 2);
  285. }
  286. else
  287. {
  288. sprintf(logBuff, "Warning: section [%s] option %s no more space for options", sectionName, name);
  289. logDHCPMess(logBuff, 1);
  290. }
  291. }
  292. break;
  293. }
  294. }
  295. //printf("%s=%sn", sectionName, optionData->vendClass);
  296. *dp = DHCP_OPTION_END;
  297. dp++;
  298. WORD optionSize = ((DWORD)dp - (DWORD)options);
  299. if (optionSize > 2)
  300. {
  301. optionData->options = (BYTE*)calloc(1, optionSize);
  302. if (!optionData->options)
  303. {
  304. sprintf(logBuff, "DHCP Option Load, Memory Allocation Error");
  305. logDHCPMess(logBuff, 1);
  306. }
  307. memcpy(optionData->options, options, optionSize);
  308. }
  309. }
  310. void lockOptions(char *iniStr)
  311. {
  312. char name[512];
  313. char value[512];
  314. char *iniStrPtr = myGetToken(iniStr, 0);
  315. for (; iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  316. {
  317. mySplit(name, value, iniStrPtr, '=');
  318. if (!name[0])
  319. continue;
  320. int op_index;
  321. BYTE n = sizeof(opData) / sizeof(data4);
  322. for (op_index = 0; op_index < n; op_index++)
  323. if (!strcasecmp(name, opData[op_index].opName) || (opData[op_index].opTag && atoi(name) == opData[op_index].opTag))
  324. break;
  325. if (op_index >= n)
  326. continue;
  327. if (opData[op_index].opType == 0)
  328. {
  329. //printf("Tag %s Lockedn", value);
  330. DWORD inetAddr = my_inet_addr(value);
  331. if (inetAddr != INADDR_ANY && inetAddr != INADDR_NONE)
  332. setLeaseExpiry(inetAddr, LONG_MAX);
  333. }
  334. }
  335. }
  336. void addDHCPRange(char *iniStrPtr)
  337. {
  338. DWORD rs = 0;
  339. DWORD re = 0;
  340. char name[512];
  341. char value[512];
  342. mySplit(name, value, iniStrPtr, '-');
  343. if (name[0] && value[0] && isIP(name) && isIP(value))
  344. {
  345. rs = htonl(my_inet_addr(name));
  346. re = htonl(my_inet_addr(value));
  347. if (rs && rs != INADDR_NONE && re && re != INADDR_NONE && rs <= re)
  348. {
  349. data13 *range;
  350. BYTE m = 0;
  351. BYTE rangeOK = 1;
  352. for (; m < 32 && cfig.dhcpRanges[m].rangeStart; m++)
  353. {
  354. range = &cfig.dhcpRanges[m];
  355. if ((rs >= range->rangeStart && rs <= range->rangeEnd)
  356. || (re >= range->rangeStart && re <= range->rangeEnd)
  357. || (range->rangeStart >= rs && range->rangeStart <= re)
  358. || (range->rangeEnd >= rs && range->rangeEnd <= re))
  359. {
  360. sprintf(logBuff, "Warning: DHCP Range %s overlaps with another range, ignored", iniStrPtr);
  361. logDHCPMess(logBuff, 1);
  362. rangeOK = 0;
  363. break;
  364. }
  365. }
  366. if (cfig.rangeStart && (rs < cfig.rangeStart || re > cfig.rangeEnd))
  367. {
  368. sprintf(logBuff, "Warning: DHCP Range %s not in zone %s, ignored", iniStrPtr, cfig.authority);
  369. logDHCPMess(logBuff, 1);
  370. rangeOK = 0;
  371. }
  372. if (m < 32 && rangeOK)
  373. {
  374. cfig.dhcpSize += (re - rs + 1);
  375. range = &cfig.dhcpRanges[m];
  376. range->rangeStart = rs;
  377. range->rangeEnd = re;
  378. range->expiry = (time_t*)calloc((re - rs + 1), sizeof(time_t));
  379. range->dhcpEntry = (data7**)calloc((re - rs + 1), sizeof(data7*));
  380. if (!range->expiry || !range->dhcpEntry)
  381. {
  382. if (range->expiry)
  383. free(range->expiry);
  384. if (range->dhcpEntry)
  385. free(range->dhcpEntry);
  386. sprintf(logBuff, "DHCP Ranges Load, Memory Allocation Error");
  387. logDHCPMess(logBuff, 1);
  388. return;
  389. }
  390. }
  391. }
  392. else
  393. {
  394. sprintf(logBuff, "Section [DHCP-dhcpRanges] Invalid DHCP range %s in ini file, ignored", iniStrPtr);
  395. logDHCPMess(logBuff, 1);
  396. }
  397. }
  398. else
  399. {
  400. sprintf(logBuff, "Section [DHCP-dhcpRanges] Invalid DHCP range %s in ini file, ignored", iniStrPtr);
  401. logDHCPMess(logBuff, 1);
  402. }
  403. }
  404. void addVendClass(BYTE rangeSetInd, char *vendClass, BYTE vendClassSize)
  405. {
  406. data14 *rangeSet = &cfig.rangeSet[rangeSetInd];
  407. BYTE i = 0;
  408. for (; i <= 32 && rangeSet->vendClassSize[i]; i++);
  409. if (i >= 32)
  410. return;
  411. rangeSet->vendClass[i] = (BYTE*)calloc(vendClassSize, 1);
  412. if(!rangeSet->vendClass[i])
  413. {
  414. sprintf(logBuff, "Vendor Class Load, Memory Allocation Error");
  415. logDHCPMess(logBuff, 1);
  416. }
  417. else
  418. {
  419. cfig.hasFilter = true;
  420. rangeSet->vendClassSize[i] = vendClassSize;
  421. memcpy(rangeSet->vendClass[i], vendClass, vendClassSize);
  422. //printf("Loaded Vendor Class %s Size=%i rangeSetInd=%i Ind=%in", hex2String(tempbuff, rangeSet->vendClass[i], rangeSet->vendClassSize[i], ':'), rangeSet->vendClassSize[i], rangeSetInd, i);
  423. }
  424. }
  425. void addUserClass(BYTE rangeSetInd, char *userClass, BYTE userClassSize)
  426. {
  427. data14 *rangeSet = &cfig.rangeSet[rangeSetInd];
  428. BYTE i = 0;
  429. for (; i <= 32 && rangeSet->userClassSize[i]; i++);
  430. if (i >= 32)
  431. return;
  432. rangeSet->userClass[i] = (BYTE*)calloc(userClassSize, 1);
  433. if(!rangeSet->userClass[i])
  434. {
  435. sprintf(logBuff, "Vendor Class Load, Memory Allocation Error");
  436. logDHCPMess(logBuff, 1);
  437. }
  438. else
  439. {
  440. cfig.hasFilter = true;
  441. rangeSet->userClassSize[i] = userClassSize;
  442. memcpy(rangeSet->userClass[i], userClass, userClassSize);
  443. //printf("Loaded User Class %s Size=%i rangeSetInd=%i Ind=%in", hex2String(tempbuff, rangeSet->userClass[i], rangeSet->userClassSize[i], ':'), rangeSet->vendClassSize[i], rangeSetInd, i);
  444. }
  445. }
  446. void addMacRange(BYTE rangeSetInd, char *macRange)
  447. {
  448. if (macRange[0])
  449. {
  450. data14 *rangeSet = &cfig.rangeSet[rangeSetInd];
  451. BYTE i = 0;
  452. for (; i <= 32 && rangeSet->macSize[i]; i++);
  453. if (i >= 32)
  454. return;
  455. char name[256];
  456. char value[256];
  457. mySplit(name, value, macRange, '-');
  458. if(!name[0] || !value[0])
  459. {
  460. sprintf(logBuff, "Section [DHCP-RANGE], invalid Filter_Mac_Range %s, ignored", macRange);
  461. logDHCPMess(logBuff, 1);
  462. }
  463. else
  464. {
  465. BYTE macSize1 = 16;
  466. BYTE macSize2 = 16;
  467. BYTE *macStart = (BYTE*)calloc(1, macSize1);
  468. BYTE *macEnd = (BYTE*)calloc(1, macSize2);
  469. if(!macStart || !macEnd)
  470. {
  471. sprintf(logBuff, "DHCP Range Load, Memory Allocation Error");
  472. logDHCPMess(logBuff, 1);
  473. }
  474. else if (getHexValue(macStart, name, &macSize1) || getHexValue(macEnd, value, &macSize2))
  475. {
  476. sprintf(logBuff, "Section [DHCP-RANGE], Invalid character in Filter_Mac_Range %s", macRange);
  477. logDHCPMess(logBuff, 1);
  478. free(macStart);
  479. free(macEnd);
  480. }
  481. else if (memcmp(macStart, macEnd, 16) > 0)
  482. {
  483. sprintf(logBuff, "Section [DHCP-RANGE], Invalid Filter_Mac_Range %s, (higher bound specified on left), ignored", macRange);
  484. logDHCPMess(logBuff, 1);
  485. free(macStart);
  486. free(macEnd);
  487. }
  488. else if (macSize1 != macSize2)
  489. {
  490. sprintf(logBuff, "Section [DHCP-RANGE], Invalid Filter_Mac_Range %s, (start/end size mismatched), ignored", macRange);
  491. logDHCPMess(logBuff, 1);
  492. free(macStart);
  493. free(macEnd);
  494. }
  495. else
  496. {
  497. cfig.hasFilter = true;
  498. rangeSet->macSize[i] = macSize1;
  499. rangeSet->macStart[i] = macStart;
  500. rangeSet->macEnd[i] = macEnd;
  501. //printf("Mac Loaded, Size=%i Start=%s rangeSetInd=%i Ind=%in", rangeSet->macSize[i], hex2String(tempbuff, rangeSet->macStart[i], rangeSet->macSize[i], ':'), rangeSetInd, i);
  502. }
  503. }
  504. }
  505. }
  506. char* myGetToken(char* buff, BYTE index)
  507. {
  508. while (*buff)
  509. {
  510. if (index)
  511. index--;
  512. else
  513. break;
  514. buff += strlen(buff) + 1;
  515. }
  516. return buff;
  517. }
  518. WORD myTokenize(char *target, char *source, char *sep, bool whiteSep)
  519. {
  520. bool found = true;
  521. char *dp = target;
  522. WORD kount = 0;
  523. while (*source)
  524. {
  525. if (sep && sep[0] && strchr(sep, (*source)))
  526. {
  527. found = true;
  528. source++;
  529. continue;
  530. }
  531. else if (whiteSep && *source <= 32)
  532. {
  533. found = true;
  534. source++;
  535. continue;
  536. }
  537. if (found)
  538. {
  539. if (target != dp)
  540. {
  541. *dp = 0;
  542. dp++;
  543. }
  544. kount++;
  545. }
  546. found = false;
  547. *dp = *source;
  548. dp++;
  549. source++;
  550. }
  551. *dp = 0;
  552. dp++;
  553. *dp = 0;
  554. //printf("%sn", target);
  555. return kount;
  556. }
  557. char* myTrim(char *target, char *source)
  558. {
  559. while ((*source) && (*source) <= 32)
  560. source++;
  561. int i = 0;
  562. for (; i < 511 && source[i]; i++)
  563. target[i] = source[i];
  564. target[i] = source[i];
  565. i--;
  566. for (; i >= 0 && target[i] <= 32; i--)
  567. target[i] = 0;
  568. return target;
  569. }
  570. void mySplit(char *name, char *value, char *source, char splitChar)
  571. {
  572. int i = 0;
  573. int j = 0;
  574. int k = 0;
  575. for (; source[i] && j <= 510 && source[i] != splitChar; i++, j++)
  576. {
  577. name[j] = source[i];
  578. }
  579. if (source[i])
  580. {
  581. i++;
  582. for (; k <= 510 && source[i]; i++, k++)
  583. {
  584. value[k] = source[i];
  585. }
  586. }
  587. name[j] = 0;
  588. value[k] = 0;
  589. myTrim(name, name);
  590. myTrim(value, value);
  591. //printf("%s %sn", name, value);
  592. }
  593. char *strqtype(char *buff, BYTE qtype)
  594. {
  595. switch (qtype)
  596. {
  597. case 1:
  598. strcpy(buff, "A");
  599. break;
  600. case 2:
  601. strcpy(buff, "NS");
  602. break;
  603. case 3:
  604. strcpy(buff, "MD");
  605. break;
  606. case 4:
  607. strcpy(buff, "MF");
  608. break;
  609. case 5:
  610. strcpy(buff, "CNAME");
  611. break;
  612. case 6:
  613. strcpy(buff, "SOA");
  614. break;
  615. case 7:
  616. strcpy(buff, "MB");
  617. break;
  618. case 8:
  619. strcpy(buff, "MG");
  620. break;
  621. case 9:
  622. strcpy(buff, "MR");
  623. break;
  624. case 10:
  625. strcpy(buff, "NULL");
  626. break;
  627. case 11:
  628. strcpy(buff, "WKS");
  629. break;
  630. case 12:
  631. strcpy(buff, "PTR");
  632. break;
  633. case 13:
  634. strcpy(buff, "HINFO");
  635. break;
  636. case 14:
  637. strcpy(buff, "MINFO");
  638. break;
  639. case 15:
  640. strcpy(buff, "MX");
  641. break;
  642. case 16:
  643. strcpy(buff, "TXT");
  644. break;
  645. case 28:
  646. strcpy(buff, "AAAA");
  647. break;
  648. case 251:
  649. strcpy(buff, "IXFR");
  650. break;
  651. case 252:
  652. strcpy(buff, "AXFR");
  653. break;
  654. case 253:
  655. strcpy(buff, "MAILB");
  656. break;
  657. case 254:
  658. strcpy(buff, "MAILA");
  659. break;
  660. default:
  661. strcpy(buff, "ANY");
  662. break;
  663. }
  664. return buff;
  665. }
  666. WORD listSections(char *buffer, int sizeofbuffer, char *fileName)
  667. {
  668. WORD kount = 0;
  669. char buff[512];
  670. FILE *f = fopen(fileName, "rt");
  671. while (f && fgets(buff, 511, f))
  672. {
  673. if (strchr(buff, '[') == buff)
  674. {
  675. char *secend = strchr(buff, ']');
  676. if (secend)
  677. {
  678. *secend = 0;
  679. buffer += sprintf(buffer, "%s", &buff[1]);
  680. buffer++;
  681. kount++;
  682. }
  683. }
  684. }
  685. if (f)
  686. fclose(f);
  687. else if (iniFile[0])
  688. {
  689. sprintf(logBuff, "Warning: Failed to open ini File %s", iniFile);
  690. logMess(logBuff, 1);
  691. }
  692. *buffer = 0;
  693. buffer++;
  694. *buffer = 0;
  695. return kount;
  696. }
  697. bool getSection(char *sectionName, char *buffer, BYTE serial, char *fileName)
  698. {
  699. //printf("%s=%sn",fileName,sectionName);
  700. char section[128];
  701. sprintf(section, "[%s]", sectionName);
  702. myUpper(section);
  703. FILE *f = fopen(fileName, "rt");
  704. char buff[512];
  705. BYTE found = 0;
  706. if (f)
  707. {
  708. while (fgets(buff, 511, f))
  709. {
  710. myUpper(buff);
  711. myTrim(buff, buff);
  712. if (strstr(buff, section) == buff)
  713. {
  714. found++;
  715. if (found == serial)
  716. {
  717. //printf("%s=%sn",fileName,sectionName);
  718. while (fgets(buff, 511, f))
  719. {
  720. myTrim(buff, buff);
  721. if (strstr(buff, "[") == buff)
  722. break;
  723. if ((*buff) >= '0' && (*buff) <= '9' || (*buff) >= 'A' && (*buff) <= 'Z' || (*buff) >= 'a' && (*buff) <= 'z' || ((*buff) && strchr("/\?*", (*buff))))
  724. {
  725. buffer += sprintf(buffer, "%s", buff);
  726. buffer++;
  727. }
  728. }
  729. break;
  730. }
  731. }
  732. }
  733. fclose(f);
  734. }
  735. *buffer = 0;
  736. *(buffer + 1) = 0;
  737. return (found == serial);
  738. }
  739. DWORD getClassNetwork(DWORD ip)
  740. {
  741. data15 data;
  742. data.ip = ip;
  743. data.octate[3] = 0;
  744. if (data.octate[0] < 192)
  745. data.octate[2] = 0;
  746. if (data.octate[0] < 128)
  747. data.octate[1] = 0;
  748. return data.ip;
  749. }
  750. /*
  751. char *IP2Auth(DWORD ip)
  752. {
  753. data15 data;
  754. data.ip = ip;
  755. if (data.octate[0] >= 192)
  756. sprintf(tempbuff, "%u.%u.%u", data.octate[2], data.octate[1], data.octate[0]);
  757. else if (data.octate[0] >= 128)
  758. sprintf(tempbuff, "%u.%u", data.octate[1], data.octate[0]);
  759. else
  760. sprintf(tempbuff, "%u", data.octate[0]);
  761. strcat(tempbuff, arpa);
  762. return tempbuff;
  763. }
  764. */
  765. char *IP2String(char *target, DWORD ip)
  766. {
  767. data15 inaddr;
  768. inaddr.ip = ip;
  769. sprintf(target, "%u.%u.%u.%u", inaddr.octate[0], inaddr.octate[1], inaddr.octate[2], inaddr.octate[3]);
  770. return target;
  771. }
  772. bool addServer(DWORD *array, DWORD ip)
  773. {
  774. for (BYTE i = 0; i < MAX_SERVERS; i++)
  775. {
  776. if (!ip || array[i] == ip)
  777. return 0;
  778. else if (!array[i])
  779. {
  780. array[i] = ip;
  781. return 1;
  782. }
  783. }
  784. return 0;
  785. }
  786. DWORD *findServer(DWORD *array, DWORD ip)
  787. {
  788. if (ip)
  789. {
  790. for (BYTE i = 0; i < MAX_SERVERS && array[i]; i++)
  791. {
  792. if (array[i] == ip)
  793. return &(array[i]);
  794. }
  795. }
  796. return 0;
  797. }
  798. bool isIP(char *string)
  799. {
  800. int j = 0;
  801. for (; *string; string++)
  802. {
  803. if (*string == '.' && *(string + 1) != '.')
  804. j++;
  805. else if (*string < '0' || *string > '9')
  806. return 0;
  807. }
  808. if (j == 3)
  809. return 1;
  810. else
  811. return 0;
  812. }
  813. bool isInt(char *string)
  814. {
  815. if (!(*string))
  816. return false;
  817. for(; *string; string++)
  818. if (*string <  '0' || *string > '9')
  819. return false;
  820. return true;
  821. }
  822. char *toBase64(BYTE *source, BYTE length)
  823. {
  824. BYTE a = 0, b = 0, i = 0;
  825. char *dp = tempbuff;
  826. for (; length; length--, source++)
  827. {
  828. i += 2;
  829. a = (*source) >> i;
  830. *dp = base64[a + b];
  831. dp++;
  832. b = (*source) << (8 - i);
  833. b >>= 2;
  834. if (i == 6)
  835. {
  836. *dp = base64[b];
  837. dp++;
  838. i = b = 0;
  839. }
  840. }
  841. if (i)
  842. {
  843. *dp = base64[b];
  844. dp++;
  845. }
  846. *dp = 0;
  847. //printf("%sn",tempbuff);
  848. return tempbuff;
  849. }
  850. BYTE getBaseValue(BYTE a)
  851. {
  852. if (a >= 'A' && a <= 'Z')
  853. a -= 'A';
  854. else if (a >= 'a' && a <= 'z')
  855. a = a - 'a' + 26;
  856. else if (a >= '0' && a <= '9')
  857. a = a - '0' + 52;
  858. else if (a == '+')
  859. a = 62;
  860. else if (a == '/')
  861. a = 63;
  862. else
  863. a = 255;
  864. return a;
  865. }
  866. BYTE fromBase64(BYTE *target, char *source)
  867. {
  868. //printf("SOURCE=%sn", source);
  869. BYTE b = 0;
  870. BYTE shift = 4;
  871. BYTE bp_hlen = (3*strlen(source))/4;
  872. if (*source)
  873. {
  874. b = getBaseValue(*source);
  875. *target = b << 2;
  876. source++;
  877. while (*source)
  878. {
  879. b = getBaseValue(*source);
  880. (*target) += (b >> (8 - shift));
  881. target++;
  882. (*target) = (b << shift);
  883. shift += 2;
  884. if (shift > 8)
  885. {
  886. source++;
  887. if (*source)
  888. {
  889. b = getBaseValue(*source);
  890. *target = b << 2;
  891. shift = 4;
  892. }
  893. else
  894. break;
  895. }
  896. source++;
  897. }
  898. }
  899. //printf("SIZE=%un", bp_hlen);
  900. return bp_hlen;
  901. }
  902. char *toUUE(char *tempbuff, BYTE *source, BYTE length)
  903. {
  904. BYTE a = 0, b = 0, i = 0;
  905. char *dp = tempbuff;
  906. for (; length; length--, source++)
  907. {
  908. i += 2;
  909. a = (*source) >> i;
  910. *dp = a + b + 32;
  911. dp++;
  912. b = (*source) << (8 - i);
  913. b >>= 2;
  914. if (i == 6)
  915. {
  916. *dp = b + 32;
  917. dp++;
  918. i = b = 0;
  919. }
  920. }
  921. if (i)
  922. {
  923. *dp = b + 32;
  924. dp++;
  925. }
  926. *dp = 0;
  927. //printf("%sn",tempbuff);
  928. return tempbuff;
  929. }
  930. BYTE fromUUE(BYTE *target, char *source)
  931. {
  932. //printf("SOURCE=%sn", source);
  933. BYTE b = 0;
  934. BYTE shift = 4;
  935. BYTE bp_hlen = (3 * strlen(source))/4;
  936. *target = 0;
  937. if (*source)
  938. {
  939. b = *source - 32;
  940. *target = b << 2;
  941. source++;
  942. while (*source)
  943. {
  944. b = *source - 32;
  945. (*target) += (b >> (8 - shift));
  946. target++;
  947. (*target) = (b << shift);
  948. shift += 2;
  949. if (shift > 8)
  950. {
  951. source++;
  952. if (*source)
  953. {
  954. b = *source - 32;
  955. *target = b << 2;
  956. shift = 4;
  957. }
  958. else
  959. break;
  960. }
  961. source++;
  962. }
  963. }
  964. //printf("SIZE=%un", bp_hlen);
  965. return bp_hlen;
  966. }
  967. char *hex2String(char *target, BYTE *hex, BYTE bytes, char sepChar)
  968. {
  969. char *dp = target;
  970. if (bytes)
  971. dp += sprintf(target, "%02x", *hex);
  972. else
  973. *target = 0;
  974. for (BYTE i = 1; i < bytes; i++)
  975. if (sepChar)
  976. dp += sprintf(dp, "%c%02x", sepChar, *(hex + i));
  977. else
  978. dp += sprintf(dp, "%02x", *(hex + i));
  979. return target;
  980. }
  981. char *IP62String(char *target, BYTE *source)
  982. {
  983. BYTE i = 0;
  984. *target = 0;
  985. bool thisZero = false;
  986. bool prevZero = false;
  987. char *dp;
  988. while (true)
  989. {
  990. prevZero = thisZero;
  991. thisZero = true;
  992. if (*(source + i))
  993. {
  994. thisZero = false;
  995. dp = target + strlen(target);
  996. sprintf(dp, "%x", *(source + i));
  997. }
  998. i++;
  999. if (*(source + i))
  1000. {
  1001. thisZero = false;
  1002. dp = target + strlen(target);
  1003. sprintf(dp, "%x", *(source + i));
  1004. }
  1005. i++;
  1006. if (i >= 15)
  1007. break;
  1008. if (!thisZero || !prevZero)
  1009. {
  1010. dp = target + strlen(target);
  1011. strcat(dp, ":");
  1012. }
  1013. }
  1014. return target;
  1015. }
  1016. char *getHexValue(BYTE *target, char *source, BYTE *size)
  1017. {
  1018. if (*size)
  1019. memset(target, 0, (*size));
  1020. if (*source == ':')
  1021. source++;
  1022. for ((*size) = 0; (*source) && (*size) < UCHAR_MAX; (*size)++, target++)
  1023. {
  1024. if ((*source) >= '0' && (*source) <= '9')
  1025. {
  1026. (*target) = (*source) - '0';
  1027. }
  1028. else if ((*source) >= 'a' && (*source) <= 'f')
  1029. {
  1030. (*target) = (*source) - 'a' + 10;
  1031. }
  1032. else if ((*source) >= 'A' && (*source) <= 'F')
  1033. {
  1034. (*target) = (*source) - 'A' + 10;
  1035. }
  1036. else
  1037. {
  1038. return source;
  1039. }
  1040. source++;
  1041. if ((*source) >= '0' && (*source) <= '9')
  1042. {
  1043. (*target) *= 16;
  1044. (*target) += ((*source) - '0');
  1045. }
  1046. else if ((*source) >= 'a' && (*source) <= 'f')
  1047. {
  1048. (*target) *= 16;
  1049. (*target) += (((*source) - 'a') + 10);
  1050. }
  1051. else if ((*source) >= 'A' && (*source) <= 'F')
  1052. {
  1053. (*target) *= 16;
  1054. (*target) += (((*source) - 'A') + 10);
  1055. }
  1056. else if ((*source) == ':')
  1057. {
  1058. source++;
  1059. continue;
  1060. }
  1061. else if (*source)
  1062. return source;
  1063. else
  1064. continue;
  1065. source++;
  1066. if ((*source) == ':')
  1067. source++;
  1068. else if (*source)
  1069. return source;
  1070. }
  1071. if (*source)
  1072. return source;
  1073. return NULL;
  1074. }
  1075. char *myUpper(char *string)
  1076. {
  1077. char diff = 'a' - 'A';
  1078. WORD len = strlen(string);
  1079. for (int i = 0; i < len; i++)
  1080. if (string[i] >= 'a' && string[i] <= 'z')
  1081. string[i] -= diff;
  1082. return string;
  1083. }
  1084. char *myLower(char *string)
  1085. {
  1086. char diff = 'a' - 'A';
  1087. WORD len = strlen(string);
  1088. for (int i = 0; i < len; i++)
  1089. if (string[i] >= 'A' && string[i] <= 'Z')
  1090. string[i] += diff;
  1091. return string;
  1092. }
  1093. bool wildcmp(char *string, char *wild)
  1094. {
  1095. // Written by Jack Handy - jakkhandy@hotmail.com
  1096. // slightly modified
  1097. char *cp = NULL;
  1098. char *mp = NULL;
  1099. while ((*string) && (*wild != '*'))
  1100. {
  1101. if ((*wild != *string) && (*wild != '?'))
  1102. {
  1103. return 0;
  1104. }
  1105. wild++;
  1106. string++;
  1107. }
  1108. while (*string)
  1109. {
  1110. if (*wild == '*')
  1111. {
  1112. if (!*++wild)
  1113. return 1;
  1114. mp = wild;
  1115. cp = string + 1;
  1116. }
  1117. else if ((*wild == *string) || (*wild == '?'))
  1118. {
  1119. wild++;
  1120. string++;
  1121. }
  1122. else
  1123. {
  1124. wild = mp;
  1125. string = cp++;
  1126. }
  1127. }
  1128. while (*wild == '*')
  1129. wild++;
  1130. return !(*wild);
  1131. }
  1132. BYTE makeLocal(DWORD ip)
  1133. {
  1134. if (cfig.rangeStart && htonl(ip) >= cfig.rangeStart && htonl(ip) <= cfig.rangeEnd)
  1135. return 1;
  1136. else if (getRangeInd(ip) >= 0)
  1137. return 1;
  1138. else
  1139. return 0;
  1140. }
  1141. BYTE makeLocal(char *query)
  1142. {
  1143. if (!strcasecmp(query, cfig.zone))
  1144. return 3;
  1145. else
  1146. {
  1147. char *dp = strchr(query, '.');
  1148. if (dp)
  1149. {
  1150. if (!strcasecmp(dp + 1, cfig.zone))
  1151. {
  1152. *dp = 0;
  1153. return 2;
  1154. }
  1155. return 0;
  1156. }
  1157. return 1;
  1158. }
  1159. return 0;
  1160. }
  1161. void checkSize(BYTE ind)
  1162. {
  1163. //printf("Start %u=%un",dnsCache[ind].size(),dnsAge[ind].size());
  1164. time_t t = time(NULL);
  1165. data7 *cache = NULL;
  1166. //BYTE maxDelete = 3;
  1167. expiryMap::iterator p = dnsAge[ind].begin();
  1168. expiryMap::iterator q;
  1169. //while (p != dnsAge[ind].end() && p->first < t && maxDelete > 0)
  1170. while (p != dnsAge[ind].end() && p->first < t)
  1171. {
  1172. cache = p->second;
  1173. //printf("processing %s=%in", cache->mapname, p->first - t);
  1174. if (cache->expiry < t)
  1175. {
  1176. q = p;
  1177. p++;
  1178. dnsAge[ind].erase(q);
  1179. if (cache->expiry)
  1180. {
  1181. if (cache->dnsIndex < MAX_SERVERS)
  1182. {
  1183. if (cfig.currentDNS == cache->dnsIndex)
  1184. {
  1185. if (cfig.dns[1])
  1186. {
  1187. cfig.currentDNS++;
  1188. if (cfig.currentDNS >= MAX_SERVERS || !cfig.dns[cfig.currentDNS])
  1189. cfig.currentDNS = 0;
  1190. }
  1191. }
  1192. }
  1193. else if (cache->dnsIndex >= 128 && cache->dnsIndex < 192)
  1194. {
  1195. data6 *dnsRoute = &cfig.dnsRoutes[(cache->dnsIndex - 128) / 2];
  1196. BYTE currentDNS = cache->dnsIndex % 2;
  1197. if (dnsRoute->currentDNS == currentDNS && dnsRoute->dns[1])
  1198. {
  1199. dnsRoute->currentDNS = 1 - dnsRoute->currentDNS;
  1200. }
  1201. }
  1202. }
  1203. delDnsEntry(ind, cache);
  1204. //maxDelete--;
  1205. }
  1206. else if (cache->expiry > p->first)
  1207. {
  1208. q = p;
  1209. p++;
  1210. dnsAge[ind].erase(q);
  1211. dnsAge[ind].insert(pair<long, data7*>(cache->expiry, cache));
  1212. }
  1213. else
  1214. p++;
  1215. }
  1216. if (ind == cacheInd && dhcpService)
  1217. {
  1218. //printf("dhcpAge=%un", dhcpAge.size());
  1219. p = dhcpAge.begin();
  1220. while (p != dhcpAge.end() && p->first < t)
  1221. {
  1222. cache = p->second;
  1223. //printf("processing %s=%in", cache->mapname, p->first - t);
  1224. if (cache->active && cache->expiry < t)
  1225. {
  1226. q = p;
  1227. p++;
  1228. cache->active = 0;
  1229. dhcpAge.erase(q);
  1230. cfig.serial1 = time(NULL);
  1231. cfig.serial2 = time(NULL);
  1232. if (cfig.expire > (DWORD)(LONG_MAX - t))
  1233. cfig.expireTime = LONG_MAX;
  1234. else
  1235. cfig.expireTime = t + cfig.expire;
  1236. sendRepl(cache);
  1237. //printf("Lease releasedn");
  1238. }
  1239. else if (cache->expiry > p->first)
  1240. {
  1241. q = p;
  1242. p++;
  1243. dhcpAge.erase(q);
  1244. dhcpAge.insert(pair<long, data7*>(cache->expiry, cache));
  1245. }
  1246. else
  1247. p++;
  1248. }
  1249. }
  1250. //printf("Done %u=%un",dnsCache[ind].size(),dnsAge[ind].size());
  1251. }
  1252. void calcRangeLimits(DWORD ip, DWORD mask, DWORD *rangeStart, DWORD *rangeEnd)
  1253. {
  1254. *rangeStart = htonl(ip & mask) + 1;
  1255. *rangeEnd = htonl(ip | (~mask)) - 1;
  1256. }
  1257. bool checkMask(DWORD mask)
  1258. {
  1259. mask = htonl(mask);
  1260. while (mask)
  1261. {
  1262. if (mask < (mask << 1))
  1263. return false;
  1264. mask <<= 1;
  1265. }
  1266. return true;
  1267. }
  1268. DWORD calcMask(DWORD rangeStart, DWORD rangeEnd)
  1269. {
  1270. data15 ip1, ip2, mask;
  1271. ip1.ip = htonl(rangeStart);
  1272. ip2.ip = htonl(rangeEnd);
  1273. for (BYTE i = 0; i < 4; i++)
  1274. {
  1275. mask.octate[i] = ip1.octate[i] ^ ip2.octate[i];
  1276. if (i && mask.octate[i - 1] < 255)
  1277. mask.octate[i] = 0;
  1278. else if (mask.octate[i] == 0)
  1279. mask.octate[i] = 255;
  1280. else if (mask.octate[i] < 2)
  1281. mask.octate[i] = 254;
  1282. else if (mask.octate[i] < 4)
  1283. mask.octate[i] = 252;
  1284. else if (mask.octate[i] < 8)
  1285. mask.octate[i] = 248;
  1286. else if (mask.octate[i] < 16)
  1287. mask.octate[i] = 240;
  1288. else if (mask.octate[i] < 32)
  1289. mask.octate[i] = 224;
  1290. else if (mask.octate[i] < 64)
  1291. mask.octate[i] = 192;
  1292. else if (mask.octate[i] < 128)
  1293. mask.octate[i] = 128;
  1294. else
  1295. mask.octate[i] = 0;
  1296. }
  1297. return mask.ip;
  1298. }
  1299. data7 *findEntry(BYTE ind, char *key, BYTE entryType)
  1300. {
  1301. myLower(key);
  1302. hostMap::iterator it = dnsCache[ind].find(key);
  1303. while (it != dnsCache[ind].end() && !strcasecmp(it->second->mapname, key))
  1304. if (it->second->dataType == entryType)
  1305. return it->second;
  1306. else
  1307. it++;
  1308. return NULL;
  1309. }
  1310. data7 *findEntry(BYTE ind, char *key)
  1311. {
  1312. //printf("finding %u=%sn",ind,key);
  1313. myLower(key);
  1314. hostMap::iterator it = dnsCache[ind].find(key);
  1315. if (it != dnsCache[ind].end())
  1316. return it->second;
  1317. else
  1318. return NULL;
  1319. }
  1320. void addEntry(BYTE ind, data7 *entry)
  1321. {
  1322. myLower(entry->mapname);
  1323. dnsCache[ind].insert(pair<string, data7*>(entry->mapname, entry));
  1324. if (entry->expiry && entry->expiry < LONG_MAX)
  1325. dnsAge[ind].insert(pair<long, data7*>(entry->expiry, entry));
  1326. }
  1327. void delDnsEntry(BYTE ind, data7* cache)
  1328. {
  1329. if (cache)
  1330. {
  1331. //printf("CacheIndex=%u Size=%u, Entry %s being deletedn", cache->cacheInd, dnsCache[cache->cacheInd].size(), cache->mapname);
  1332. if (ind <= 1)
  1333. {
  1334. dnsCache[ind].erase(cache->mapname);
  1335. switch (cache->dataType)
  1336. {
  1337. case QUEUE:
  1338. if (cache->addr)
  1339. free(cache->addr);
  1340. if (cache->query)
  1341. free(cache->query);
  1342. if (cache->mapname)
  1343. free(cache->mapname);
  1344. break;
  1345. case LOCAL_PTR_AUTH:
  1346. case LOCAL_PTR_NAUTH:
  1347. case LOCALHOST_PTR:
  1348. case SERVER_PTR_AUTH:
  1349. case SERVER_PTR_NAUTH:
  1350. case STATIC_PTR_AUTH:
  1351. case STATIC_PTR_NAUTH:
  1352. case LOCAL_CNAME:
  1353. case EXT_CNAME:
  1354. case CACHED:
  1355. if (cache->hostname)
  1356. free(cache->hostname);
  1357. if (cache->mapname)
  1358. free(cache->mapname);
  1359. break;
  1360. default:
  1361. if (cache->mapname)
  1362. free(cache->mapname);
  1363. break;
  1364. }
  1365. free(cache);
  1366. }
  1367. }
  1368. return ;
  1369. }
  1370. char *cloneString(char *string)
  1371. {
  1372. char *s = (char*)calloc(1, strlen(string) + 1);
  1373. if (s)
  1374. {
  1375. strcpy(s, string);
  1376. }
  1377. return s;
  1378. }
  1379. void *refresh(void *lpParam)
  1380. {
  1381. bool repeat = !lpParam;
  1382. time_t t = time(NULL);
  1383. char tempbuff[256];
  1384. char logBuff[256];
  1385. while (true)
  1386. {
  1387. sprintf(logBuff, "Checking Serial from Primary Server %s", IP2String(tempbuff, cfig.zoneServers[0]));
  1388. logDNSMess(logBuff, 2);
  1389. DWORD serial1 = getSerial(cfig.zone);
  1390. DWORD serial2 = getSerial(cfig.authority);
  1391. if (!serial1 || !serial2)
  1392. {
  1393. sprintf(logBuff, "Failed to get Serial from %s", IP2String(tempbuff, cfig.zoneServers[0]));
  1394. logDNSMess(logBuff, 1);
  1395. sleep((cfig.retry));
  1396. continue;
  1397. }
  1398. else if (cfig.serial1 && cfig.serial1 == serial1 && cfig.serial2 && cfig.serial2 == serial2)
  1399. {
  1400. sprintf(logBuff, "Zone Refresh not required");
  1401. logDNSMess(logBuff, 2);
  1402. if (cfig.expire > (DWORD)(LONG_MAX - t))
  1403. cfig.expireTime = LONG_MAX;
  1404. else
  1405. cfig.expireTime = t + cfig.expire;
  1406. sleep((cfig.refresh));
  1407. }
  1408. else
  1409. {
  1410. serial1 = getRefresh(1 - cacheInd, cfig.zone);
  1411. serial2 = getRefresh(1 - cacheInd, cfig.authority);
  1412. if (!serial1 || !serial2)
  1413. {
  1414. sprintf(logBuff, "Waiting %i seconds to retry", cfig.retry);
  1415. logDNSMess(logBuff, 1);
  1416. sleep((cfig.retry));
  1417. }
  1418. else
  1419. {
  1420. newInd = 1 - cacheInd;
  1421. cfig.serial1 = serial1;
  1422. cfig.serial2 = serial2;
  1423. if (cfig.expire > (DWORD)(LONG_MAX - t))
  1424. cfig.expireTime = LONG_MAX;
  1425. else
  1426. cfig.expireTime = t + cfig.expire;
  1427. if (!repeat)
  1428. break;
  1429. sleep((cfig.refresh));
  1430. }
  1431. }
  1432. }
  1433. }
  1434. DWORD getSerial(char *zone)
  1435. {
  1436. time_t t = time(NULL);
  1437. char tempbuff[256];
  1438. char logBuff[256];
  1439. DWORD serial1 = 0;
  1440. data5 req;
  1441. memset(&req, 0, sizeof(data5));
  1442. req.addr.sin_family = AF_INET;
  1443. req.addr.sin_port = htons(IPPORT_DNS);
  1444. timeval tv1;
  1445. fd_set readfds1;
  1446. if (cfig.replication == 2)
  1447. req.addr.sin_addr.s_addr = cfig.zoneServers[0];
  1448. else
  1449. req.addr.sin_addr.s_addr = cfig.zoneServers[1];
  1450. req.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  1451. req.dnsp = (dnsPacket*)req.raw;
  1452. req.dnsp->header.qdcount = htons(1);
  1453. req.dnsp->header.xid = (t % USHRT_MAX);
  1454. req.data = &req.dnsp->data;
  1455. req.data += pQu(req.data, zone);
  1456. req.data += pUShort(req.data, DNS_TYPE_SOA);
  1457. req.data += pUShort(req.data, DNS_CLASS_IN);
  1458. req.bytes = (DWORD)req.data - (DWORD)req.raw;
  1459. //pUShort(req.raw, req.bytes - 2);
  1460. if ((req.bytes = sendto(req.sock, req.raw, req.bytes, 0, (sockaddr*)&req.addr, sizeof(req.addr))) <= 0)
  1461. {
  1462. closesocket(req.sock);
  1463. sprintf(logBuff, "Failed to send request to Primary Server %s", IP2String(tempbuff, req.addr.sin_addr.s_addr));
  1464. logDNSMess(logBuff, 1);
  1465. return 0;
  1466. }
  1467. FD_ZERO(&readfds1);
  1468. tv1.tv_sec = 3;
  1469. tv1.tv_usec = 0;
  1470. FD_SET(req.sock, &readfds1);
  1471. select(USHRT_MAX, &readfds1, NULL, NULL, &tv1);
  1472. if (FD_ISSET(req.sock, &readfds1))
  1473. {
  1474. req.sockLen = sizeof(req.addr);
  1475. req.bytes = recvfrom(req.sock, req.raw, sizeof(req.raw), 0, (sockaddr*)&req.addr, &req.sockLen);
  1476. if (req.bytes > 0 && req.dnsp->header.qr && !req.dnsp->header.rcode && ntohs(req.dnsp->header.ancount))
  1477. {
  1478. req.data = &req.dnsp->data;
  1479. for (int j = 1; j <= ntohs(req.dnsp->header.qdcount); j++)
  1480. {
  1481. req.data += fQu(tempbuff, req.dnsp, req.data);
  1482. req.data += 4;
  1483. }
  1484. for (int i = 1; i <= ntohs(req.dnsp->header.ancount); i++)
  1485. {
  1486. req.data += fQu(tempbuff, req.dnsp, req.data);
  1487. req.qtype = fUShort(req.data);
  1488. req.data += 2; //type
  1489. req.qclass = fUShort(req.data);
  1490. req.data += 2; //class
  1491. fULong(req.data);
  1492. req.data += 4; //ttl
  1493. req.data += 2; //datalength
  1494. if (req.qtype == DNS_TYPE_SOA)
  1495. {
  1496. req.data += fQu(tempbuff, req.dnsp, req.data);
  1497. req.data += fQu(tempbuff, req.dnsp, req.data);
  1498. serial1 = fULong(req.data);
  1499. }
  1500. }
  1501. }
  1502. }
  1503. closesocket(req.sock);
  1504. return serial1;
  1505. }
  1506. void checkDNS(BYTE dnsIndex)
  1507. {
  1508. time_t t = time(NULL);
  1509. //printf("DNS Index %un", dnsIndex);
  1510. data5 req;
  1511. memset(&req, 0, sizeof(data5));
  1512. strcpy(req.query, "1.0.0.127.in-addr.arpa");
  1513. req.addr.sin_family = AF_INET;
  1514. req.addr.sin_port = htons(IPPORT_DNS);
  1515. if (dnsIndex < MAX_SERVERS)
  1516. {
  1517. if (cfig.currentDNS == dnsIndex)
  1518. req.addr.sin_addr.s_addr = cfig.dns[dnsIndex];
  1519. else
  1520. return;
  1521. }
  1522. else if (dnsIndex >= 128 && dnsIndex < 192)
  1523. {
  1524. BYTE childIndex = (dnsIndex - 128) / 2;
  1525. data6 *dnsRoute = &cfig.dnsRoutes[childIndex];
  1526. BYTE currentDNS = dnsIndex % 2;
  1527. if (dnsRoute->currentDNS == currentDNS)
  1528. req.addr.sin_addr.s_addr = dnsRoute->dns[currentDNS];
  1529. else
  1530. return;
  1531. }
  1532. else
  1533. return;
  1534. req.dnsp = (dnsPacket*)req.raw;
  1535. req.dnsp->header.qdcount = htons(1);
  1536. req.dnsp->header.xid = (t % USHRT_MAX);
  1537. req.data = &req.dnsp->data;
  1538. req.data += pQu(req.data, req.query);
  1539. req.data += pUShort(req.data, DNS_TYPE_PTR);
  1540. req.data += pUShort(req.data, DNS_CLASS_IN);
  1541. req.bytes = (DWORD)req.data - (DWORD)req.raw;
  1542. char mapname[8];
  1543. sprintf(mapname, "%u", req.dnsp->header.xid);
  1544. data7 *queue = findEntry(cacheInd, mapname, DNS_CHECK);
  1545. if (!queue)
  1546. {
  1547. if ((req.bytes = sendto(cfig.forwConn.sock, req.raw, req.bytes, 0, (sockaddr*)&req.addr, sizeof(req.addr))) > 0)
  1548. {
  1549. queue = (data7*)calloc(1, sizeof(data7));
  1550. if (queue)
  1551. {
  1552. queue->mapname = cloneString(mapname);
  1553. if (!queue->mapname)
  1554. {
  1555. free(queue);
  1556. return;
  1557. }
  1558. queue->expiry = 2 + t;
  1559. queue->dataType = DNS_CHECK;
  1560. queue->sockInd = 255;
  1561. queue->dnsIndex = dnsIndex;
  1562. addEntry(cacheInd, queue);
  1563. }
  1564. else
  1565. return;
  1566. if (cfig.dnsLogLevel)
  1567. {
  1568. if (dnsIndex < MAX_SERVERS)
  1569. sprintf(logBuff, "Verification sent to Forwarding DNS Server %s", IP2String(tempbuff, req.addr.sin_addr.s_addr));
  1570. else
  1571. sprintf(logBuff, "Verification sent to Child DNS Server %s", IP2String(tempbuff, req.addr.sin_addr.s_addr));
  1572. logDNSMess(logBuff, 1);
  1573. }
  1574. }
  1575. }
  1576. }
  1577. char *getServerName(char *target, DWORD ip)
  1578. {
  1579. time_t t = time(NULL);
  1580. data5 req;
  1581. memset(&req, 0, sizeof(data5));
  1582. req.addr.sin_family = AF_INET;
  1583. req.addr.sin_port = htons(IPPORT_DNS);
  1584. req.addr.sin_addr.s_addr = ip;
  1585. timeval tv1;
  1586. fd_set readfds1;
  1587. req.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  1588. req.dnsp = (dnsPacket*)req.raw;
  1589. req.dnsp->header.qdcount = htons(1);
  1590. req.dnsp->header.xid = (t % USHRT_MAX);
  1591. req.data = &req.dnsp->data;
  1592. IP2String(target, htonl(ip));
  1593. strcat(target, arpa);
  1594. req.data += pQu(req.data, target);
  1595. req.data += pUShort(req.data, DNS_TYPE_PTR);
  1596. req.data += pUShort(req.data, DNS_CLASS_IN);
  1597. req.bytes = (DWORD)req.data - (DWORD)req.raw;
  1598. //pUShort(req.raw, req.bytes - 2);
  1599. if ((req.bytes = sendto(req.sock, req.raw, req.bytes, 0, (sockaddr*)&req.addr, sizeof(req.addr))) <= 0)
  1600. {
  1601. closesocket(req.sock);
  1602. return NULL;
  1603. }
  1604. FD_ZERO(&readfds1);
  1605. tv1.tv_sec = 5;
  1606. tv1.tv_usec = 0;
  1607. FD_SET(req.sock, &readfds1);
  1608. select(USHRT_MAX, &readfds1, NULL, NULL, &tv1);
  1609. if (FD_ISSET(req.sock, &readfds1))
  1610. {
  1611. req.sockLen = sizeof(req.addr);
  1612. req.bytes = recvfrom(req.sock, req.raw, sizeof(req.raw), 0, (sockaddr*)&req.addr, &req.sockLen);
  1613. if (req.bytes > 0 && req.dnsp->header.qr && !req.dnsp->header.rcode && ntohs(req.dnsp->header.ancount))
  1614. {
  1615. closesocket(req.sock);
  1616. return getResult(&req);
  1617. }
  1618. }
  1619. closesocket(req.sock);
  1620. return NULL;
  1621. }
  1622. WORD recvTcpDnsMess(SOCKET sock, char *target, bool ready)
  1623. {
  1624. timeval tv1;
  1625. fd_set readfds1;
  1626. if (!ready)
  1627. {
  1628. FD_ZERO(&readfds1);
  1629. tv1.tv_sec = 5;
  1630. tv1.tv_usec = 0;
  1631. FD_SET(sock, &readfds1);
  1632. if (!select(sock + 1, &readfds1, NULL, NULL, &tv1))
  1633. return 0;
  1634. }
  1635. errno = 0;
  1636. WORD rcd = recv(sock, target, 2, 0);
  1637. //errno = WSAGetLastError();
  1638. if (errno)
  1639. return 0;
  1640. if (rcd == 2)
  1641. {
  1642. WORD bytes = fUShort(target) + rcd;
  1643. char *ptr;
  1644. while (rcd < bytes)
  1645. {
  1646. FD_ZERO(&readfds1);
  1647. tv1.tv_sec = 5;
  1648. tv1.tv_usec = 0;
  1649. FD_SET(sock, &readfds1);
  1650. ptr = target + rcd;
  1651. if (select(sock + 1, &readfds1, NULL, NULL, &tv1))
  1652. {
  1653. errno = 0;
  1654. rcd += recv(sock, ptr, bytes - rcd, 0);
  1655. //errno = WSAGetLastError();
  1656. if (errno)
  1657. return 0;
  1658. }
  1659. else
  1660. return 0;
  1661. }
  1662. return rcd;
  1663. }
  1664. return 0;
  1665. }
  1666. DWORD getRefresh(BYTE updateCache, char *zone)
  1667. {
  1668. char tempbuff[256];
  1669. char logBuff[256];
  1670. char hostname[256];
  1671. char cname[256];
  1672. DWORD serial1 = 0;
  1673. DWORD serial2 = 0;
  1674. DWORD hostExpiry = 0;
  1675. DWORD refresh = 0;
  1676. DWORD retry = 0;
  1677. DWORD expire = 0;
  1678. DWORD expiry;
  1679. DWORD minimum = 0;
  1680. int added = 0;
  1681. char *data;
  1682. char *dp;
  1683. DWORD ip;
  1684. data5 req;
  1685. memset(&req, 0, sizeof(data5));
  1686. req.addr.sin_family = AF_INET;
  1687. req.addr.sin_port = htons(IPPORT_DNS);
  1688. req.addr.sin_addr.s_addr = cfig.zoneServers[0];
  1689. req.sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  1690. if (req.sock == INVALID_SOCKET)
  1691. {
  1692. sprintf(logBuff, "Failed to Create Socket, Zone Transfer Failed", IP2String(tempbuff, req.addr.sin_addr.s_addr));
  1693. logDNSMess(logBuff, 1);
  1694. return 0;
  1695. }
  1696. req.sockLen = sizeof(req.addr);
  1697. time_t t = time(NULL);
  1698. if (connect(req.sock, (sockaddr*)&req.addr, req.sockLen) >= 0)
  1699. {
  1700. req.data = req.raw;
  1701. req.data += 2;
  1702. req.dnsp = (dnsPacket*)req.data;
  1703. req.dnsp->header.qdcount = htons(1);
  1704. req.dnsp->header.xid = (t % USHRT_MAX);
  1705. req.data = &req.dnsp->data;
  1706. req.data += pQu(req.data, zone);
  1707. req.data += pUShort(req.data, DNS_TYPE_AXFR);
  1708. req.data += pUShort(req.data, DNS_CLASS_IN);
  1709. req.bytes = (DWORD)req.data - (DWORD)req.raw;
  1710. pUShort(req.raw, req.bytes - 2);
  1711. if (send(req.sock, req.raw, req.bytes, 0) < req.bytes)
  1712. {
  1713. closesocket(req.sock);
  1714. sprintf(logBuff, "Failed to send request to Replication Server %s, Zone Transfer Failed", IP2String(tempbuff, req.addr.sin_addr.s_addr));
  1715. logDNSMess(logBuff, 1);
  1716. return 0;
  1717. }
  1718. if (!strcasecmp(zone, cfig.zone))
  1719. {
  1720. for (; cfig.mxCount[updateCache]; cfig.mxCount[updateCache]--)
  1721. strcpy(cfig.mxServers[updateCache][cfig.mxCount[updateCache]].hostname, "");
  1722. }
  1723. while (true)
  1724. {
  1725. req.bytes = recvTcpDnsMess(req.sock, req.raw, false);
  1726. //printf("bytes = %un", req.bytes);
  1727. if (req.bytes < 2)
  1728. break;
  1729. WORD pktSize = fUShort(req.raw);
  1730. if ((WORD)req.bytes < pktSize + 2)
  1731. break;
  1732. req.dnsp = (dnsPacket*)(req.raw + 2);
  1733. req.data = &req.dnsp->data;
  1734. if (!req.dnsp->header.qr || req.dnsp->header.rcode || !ntohs(req.dnsp->header.ancount))
  1735. break;
  1736. for (int j = 1; j <= ntohs(req.dnsp->header.qdcount); j++)
  1737. {
  1738. req.data += fQu(hostname, req.dnsp, req.data);
  1739. req.data += 4;
  1740. }
  1741. for (int i = 1; i <= ntohs(req.dnsp->header.ancount); i++)
  1742. {
  1743. //char *dp = req.data;
  1744. req.data += fQu(hostname, req.dnsp, req.data);
  1745. //printf("%sn", hostname);
  1746. req.qtype = fUShort(req.data);
  1747. req.data += 2; //type
  1748. req.qclass = fUShort(req.data);
  1749. req.data += 2; //class
  1750. expiry = fULong(req.data);
  1751. req.data += 4; //ttl
  1752. int zLen = fUShort(req.data);
  1753. req.data += 2; //datalength
  1754. data = req.data;
  1755. req.data += zLen;
  1756. switch (req.qtype)
  1757. {
  1758. case DNS_TYPE_SOA:
  1759. data += fQu(hostname, req.dnsp, data);
  1760. data += fQu(cname, req.dnsp, data);
  1761. if (!serial1)
  1762. {
  1763. hostExpiry = expiry;
  1764. serial1 = fULong(data);
  1765. data += 4;
  1766. refresh = fULong(data);
  1767. data += 4;
  1768. retry = fULong(data);
  1769. data += 4;
  1770. expire = fULong(data);
  1771. data += 4;
  1772. minimum = fULong(data);
  1773. data += 4;
  1774. added++;
  1775. }
  1776. else if (!serial2)
  1777. serial2 = fULong(data);
  1778. break;
  1779. case DNS_TYPE_A:
  1780. ip = fIP(data);
  1781. makeLocal(hostname);
  1782. if (dhcpService && expiry < hostExpiry)
  1783. {
  1784. char rInd = getRangeInd(ip);
  1785. int ind = getIndex(rInd, ip);
  1786. if (expiry > LONG_MAX)
  1787. expiry = LONG_MAX;
  1788. if (ind >= 0 && cfig.dhcpRanges[rInd].dhcpEntry[ind])
  1789. setLeaseExpiry(cfig.dhcpRanges[rInd].dhcpEntry[ind], expiry, false);
  1790. else
  1791. setLeaseExpiry(ip, 0);
  1792. if (expiry < (DWORD)(LONG_MAX - t))
  1793. expiry += t;
  1794. addToCache(updateCache, hostname, ip, expiry, LOCAL_A, NONE, serial1);
  1795. added++;
  1796. }
  1797. else
  1798. {
  1799. setLeaseExpiry(ip, LONG_MAX);
  1800. addToCache(updateCache, hostname, ip, LONG_MAX, STATIC_A_AUTH, NONE, serial1);
  1801. added++;
  1802. }
  1803. break;
  1804. case DNS_TYPE_PTR:
  1805. myLower(hostname);
  1806. dp = strstr(hostname, arpa);
  1807. if (dp)
  1808. {
  1809. *dp = 0;
  1810. ip = ntohl(inet_addr(hostname));
  1811. fQu(hostname, req.dnsp, data);
  1812. makeLocal(hostname);
  1813. if (dhcpService && expiry < hostExpiry)
  1814. {
  1815. char rInd = getRangeInd(ip);
  1816. int ind = getIndex(rInd, ip);
  1817. if (expiry > LONG_MAX)
  1818. expiry = LONG_MAX;
  1819. if (ind >= 0 && cfig.dhcpRanges[rInd].dhcpEntry[ind])
  1820. setLeaseExpiry(cfig.dhcpRanges[rInd].dhcpEntry[ind], expiry, false);
  1821. else
  1822. setLeaseExpiry(ip, 0);
  1823. if (expiry < (DWORD)(LONG_MAX - t))
  1824. expiry += t;
  1825. addToCache(updateCache, hostname, ip, expiry, NONE, LOCAL_PTR_AUTH, serial1);
  1826. added++;
  1827. }
  1828. else
  1829. {
  1830. setLeaseExpiry(ip, LONG_MAX);
  1831. addToCache(updateCache, hostname, ip, LONG_MAX, NONE, STATIC_PTR_AUTH, serial1);
  1832. added++;
  1833. }
  1834. }
  1835. break;
  1836. case DNS_TYPE_MX:
  1837. if (cfig.replication == 2 && makeLocal(hostname) == 3)
  1838. {
  1839. cfig.mxServers[updateCache][cfig.mxCount[updateCache]].pref = fUShort(data);
  1840. data += sizeof(WORD);
  1841. fQu(cname, req.dnsp, data);
  1842. strcpy(cfig.mxServers[updateCache][cfig.mxCount[updateCache]].hostname, cname);
  1843. cfig.mxCount[updateCache]++;
  1844. added++;
  1845. }
  1846. break;
  1847. case DNS_TYPE_NS:
  1848. if (cfig.replication == 2)
  1849. fQu(cfig.ns, req.dnsp, data);
  1850. break;
  1851. case DNS_TYPE_CNAME:
  1852. if (cfig.replication == 2)
  1853. {
  1854. fQu(cname, req.dnsp, data);
  1855. BYTE cname_type = 0;
  1856. if (makeLocal(cname))
  1857. cname_type = LOCAL_CNAME;
  1858. else
  1859. cname_type = EXT_CNAME;
  1860. makeLocal(hostname);
  1861. data7 *cache = findEntry(updateCache, hostname, cname_type);
  1862. if (!cache)
  1863. {
  1864. cache = (data7*)calloc(1, sizeof(data7));
  1865. if (cache)
  1866. {
  1867. cache->mapname = cloneString(hostname);
  1868. cache->dataType = cname_type;
  1869. cache->hostname = cloneString(cname);
  1870. if (cache->mapname && cache->hostname)
  1871. {
  1872. addEntry(updateCache, cache);
  1873. }
  1874. else
  1875. {
  1876. sprintf(logBuff, "Memory Error");
  1877. logDNSMess(logBuff, 1);
  1878. continue;
  1879. }
  1880. }
  1881. else
  1882. {
  1883. sprintf(logBuff, "Memory Error");
  1884. logDNSMess(logBuff, 1);
  1885. continue;
  1886. }
  1887. }
  1888. else
  1889. {
  1890. if (strcasecmp(cname, cache->hostname))
  1891. {
  1892. free(cache->hostname);
  1893. cache->hostname = cloneString(cname);
  1894. }
  1895. }
  1896. cache->expiry = LONG_MAX;
  1897. cache->serial = serial1;
  1898. added++;
  1899. }
  1900. break;
  1901. }
  1902. //printf("serial=%u %u %un", serial1, serial2, hostExpiry);
  1903. }
  1904. }
  1905. strcpy(hostname, cfig.ns);
  1906. makeLocal(hostname);
  1907. data7 *cache = findEntry(updateCache, hostname, STATIC_A_AUTH);
  1908. if (!cache)
  1909. cache = findEntry(updateCache, hostname, STATIC_A_NAUTH);
  1910. if (cache)
  1911. cfig.nsIP = cache->ip;
  1912. closesocket(req.sock);
  1913. if (serial1 && serial1 == serial2 && hostExpiry)
  1914. {
  1915. if (cfig.replication == 2)
  1916. {
  1917. //printf("Here %u %u %u %u %u n",hostExpiry,refresh,retry,expire,minimum);
  1918. cfig.lease = hostExpiry;
  1919. cfig.refresh = refresh;
  1920. cfig.retry = retry;
  1921. cfig.expire = expire;
  1922. cfig.minimum = minimum;
  1923. }
  1924. if (cacheInd != updateCache)
  1925. {
  1926. if (!strcasecmp(zone, cfig.zone))
  1927. {
  1928. hostMap::iterator q = dnsCache[updateCache].begin();
  1929. while (q != dnsCache[updateCache].end())
  1930. {
  1931. //printf("%s=%un", q->second->mapname,q->second->serial);
  1932. switch (q->second->dataType)
  1933. {
  1934. case LOCAL_A:
  1935. case SERVER_A:
  1936. case STATIC_A_AUTH:
  1937. case LOCAL_CNAME:
  1938. case EXT_CNAME:
  1939. if (q->second->serial < serial1)
  1940. q->second->expiry = 0;
  1941. }
  1942. q++;
  1943. }
  1944. }
  1945. else if (!strcasecmp(zone, cfig.authority))
  1946. {
  1947. hostMap::iterator q = dnsCache[updateCache].begin();
  1948. while (q != dnsCache[updateCache].end())
  1949. {
  1950. //printf("%s=%un", q->second->mapname,q->second->serial);
  1951. switch (q->second->dataType)
  1952. {
  1953. case LOCAL_PTR_AUTH:
  1954. case STATIC_PTR_AUTH:
  1955. case SERVER_PTR_AUTH:
  1956. if (q->second->serial < serial1)
  1957. q->second->expiry = 0;
  1958. }
  1959. q++;
  1960. }
  1961. }
  1962. checkSize(updateCache);
  1963. }
  1964. //printf("Refresh ind %i serial %u size %in", updateCache, serial1, dnsCache[updateCache].size());
  1965. sprintf(logBuff, "Zone %s Transferred from %s, %u RRs imported", zone, IP2String(tempbuff, req.addr.sin_addr.s_addr), added);
  1966. logDNSMess(logBuff, 2);
  1967. return serial1;
  1968. }
  1969. else if (!serial1)
  1970. {
  1971. sprintf(logBuff, "Replication Server %s, Missing Serial", IP2String(tempbuff, req.addr.sin_addr.s_addr));
  1972. logDNSMess(logBuff, 1);
  1973. }
  1974. else if (serial1 != serial2)
  1975. {
  1976. sprintf(logBuff, "Replication Server %s, Serial Changed %u %u", IP2String(tempbuff, req.addr.sin_addr.s_addr), serial1, serial2);
  1977. logDNSMess(logBuff, 1);
  1978. }
  1979. else
  1980. {
  1981. sprintf(logBuff, "Replication Server %s, Invalid AXFR data", IP2String(tempbuff, req.addr.sin_addr.s_addr));
  1982. logDNSMess(logBuff, 1);
  1983. }
  1984. }
  1985. else
  1986. {
  1987. //errno = WSAGetLastError();
  1988. sprintf(logBuff, "Server %s, Error %s", IP2String(tempbuff, req.addr.sin_addr.s_addr), strerror(errno));
  1989. logDNSMess(logBuff, 1);
  1990. closesocket(req.sock);
  1991. }
  1992. return 0;
  1993. }
  1994. void getSecondary()
  1995. {
  1996. char hostname[256];
  1997. DWORD ip;
  1998. DWORD hostExpiry;
  1999. DWORD expiry;
  2000. char *data;
  2001. char *dp;
  2002. WORD rr = 0;
  2003. data5 req;
  2004. memset(&req, 0, sizeof(data5));
  2005. req.addr.sin_family = AF_INET;
  2006. req.addr.sin_port = htons(IPPORT_DNS);
  2007. req.addr.sin_addr.s_addr = cfig.zoneServers[1];
  2008. req.sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  2009. if (req.sock == INVALID_SOCKET)
  2010. return;
  2011. req.sockLen = sizeof(req.addr);
  2012. time_t t = time(NULL);
  2013. if (connect(req.sock, (sockaddr*)&req.addr, req.sockLen) >= 0)
  2014. {
  2015. req.data = req.raw;
  2016. req.data += 2;
  2017. req.dnsp = (dnsPacket*)req.data;
  2018. req.dnsp->header.qdcount = htons(1);
  2019. req.dnsp->header.xid = (t % USHRT_MAX);
  2020. req.data = &req.dnsp->data;
  2021. req.data += pQu(req.data, cfig.authority);
  2022. req.data += pUShort(req.data, DNS_TYPE_AXFR);
  2023. req.data += pUShort(req.data, DNS_CLASS_IN);
  2024. req.bytes = (DWORD)req.data - (DWORD)req.raw;
  2025. pUShort(req.raw, req.bytes - 2);
  2026. if (send(req.sock, req.raw, req.bytes, 0) < req.bytes)
  2027. {
  2028. closesocket(req.sock);
  2029. return;
  2030. }
  2031. while (true)
  2032. {
  2033. req.bytes = recvTcpDnsMess(req.sock, req.raw, false);
  2034. //printf("bytes = %un", req.bytes);
  2035. if (req.bytes < 2)
  2036. break;
  2037. WORD pktSize = fUShort(req.raw);
  2038. if ((WORD)req.bytes < pktSize + 2)
  2039. break;
  2040. req.dnsp = (dnsPacket*)(req.raw + 2);
  2041. req.data = &req.dnsp->data;
  2042. if (!req.dnsp->header.qr || req.dnsp->header.rcode || !ntohs(req.dnsp->header.ancount))
  2043. break;
  2044. for (int j = 1; j <= ntohs(req.dnsp->header.qdcount); j++)
  2045. {
  2046. req.data += fQu(hostname, req.dnsp, req.data);
  2047. req.data += 4;
  2048. }
  2049. for (int i = 1; i <= ntohs(req.dnsp->header.ancount); i++)
  2050. {
  2051. //char *dp = req.data;
  2052. req.data += fQu(hostname, req.dnsp, req.data);
  2053. //printf("%sn", hostname);
  2054. req.qtype = fUShort(req.data);
  2055. req.data += 2; //type
  2056. req.qclass = fUShort(req.data);
  2057. req.data += 2; //class
  2058. expiry = fULong(req.data);
  2059. req.data += 4; //ttl
  2060. int zLen = fUShort(req.data);
  2061. req.data += 2; //datalength
  2062. data = req.data;
  2063. req.data += zLen;
  2064. switch (req.qtype)
  2065. {
  2066. case DNS_TYPE_PTR:
  2067. myLower(hostname);
  2068. dp = strstr(hostname, arpa);
  2069. if (dp)
  2070. {
  2071. *dp = 0;
  2072. ip = ntohl(inet_addr(hostname));
  2073. fQu(hostname, req.dnsp, data);
  2074. makeLocal(hostname);
  2075. if (dhcpService && expiry < hostExpiry)
  2076. {
  2077. char rInd = getRangeInd(ip);
  2078. int ind = getIndex(rInd, ip);
  2079. if (expiry > LONG_MAX)
  2080. expiry = LONG_MAX;
  2081. if (ind >= 0 && cfig.dhcpRanges[rInd].dhcpEntry[ind])
  2082. setLeaseExpiry(cfig.dhcpRanges[rInd].dhcpEntry[ind], expiry, false);
  2083. else
  2084. setLeaseExpiry(ip, 0);
  2085. if (expiry < (DWORD)(LONG_MAX - t))
  2086. expiry += t;
  2087. addToCache(cacheInd, hostname, ip, expiry, LOCAL_A, NONE, cfig.serial1);
  2088. addToCache(cacheInd, hostname, ip, expiry, NONE, LOCAL_PTR_AUTH, cfig.serial2);
  2089. rr++;
  2090. }
  2091. }
  2092. break;
  2093. }
  2094. }
  2095. }
  2096. sprintf(logBuff, "%u RRs imported from Secondary Server", rr);
  2097. logDNSMess(logBuff, 2);
  2098. }
  2099. else
  2100. {
  2101. //errno = WSAGetLastError();
  2102. sprintf(logBuff, "Server %s, Error %s", IP2String(tempbuff, req.addr.sin_addr.s_addr), strerror(errno));
  2103. logDNSMess(logBuff, 1);
  2104. }
  2105. closesocket(req.sock);
  2106. }
  2107. void init()
  2108. {
  2109. time_t t = time(NULL);
  2110.     memset(&cfig, 0, sizeof(cfig));
  2111.     char iniStr[16384];
  2112.     char name[512];
  2113.     char value[512];
  2114.     if (verbatim)
  2115.     {
  2116.         cfig.dnsLogLevel = 2;
  2117. cfig.dhcpLogLevel = 2;
  2118.         printf("%snn", sVersion);
  2119.     }
  2120. else if (getSection("LOGGING", iniStr, 1, iniFile))
  2121. {
  2122. cfig.dnsLogLevel = 1;
  2123. cfig.dhcpLogLevel = 2;
  2124. char *iniStrPtr = myGetToken(iniStr, 0);
  2125. tempbuff[0] = 0;
  2126. for (; iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2127. {
  2128. printf("%sn", iniStrPtr);
  2129. mySplit(name, value, iniStrPtr, '=');
  2130. if (name[0] && value[0])
  2131. {
  2132. if (!strcasecmp(name, "DNSLogLevel"))
  2133. {
  2134. if (!strcasecmp(value, "None"))
  2135. cfig.dnsLogLevel = 0;
  2136. else if (!strcasecmp(value, "Errors"))
  2137. cfig.dnsLogLevel = 1;
  2138. else if (!strcasecmp(value, "All"))
  2139. cfig.dnsLogLevel = 2;
  2140. else
  2141. sprintf(tempbuff, "Section [LOGGING], Invalid DNSLogLevel: %s", value);
  2142. }
  2143. else if (!strcasecmp(name, "DHCPLogLevel"))
  2144. {
  2145. if (!strcasecmp(value, "None"))
  2146. cfig.dhcpLogLevel = 0;
  2147. else if (!strcasecmp(value, "Errors"))
  2148. cfig.dhcpLogLevel = 1;
  2149. else if (!strcasecmp(value, "All"))
  2150. cfig.dhcpLogLevel = 2;
  2151. else
  2152. sprintf(tempbuff, "Section [LOGGING], Invalid DHCPLogLevel: %s", value);
  2153. }
  2154. else
  2155. sprintf(tempbuff, "Section [LOGGING], Invalid Entry %s ignored", iniStrPtr);
  2156. }
  2157. else
  2158. sprintf(tempbuff, "Section [LOGGING], Invalid Entry %s ignored", iniStrPtr);
  2159. }
  2160. }
  2161. if (!verbatim && (cfig.dnsLogLevel || cfig.dhcpLogLevel) && logFile[0])
  2162. {
  2163. tm *ttm = localtime(&t);
  2164. loggingDay = ttm->tm_yday;
  2165. strftime(currentLogFile, sizeof(extbuff), logFile, ttm);
  2166. cfig.logfile = fopen(currentLogFile, "at");
  2167. if (cfig.logfile)
  2168. {
  2169. sprintf(logBuff, "%s Starting..", sVersion);
  2170. logMess(logBuff, 1);
  2171. if (tempbuff[0])
  2172. logMess(tempbuff, 0);
  2173. }
  2174.         else
  2175.         {
  2176.             sprintf(name, "Warning: faled to open log file %s", extbuff);
  2177.             syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), name);
  2178. if (tempbuff[0])
  2179.             syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), tempbuff);
  2180.         }
  2181.     }
  2182. if (getSection("SERVICES", iniStr, 1, iniFile))
  2183. {
  2184. dhcpService = false;
  2185. dnsService = false;
  2186. char *iniStrPtr = myGetToken(iniStr, 0);
  2187. for (int i = 0; i < 2 && iniStrPtr[0]; i++, iniStrPtr = myGetToken(iniStrPtr, 1))
  2188. if (!strcasecmp(iniStrPtr, "DNS"))
  2189. dnsService = true;
  2190. else if (!strcasecmp(iniStrPtr, "DHCP"))
  2191. dhcpService = true;
  2192. if (!dhcpService && !dnsService)
  2193. {
  2194. dhcpService = true;
  2195. dnsService = true;
  2196. }
  2197. }
  2198. cfig.lease = 360000;
  2199. cfig.refresh = 3600;
  2200. cfig.retry = 100;
  2201. cfig.expire = 360000;
  2202. cfig.minimum = 100;
  2203. if (getSection("TIMINGS", iniStr, 1, iniFile))
  2204. {
  2205. char *iniStrPtr = myGetToken(iniStr, 0);
  2206. for (; iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2207. {
  2208. mySplit(name, value, iniStrPtr, '=');
  2209. if (name[0] && value[0])
  2210. {
  2211. if (atol(value) || !strcasecmp(value,"0"))
  2212. {
  2213. if (!strcasecmp(name, "Lease_Time"))
  2214. {
  2215. cfig.lease = atol(value);
  2216. if (!cfig.lease)
  2217. cfig.lease = ULONG_MAX;
  2218. cfig.refresh = cfig.lease / 10;
  2219. if (cfig.refresh > 36000)
  2220. cfig.refresh = 36000;
  2221. cfig.retry = cfig.refresh / 10;
  2222. if (ULONG_MAX/24 > cfig.lease)
  2223. cfig.expire = 24 * cfig.lease;
  2224. else
  2225. cfig.expire = ULONG_MAX;
  2226. cfig.minimum = cfig.retry;
  2227. }
  2228. else if (!strcasecmp(name, "Refresh"))
  2229. cfig.refresh = atol(value);
  2230. else if (!strcasecmp(name, "Retry"))
  2231. cfig.retry = atol(value);
  2232. else if (!strcasecmp(name, "Expire"))
  2233. cfig.expire = atol(value);
  2234. else if (!strcasecmp(name, "Minimum"))
  2235. cfig.minimum = atol(value);
  2236. else if (!strcasecmp(name, "MinCacheTime"))
  2237. cfig.minCache = atol(value);
  2238. else if (!strcasecmp(name, "MaxCacheTime"))
  2239. cfig.maxCache = atol(value);
  2240. else
  2241. {
  2242. sprintf(logBuff, "Section [TIMINGS], Invalid Entry: %s ignored", name);
  2243. logDNSMess(logBuff, 1);
  2244. }
  2245. }
  2246. else
  2247. {
  2248. sprintf(logBuff, "Section [TIMINGS], Invalid value: %s ignored", value);
  2249. logDNSMess(logBuff, 1);
  2250. }
  2251. }
  2252. else
  2253. {
  2254. sprintf(logBuff, "Section [TIMINGS], Missing value, entry %s ignored", iniStrPtr);
  2255. logDNSMess(logBuff, 1);
  2256. }
  2257. }
  2258. }
  2259. if (!cfig.refresh)
  2260. {
  2261. cfig.refresh = ULONG_MAX;
  2262. if (!cfig.retry)
  2263. cfig.retry = 100;
  2264. }
  2265. else if (!cfig.retry)
  2266. cfig.retry = cfig.refresh / 10;
  2267. if (!cfig.expire)
  2268. cfig.expire = ULONG_MAX;
  2269. if (!cfig.minimum)
  2270. cfig.minimum = cfig.retry;
  2271. if (getSection("DOMAIN-NAME", iniStr, 1, iniFile))
  2272. {
  2273. char *iniStrPtr = myGetToken(iniStr, 0);
  2274. mySplit(name, value, iniStrPtr, '=');
  2275. if (name[0] && value[0])
  2276. {
  2277. data15 mask;
  2278. data15 network;
  2279. char left[64];
  2280. cfig.authority[0] = 0;
  2281. myLower(value);
  2282. mask.ip = 0;
  2283. network.ip = 0;
  2284. for (BYTE octateNum = 0; octateNum < 3; octateNum++)
  2285. {
  2286. mySplit(left, value, value, '.');
  2287. if (left[0] == '0' || (atoi(left) && atoi(left) < 256))
  2288. {
  2289. for (int j = 2; j >= 0; j--)
  2290. {
  2291. network.octate[j + 1] = network.octate[j];
  2292. mask.octate[j + 1] = mask.octate[j];
  2293. }
  2294. mask.octate[0] = 255;
  2295. network.octate[0] = atoi(left);
  2296. strcat(cfig.authority, left);
  2297. strcat(cfig.authority, ".");
  2298. }
  2299. else
  2300. break;
  2301. if (!strcasecmp(value, arpa + 1))
  2302. break;
  2303. }
  2304. if (!strcasecmp(value, arpa + 1))
  2305. {
  2306. strcat(cfig.authority, arpa + 1);
  2307. cfig.aLen = strlen(cfig.authority);
  2308. calcRangeLimits(network.ip, mask.ip, &cfig.rangeStart, &cfig.rangeEnd);
  2309. cfig.authorized = 1;
  2310. }
  2311. else
  2312. {
  2313. sprintf(logBuff, "Warning: Invalid Domain Name (Part %s), ignored", cfig.authority);
  2314. cfig.aLen = 0;
  2315. cfig.authority[0] = 0;
  2316. logDNSMess(logBuff, 1);
  2317. }
  2318. }
  2319. if (chkQu(name))
  2320. {
  2321. strcpy(cfig.zone, name);
  2322. strcpy(cfig.zoneSmall, name);
  2323. myLower(cfig.zoneSmall);
  2324. cfig.zLen = strlen(cfig.zone);
  2325. }
  2326. else
  2327. {
  2328. cfig.aLen = 0;
  2329. cfig.authority[0] = 0;
  2330. sprintf(logBuff, "Warning: Invalid Domain Name %s, ignored", iniStrPtr);
  2331. logDNSMess(logBuff, 1);
  2332. }
  2333. }
  2334. getServ();
  2335. getDServ();
  2336. sprintf(cfig.servername_fqn, "%s.%s", cfig.servername, cfig.zone);
  2337. strcpy(cfig.ns, cfig.servername_fqn);
  2338. cfig.zLen = strlen(cfig.zone);
  2339. bool ifSpecified = false;
  2340. if (getSection("LISTEN-ON", iniStr, 1, iniFile))
  2341. {
  2342. char *iniStrPtr = myGetToken(iniStr, 0);
  2343. for (int i = 0; i < MAX_SERVERS && iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2344. {
  2345. ifSpecified = true;
  2346. DWORD addr = my_inet_addr(iniStrPtr);
  2347. if (isIP(iniStrPtr) && addr)
  2348. {
  2349. for (BYTE m = 0; ; m++)
  2350. {
  2351. if (m >= MAX_SERVERS || !cfig.staticServers[m])
  2352. {
  2353. if (findServer(cfig.allServers, addr))
  2354. {
  2355. sprintf(logBuff, "Warning: Section [LISTEN-ON], Interface %s is not Static, ignored", iniStrPtr);
  2356. logMess(logBuff, 1);
  2357. }
  2358. else
  2359. {
  2360. sprintf(logBuff, "Warning: Section [LISTEN-ON], Interface %s not available, ignored", iniStrPtr);
  2361. logMess(logBuff, 1);
  2362. }
  2363. break;
  2364. }
  2365. else if (cfig.staticServers[m] == addr)
  2366. {
  2367. for (BYTE n = 0; n < MAX_SERVERS; n++)
  2368. {
  2369. if (cfig.listenServers[n] == addr)
  2370. break;
  2371. else if (!cfig.listenServers[n])
  2372. {
  2373. cfig.listenServers[n] = cfig.staticServers[m];
  2374. cfig.listenMasks[n] = cfig.staticMasks[m];
  2375. break;
  2376. }
  2377. }
  2378. break;
  2379. }
  2380. }
  2381. }
  2382. else
  2383. {
  2384. sprintf(logBuff, "Warning: Section [LISTEN-ON], Invalid Interface Address %s, ignored", iniStrPtr);
  2385. logMess(logBuff, 1);
  2386. }
  2387. }
  2388. }
  2389. if (!ifSpecified)
  2390. {
  2391. BYTE k = 0;
  2392. for (BYTE m = 0; m < MAX_SERVERS && cfig.allServers[m]; m++)
  2393. {
  2394. for (BYTE n = 0; n < MAX_SERVERS; n++)
  2395. {
  2396. if (cfig.allServers[m] == cfig.staticServers[n])
  2397. {
  2398. cfig.listenServers[k] = cfig.staticServers[n];
  2399. cfig.listenMasks[k] = cfig.staticMasks[n];
  2400. k++;
  2401. break;
  2402. }
  2403. else if (!cfig.staticServers[n])
  2404. {
  2405. sprintf(logBuff, "Warning: Interface %s is not Static, not used", IP2String(tempbuff, cfig.allServers[m]));
  2406. logMess(logBuff, 2);
  2407. break;
  2408. }
  2409. }
  2410. }
  2411. }
  2412. if (getSection("ZONE-REPLICATION", iniStr, 1, iniFile))
  2413. {
  2414. char *iniStrPtr = myGetToken(iniStr, 0);
  2415. for (int i = 2; i < MAX_SERVERS && iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2416. {
  2417. if (!cfig.authorized)
  2418. {
  2419. sprintf(logBuff, "Section [REPLICATION-SERVERS], Server is not authorized, entry %s ignored", iniStrPtr);
  2420. logDNSMess(logBuff, 1);
  2421. continue;
  2422. }
  2423. mySplit(name, value, iniStrPtr, '=');
  2424. if (name[0] && value[0])
  2425. {
  2426. if (chkQu(name) && !isIP(name) && isIP(value))
  2427. {
  2428. if (!strcasecmp(name, "Primary"))
  2429. cfig.zoneServers[0] = my_inet_addr(value);
  2430. else if (!strcasecmp(name, "Secondary"))
  2431. cfig.zoneServers[1] = my_inet_addr(value);
  2432. else if (!strcasecmp(name, "AXFRClient"))
  2433. {
  2434. cfig.zoneServers[i] = my_inet_addr(value);
  2435. i++;
  2436. }
  2437. else
  2438. {
  2439. sprintf(logBuff, "Section [REPLICATION-SERVERS] Invalid Entry: %s ignored", iniStrPtr);
  2440. logDNSMess(logBuff, 1);
  2441. }
  2442. }
  2443. else
  2444. {
  2445. sprintf(logBuff, "Section [REPLICATION-SERVERS] Invalid Entry: %s ignored", iniStrPtr);
  2446. logDNSMess(logBuff, 1);
  2447. }
  2448. }
  2449. else
  2450. {
  2451. sprintf(logBuff, "Section [REPLICATION-SERVERS], Missing value, entry %s ignored", iniStrPtr);
  2452. logDNSMess(logBuff, 1);
  2453. }
  2454. }
  2455. }
  2456. if (!cfig.zoneServers[0] && cfig.zoneServers[1])
  2457. {
  2458. sprintf(logBuff, "Section [REPLICATION-SERVERS] Missing Primary Server");
  2459. logMess(logBuff, 1);
  2460. }
  2461. else if (cfig.zoneServers[0] && !cfig.zoneServers[1])
  2462. {
  2463. sprintf(logBuff, "Section [REPLICATION-SERVERS] Missing Secondary Server");
  2464. logMess(logBuff, 1);
  2465. }
  2466. else if (cfig.zoneServers[0] && cfig.zoneServers[1])
  2467. {
  2468. if (findServer(cfig.staticServers, cfig.zoneServers[0]) && findServer(cfig.staticServers, cfig.zoneServers[1]))
  2469. {
  2470. sprintf(logBuff, "Section [REPLICATION-SERVERS] Primary & Secondary should be Different Boxes");
  2471. logMess(logBuff, 1);
  2472. }
  2473. else if (findServer(cfig.staticServers, cfig.zoneServers[0]))
  2474. cfig.replication = 1;
  2475. else if (findServer(cfig.staticServers, cfig.zoneServers[1]))
  2476. cfig.replication = 2;
  2477. else
  2478. {
  2479. sprintf(logBuff, "Section [REPLICATION-SERVERS] No Server IP not found on this Machine");
  2480. logMess(logBuff, 1);
  2481. }
  2482. }
  2483.     if (dhcpService)
  2484.     {
  2485.         int i = 0;
  2486.         for (int j = 0; j < MAX_SERVERS && cfig.listenServers[j]; j++)
  2487.         {
  2488.             cfig.dhcpConn[i].sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  2489.             if (cfig.dhcpConn[i].sock == INVALID_SOCKET)
  2490.             {
  2491.                 sprintf(logBuff, "Failed to Create Socket");
  2492.                 logDHCPMess(logBuff, 1);
  2493.                 continue;
  2494.             }
  2495.             cfig.dhcpConn[i].addr.sin_family = AF_INET;
  2496.             cfig.dhcpConn[i].addr.sin_addr.s_addr = cfig.listenServers[j];
  2497.             cfig.dhcpConn[i].addr.sin_port = htons(IPPORT_DHCPS);
  2498.             cfig.dhcpConn[i].reUseVal = true;
  2499.             cfig.dhcpConn[i].reUseSize = sizeof(cfig.dhcpConn[i].reUseVal);
  2500.             setsockopt(cfig.dhcpConn[i].sock, SOL_SOCKET, SO_REUSEADDR, (char*)&cfig.dhcpConn[i].reUseVal, cfig.dhcpConn[i].reUseSize);
  2501.             cfig.dhcpConn[i].broadCastVal = true;
  2502.             cfig.dhcpConn[i].broadCastSize = sizeof(cfig.dhcpConn[i].broadCastVal);
  2503.             setsockopt(cfig.dhcpConn[i].sock, SOL_SOCKET, SO_BROADCAST, (char*)&cfig.dhcpConn[i].broadCastVal, cfig.dhcpConn[i].broadCastSize);
  2504.             int nRet = bind(cfig.dhcpConn[i].sock, (sockaddr*)&cfig.dhcpConn[i].addr, sizeof(struct sockaddr_in));
  2505.             if (nRet == SOCKET_ERROR)
  2506.             {
  2507.                 close(cfig.dhcpConn[i].sock);
  2508.                 sprintf(logBuff, "%s Port 67 already in use", IP2String(tempbuff, cfig.listenServers[j]));
  2509.                 logDHCPMess(logBuff, 1);
  2510.                 continue;
  2511.             }
  2512.             if (cfig.maxFD < cfig.dhcpConn[i].sock)
  2513.                 cfig.maxFD = cfig.dhcpConn[i].sock;
  2514.             cfig.dhcpConn[i].server = cfig.listenServers[j];
  2515.             cfig.dhcpConn[i].mask = cfig.listenMasks[j];
  2516.             i++;
  2517.         }
  2518.         cfig.dhcpListener.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  2519.         if (cfig.dhcpListener.sock == INVALID_SOCKET)
  2520.         {
  2521.             sprintf(logBuff, "Failed to Creat DHCP Socket");
  2522.             logDHCPMess(logBuff, 1);
  2523.         }
  2524.         else
  2525.         {
  2526.             cfig.dhcpListener.reUseVal = true;
  2527.             cfig.dhcpListener.reUseSize = sizeof(cfig.dhcpListener.reUseVal);
  2528.             setsockopt(cfig.dhcpListener.sock, SOL_SOCKET, SO_REUSEADDR, (char*)&cfig.dhcpListener.reUseVal, cfig.dhcpListener.reUseSize);
  2529.             cfig.dhcpListener.pktinfoVal = true;
  2530.             cfig.dhcpListener.pktinfoSize = sizeof(cfig.dhcpListener.pktinfoVal);
  2531.             setsockopt(cfig.dhcpListener.sock, SOL_IP, IP_PKTINFO, &cfig.dhcpListener.pktinfoVal, cfig.dhcpListener.pktinfoSize);
  2532.             cfig.dhcpListener.addr.sin_family = AF_INET;
  2533.             cfig.dhcpListener.addr.sin_addr.s_addr = INADDR_ANY;
  2534.             cfig.dhcpListener.addr.sin_port = htons(IPPORT_DHCPS);
  2535.             int nRet = bind(cfig.dhcpListener.sock,
  2536.                             (sockaddr*)&cfig.dhcpListener.addr,
  2537.                             sizeof(struct sockaddr_in)
  2538.                            );
  2539.             if (nRet == SOCKET_ERROR)
  2540.             {
  2541.                 close(cfig.dhcpListener.sock);
  2542.                 sprintf(logBuff, "DHCP Port 67 already in use");
  2543.                 logDHCPMess(logBuff, 1);
  2544.             }
  2545.             if (cfig.maxFD < cfig.dhcpListener.sock)
  2546.                 cfig.maxFD = cfig.dhcpListener.sock;
  2547.         }
  2548.         if (cfig.replication)
  2549.         {
  2550.             //printf("Heren");
  2551.             cfig.dhcpReplConn.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  2552.             if (cfig.dhcpReplConn.sock == INVALID_SOCKET)
  2553.             {
  2554.                 sprintf(logBuff, "Failed to Create DHCP Replication Socket");
  2555.                 logDHCPMess(logBuff, 1);
  2556.             }
  2557.             else
  2558.             {
  2559.                 //printf("Socket %un", cfig.dhcpReplConn.sock);
  2560.                 cfig.dhcpReplConn.addr.sin_family = AF_INET;
  2561. if (cfig.replication == 1)
  2562. cfig.dhcpReplConn.addr.sin_addr.s_addr = cfig.zoneServers[0];
  2563. else
  2564. cfig.dhcpReplConn.addr.sin_addr.s_addr = cfig.zoneServers[1];
  2565. cfig.dhcpReplConn.addr.sin_port = 0;
  2566.                 int nRet = bind(cfig.dhcpReplConn.sock, (sockaddr*)&cfig.dhcpReplConn.addr, sizeof(struct sockaddr_in));
  2567.                 if (nRet == INVALID_SOCKET)
  2568.                 {
  2569.                     sprintf(logBuff, "DHCP Replication Server, Bind Failed");
  2570.                     logDHCPMess(logBuff, 1);
  2571.                 }
  2572.                 else if (cfig.maxFD < cfig.dhcpReplConn.sock)
  2573.                     cfig.maxFD = cfig.dhcpReplConn.sock;
  2574.                 /*
  2575. else
  2576. cfig.dhcpReplConn.server = cfig.dhcpReplConn.addr.sin_addr.s_addr;
  2577.                 */
  2578.             }
  2579.         }
  2580. if (getSection("DHCP-OPTIONS", iniStr, 1, iniFile))
  2581. {
  2582. data20 optionData;
  2583. loadOptions(iniStr, "DHCP-OPTIONS", &optionData);
  2584. cfig.options = optionData.options;
  2585. cfig.mask = optionData.mask;
  2586. }
  2587. for (BYTE i = 1; i <= 32 ; i++)
  2588. {
  2589. if (getSection("DHCP-RANGE", iniStr, i, iniFile))
  2590. {
  2591. BYTE m = 0;
  2592. for (; m < 32 && cfig.dhcpRanges[m].rangeStart; m++);
  2593. data20 optionData;
  2594. optionData.rangeSetInd = i - 1;
  2595. loadOptions(iniStr, "DHCP-RANGE", &optionData);
  2596. cfig.rangeSet[optionData.rangeSetInd].active = true;
  2597. for (; m < 32 && cfig.dhcpRanges[m].rangeStart; m++)
  2598. {
  2599. //printf("Range Start=%s rangeSetInd=%in", IP2String(tempbuff, htonl(cfig.dhcpRanges[m].rangeStart)), optionData.rangeSetInd);
  2600. cfig.dhcpRanges[m].rangeSetInd = optionData.rangeSetInd;
  2601. cfig.dhcpRanges[m].options = optionData.options;
  2602. cfig.dhcpRanges[m].mask = optionData.mask;
  2603. }
  2604. }
  2605. else
  2606. break;
  2607. }
  2608. //printf("%sn", IP2String(tempbuff, cfig.mask));
  2609. if (!cfig.mask)
  2610. {
  2611. cfig.mask = inet_addr("255.255.255.0");
  2612. /*
  2613. for (BYTE m = 0; m < 32 && cfig.dhcpRanges[m].rangeStart; m++)
  2614. {
  2615. DWORD mask = cfig.dhcpRanges[m].mask;
  2616. if (!mask)
  2617. mask = calcMask(cfig.dhcpRanges[m].rangeStart, cfig.dhcpRanges[m].rangeEnd);
  2618. if (htonl(mask) < htonl(cfig.mask))
  2619. cfig.mask = mask;
  2620. }
  2621. */
  2622. }
  2623. for (char rangeInd = 0; rangeInd < 32 && cfig.dhcpRanges[rangeInd].rangeStart; rangeInd++)
  2624. {
  2625. if (!cfig.dhcpRanges[rangeInd].mask)
  2626. cfig.dhcpRanges[rangeInd].mask = cfig.mask;
  2627. for (DWORD iip = cfig.dhcpRanges[rangeInd].rangeStart; iip <= cfig.dhcpRanges[rangeInd].rangeEnd; iip++)
  2628. {
  2629. DWORD ip = htonl(iip);
  2630. if ((cfig.dhcpRanges[rangeInd].mask | (~ip)) == ULONG_MAX || (cfig.dhcpRanges[rangeInd].mask | ip) == ULONG_MAX)
  2631. cfig.dhcpRanges[rangeInd].expiry[iip - cfig.dhcpRanges[rangeInd].rangeStart] = LONG_MAX;
  2632. }
  2633. }
  2634. for (BYTE m = 0; m < MAX_SERVERS && cfig.allServers[m]; m++)
  2635. setLeaseExpiry(cfig.allServers[m], LONG_MAX);
  2636. for (BYTE m = 0; m < MAX_SERVERS && cfig.dns[m]; m++)
  2637. setLeaseExpiry(cfig.dns[m], LONG_MAX);
  2638. if (getSection("DHCP-OPTIONS", iniStr, 1, iniFile))
  2639. lockOptions(iniStr);
  2640. for (BYTE i = 1; i <= 32 ;i++)
  2641. {
  2642. if (getSection("DHCP-RANGE", iniStr, i, iniFile))
  2643. lockOptions(iniStr);
  2644. }
  2645. FILE *f = fopen(iniFile, "rt");
  2646. if (f)
  2647. {
  2648. char sectionName[512];
  2649. while (fgets(sectionName, 511, f))
  2650. {
  2651. if (*sectionName == '[')
  2652. {
  2653. char *secend = strchr(sectionName, ']');
  2654. if (secend)
  2655. {
  2656. *secend = 0;
  2657. sectionName[0] = 32;
  2658. myTrim(sectionName, sectionName);
  2659. }
  2660. else
  2661. continue;
  2662. }
  2663. else
  2664. continue;
  2665. BYTE hexValue[255];
  2666. BYTE hexValueSize = sizeof(hexValue);
  2667. data20 optionData;
  2668. if (!getHexValue(hexValue, sectionName, &hexValueSize))
  2669. {
  2670. data7 *dhcpEntry = dhcpCache[toUUE(tempbuff, hexValue, hexValueSize)];
  2671. if (!dhcpEntry)
  2672. {
  2673. getSection(sectionName, iniStr, 1, iniFile);
  2674. loadOptions(iniStr, sectionName, &optionData);
  2675. lockOptions(iniStr);
  2676. if (optionData.ip)
  2677. {
  2678. dhcpMap::iterator p = dhcpCache.begin();
  2679. for (; p != dhcpCache.end(); p++)
  2680. {
  2681. if (p->second && p->second->ip == optionData.ip)
  2682. break;
  2683. }
  2684. if (p == dhcpCache.end())
  2685. {
  2686. dhcpEntry = (data7*)calloc(1, sizeof(data7));
  2687. if (!dhcpEntry)
  2688. {
  2689. sprintf(logBuff, "Client Options Load, Memory Allocation Error");
  2690. logDHCPMess(logBuff, 1);
  2691. return;
  2692. }
  2693. dhcpEntry->mapname = cloneString(toUUE(tempbuff, hexValue, hexValueSize));
  2694. if (!dhcpEntry->mapname)
  2695. {
  2696. sprintf(logBuff, "Client Data Load, Memory Allocation Error");
  2697. logDHCPMess(logBuff, 1);
  2698. return;
  2699. }
  2700. DWORD tmask = htonl(optionData.mask);
  2701. while (tmask)
  2702. {
  2703. (dhcpEntry->bitmask)++;
  2704. tmask = tmask << 1;
  2705. }
  2706. dhcpEntry->ip = optionData.ip;
  2707. dhcpEntry->options = optionData.options;
  2708. dhcpEntry->rangeInd = getRangeInd(optionData.ip);
  2709. dhcpEntry->fixed = 1;
  2710. setLeaseExpiry(optionData.ip, LONG_MAX);
  2711. dhcpCache[dhcpEntry->mapname] = dhcpEntry;
  2712. //printf("%s=%s=%sn", sectionName, dhcpEntry->mapname, IP2String(tempbuff, optionData.ip));
  2713. }
  2714. else
  2715. {
  2716. sprintf(logBuff, "Static DHCP Host [%s] Duplicate IP Address %s, Entry ignored", sectionName, IP2String(tempbuff, optionData.ip));
  2717. logDHCPMess(logBuff, 1);
  2718. }
  2719. }
  2720. else
  2721. {
  2722. sprintf(logBuff, "IP Address is missing in Static DHCP Host [%s], Entry ignored", sectionName);
  2723. logDHCPMess(logBuff, 1);
  2724. }
  2725. }
  2726. else
  2727. {
  2728. sprintf(logBuff, "Duplicate Static DHCP Host [%s] ignored", sectionName);
  2729. logDHCPMess(logBuff, 1);
  2730. }
  2731. }
  2732. else if (strchr(sectionName, ':'))
  2733. {
  2734. sprintf(logBuff, "Invalid Static DHCP Host MAC Addr [%s] ignored", sectionName);
  2735. logDHCPMess(logBuff, 1);
  2736. }
  2737. }
  2738. fclose(f);
  2739. }
  2740. }
  2741. if (dnsService)
  2742. {
  2743. addToCache(0, "localhost", my_inet_addr("127.0.0.1"), LONG_MAX, LOCALHOST_A, LOCALHOST_PTR, LONG_MAX);
  2744. addToCache(1, "localhost", my_inet_addr("127.0.0.1"), LONG_MAX, LOCALHOST_A, LOCALHOST_PTR, LONG_MAX);
  2745. for (int i = 0; cfig.replication != 2 && i < MAX_SERVERS && cfig.allServers[i]; i++)
  2746. if (cfig.authorized && makeLocal(cfig.allServers[i]))
  2747. {
  2748. addToCache(0, cfig.servername, cfig.allServers[i], LONG_MAX, SERVER_A, SERVER_PTR_AUTH, LONG_MAX);
  2749. addToCache(1, cfig.servername, cfig.allServers[i], LONG_MAX, SERVER_A, SERVER_PTR_AUTH, LONG_MAX);
  2750. }
  2751. else
  2752. {
  2753. addToCache(0, cfig.servername, cfig.allServers[i], LONG_MAX, SERVER_A, SERVER_PTR_NAUTH, LONG_MAX);
  2754. addToCache(1, cfig.servername, cfig.allServers[i], LONG_MAX, SERVER_A, SERVER_PTR_NAUTH, LONG_MAX);
  2755. }
  2756. if (getSection("DNS-ALLOWED-HOSTS", iniStr, 1, iniFile))
  2757. {
  2758. char *iniStrPtr = myGetToken(iniStr, 0);
  2759. for (int i = 0; i < 32 && iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2760. {
  2761. DWORD rs = 0;
  2762. DWORD re = 0;
  2763. mySplit(name, value, iniStrPtr, '-');
  2764. if (value[0])
  2765. {
  2766. rs = htonl(my_inet_addr(name));
  2767. re = htonl(my_inet_addr(value));
  2768. }
  2769. else
  2770. {
  2771. rs = htonl(my_inet_addr(name));
  2772. re = rs;
  2773. }
  2774. if (rs && rs != INADDR_NONE && re && re != INADDR_NONE && rs <= re)
  2775. {
  2776. cfig.dnsRanges[i].rangeStart = rs;
  2777. cfig.dnsRanges[i].rangeEnd = re;
  2778. i++;
  2779. }
  2780. else
  2781. {
  2782. sprintf(logBuff, "Section [DNS-ALLOWED-HOSTS] Invalid entry %s in ini file, ignored", iniStrPtr);
  2783. logDNSMess(logBuff, 1);
  2784. }
  2785. }
  2786. }
  2787. if (cfig.replication != 2 && getSection("HOSTS", iniStr, 1, iniFile))
  2788. {
  2789. char *iniStrPtr = myGetToken(iniStr, 0);
  2790. for (; iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2791. {
  2792. mySplit(name, value, iniStrPtr, '=');
  2793. if (name[0] && value[0])
  2794. {
  2795. if (chkQu(name) && !isIP(name) && isIP(value))
  2796. {
  2797. DWORD inetAddr = my_inet_addr(value);
  2798.  if (!inetAddr)
  2799. {
  2800. sprintf(logBuff, "Section [HOSTS] Invalid Entry: %s ignored", iniStrPtr);
  2801. logDNSMess(logBuff, 1);
  2802. }
  2803. else if (cfig.authorized && makeLocal(name) && makeLocal(inetAddr))
  2804. {
  2805. addToCache(cacheInd, name, inetAddr, LONG_MAX, STATIC_A_AUTH, STATIC_PTR_AUTH, cfig.serial1);
  2806. setLeaseExpiry(inetAddr, 0);
  2807. }
  2808. else if (cfig.authorized && makeLocal(name))
  2809. {
  2810. addToCache(cacheInd, name, inetAddr, LONG_MAX, STATIC_A_AUTH, STATIC_PTR_NAUTH, cfig.serial1);
  2811. setLeaseExpiry(inetAddr, 0);
  2812. }
  2813. else if (cfig.authorized && makeLocal(inetAddr))
  2814. {
  2815. addToCache(cacheInd, name, inetAddr, LONG_MAX, STATIC_A_NAUTH, STATIC_PTR_AUTH, cfig.serial1);
  2816. setLeaseExpiry(inetAddr, 0);
  2817. }
  2818. else
  2819. {
  2820. makeLocal(name);
  2821. addToCache(cacheInd, name, inetAddr, LONG_MAX, STATIC_A_NAUTH, STATIC_PTR_NAUTH, cfig.serial1);
  2822. setLeaseExpiry(inetAddr, 0);
  2823. }
  2824. }
  2825. else
  2826. {
  2827. sprintf(logBuff, "Section [HOSTS] Invalid Entry: %s ignored", iniStrPtr);
  2828. logDNSMess(logBuff, 1);
  2829. }
  2830. }
  2831. else
  2832. {
  2833. sprintf(logBuff, "Section [HOSTS], Missing IP, entry %s ignored", iniStrPtr);
  2834. logDNSMess(logBuff, 1);
  2835. }
  2836. }
  2837. }
  2838. if (cfig.replication != 2 && getSection("ALIASES", iniStr, 1, iniFile))
  2839. {
  2840. char *iniStrPtr = myGetToken(iniStr, 0);
  2841. for (int i = 0; iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2842. {
  2843. mySplit(name, value, iniStrPtr, '=');
  2844. if (name[0] && value[0])
  2845. {
  2846. if (chkQu(name) && chkQu(value))
  2847. {
  2848. if (makeLocal(name))
  2849. {
  2850. data7 *cache = findEntry(cacheInd, name);
  2851. if (!cache)
  2852. {
  2853. cache = (data7*)calloc(1, sizeof(data7));
  2854. if (cache)
  2855. {
  2856. if (!makeLocal(value))
  2857. cache->dataType = EXT_CNAME;
  2858. else
  2859. cache->dataType = LOCAL_CNAME;
  2860. cache->mapname = cloneString(name);
  2861. cache->hostname = cloneString(value);
  2862. if (!cache->mapname || !cache->hostname)
  2863. {
  2864. sprintf(logBuff, "Section [ALIASES] entry %s memory error", iniStrPtr);
  2865. logDNSMess(logBuff, 1);
  2866. }
  2867. else
  2868. {
  2869. cache->expiry = LONG_MAX;
  2870. cache->serial = cfig.serial1;
  2871. addEntry(cacheInd, cache);
  2872. i++;
  2873. }
  2874. }
  2875. else
  2876. {
  2877. sprintf(logBuff, "Section [ALIASES] entry %s memory error", iniStrPtr);
  2878. logDNSMess(logBuff, 1);
  2879. }
  2880. }
  2881. else
  2882. {
  2883. sprintf(logBuff, "Section [ALIASES] duplicate entry %s ignored", iniStrPtr);
  2884. logDNSMess(logBuff, 1);
  2885. }
  2886. }
  2887. else
  2888. {
  2889. sprintf(logBuff, "Section [ALIASES] alias %s should be bare/local name, entry ignored", name);
  2890. logDNSMess(logBuff, 1);
  2891. }
  2892. }
  2893. else
  2894. {
  2895. sprintf(logBuff, "Section [ALIASES] Invalid Entry: %s ignored", iniStrPtr);
  2896. logDNSMess(logBuff, 1);
  2897. }
  2898. }
  2899. else
  2900. {
  2901. sprintf(logBuff, "Section [ALIASES], Missing value, entry %s ignored", iniStrPtr);
  2902. logDNSMess(logBuff, 1);
  2903. }
  2904. }
  2905. }
  2906. if (cfig.replication != 2 && getSection("MAIL-SERVERS", iniStr, 1, iniFile))
  2907. {
  2908. char *iniStrPtr = myGetToken(iniStr, 0);
  2909. for (cfig.mxCount[cacheInd] = 0; cfig.mxCount[cacheInd] < MAX_SERVERS && iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2910. {
  2911. mySplit(name, value, iniStrPtr, '=');
  2912. if (name[0] && value[0])
  2913. {
  2914. if (chkQu(name) && atoi(value))
  2915. {
  2916. cfig.mxServers[0][cfig.mxCount[cacheInd]].pref = atoi(value);
  2917. cfig.mxServers[1][cfig.mxCount[cacheInd]].pref = atoi(value);
  2918. if (!strchr(name, '.'))
  2919. {
  2920. strcat(name, ".");
  2921. strcat(name, cfig.zone);
  2922. }
  2923. strcpy(cfig.mxServers[0][cfig.mxCount[cacheInd]].hostname, name);
  2924. strcpy(cfig.mxServers[1][cfig.mxCount[cacheInd]].hostname, name);
  2925. cfig.mxCount[cacheInd]++;
  2926. }
  2927. else
  2928. {
  2929. sprintf(logBuff, "Section [MAIL-SERVERS] Invalid Entry: %s ignored", iniStrPtr);
  2930. logDNSMess(logBuff, 1);
  2931. }
  2932. }
  2933. else
  2934. {
  2935. sprintf(logBuff, "Section [MAIL-SERVERS], Missing value, entry %s ignored", iniStrPtr);
  2936. logDNSMess(logBuff, 1);
  2937. }
  2938. }
  2939. cfig.mxCount[1] = cfig.mxCount[0];
  2940. }
  2941. if (getSection("CHILD-ZONES", iniStr, 1, iniFile))
  2942. {
  2943. char *iniStrPtr = myGetToken(iniStr, 0);
  2944. for (int i = 0; i < 32 && iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  2945. {
  2946. mySplit(name, value, iniStrPtr, '=');
  2947. if (name[0] && value[0])
  2948. {
  2949. /*
  2950. if (cfig.authorized)
  2951. {
  2952. char *dp = strstr(name, arpa);
  2953. if (dp)
  2954. {
  2955. dp = strchr(name, '.');
  2956. if (!dp || strcasecmp(dp + 1, cfig.authority))
  2957. {
  2958. sprintf(logBuff, "Section [CHILD-ZONES], Zone %s is not child of %s, Entry ignored", name, cfig.authority);
  2959. logDNSMess(logBuff, 1);
  2960. continue;
  2961. }
  2962. }
  2963. else
  2964. {
  2965. dp = strchr(name, '.');
  2966. if (!dp || strcasecmp(dp + 1, cfig.zone))
  2967. {
  2968. sprintf(logBuff, "Section [CHILD-ZONES], Zone %s is not child of %s, Entry ignored", name, cfig.zone);
  2969. logDNSMess(logBuff, 1);
  2970. continue;
  2971. }
  2972. }
  2973. }
  2974. */
  2975. int j = 0;
  2976. for (; j < 32 && cfig.dnsRoutes[j].zone[0]; j++)
  2977. {
  2978. if (!strcasecmp(cfig.dnsRoutes[j].zone, name))
  2979. {
  2980. sprintf(logBuff, "Section [CHILD-ZONES], Duplicate Entry for Child Zone %s ignored", name);
  2981. logDNSMess(logBuff, 1);
  2982. break;
  2983. }
  2984. }
  2985. if (j < 32 && !cfig.dnsRoutes[j].zone[0])
  2986. {
  2987. if (name[0] && chkQu(name) && value[0])
  2988. {
  2989. char *value1 = strchr(value, ',');
  2990. if (value1)
  2991. {
  2992. *value1 = 0;
  2993. value1++;
  2994.                                 DWORD ip = my_inet_addr(myTrim(value, value));
  2995.                                 DWORD ip1 = my_inet_addr(myTrim(value1, value1));
  2996. if (isIP(value) && ip && isIP(value1) && ip1)
  2997. {
  2998. strcpy(cfig.dnsRoutes[i].zone, name);
  2999. cfig.dnsRoutes[i].zLen = strlen(cfig.dnsRoutes[i].zone);
  3000. cfig.dnsRoutes[i].dns[0] = ip;
  3001. cfig.dnsRoutes[i].dns[1] = ip1;
  3002. i++;
  3003. }
  3004. else
  3005. {
  3006. sprintf(logBuff, "Section [CHILD-ZONES] Invalid Entry: %s ignored", iniStrPtr);
  3007. logDNSMess(logBuff, 1);
  3008. }
  3009. }
  3010. else
  3011. {
  3012. DWORD ip = my_inet_addr(value);
  3013. if (isIP(value) && ip)
  3014. {
  3015. strcpy(cfig.dnsRoutes[i].zone, name);
  3016. cfig.dnsRoutes[i].zLen = strlen(cfig.dnsRoutes[i].zone);
  3017. cfig.dnsRoutes[i].dns[0] = ip;
  3018. i++;
  3019. }
  3020. else
  3021. {
  3022. sprintf(logBuff, "Section [CHILD-ZONES] Invalid Entry: %s ignored", iniStrPtr);
  3023. logDNSMess(logBuff, 1);
  3024. }
  3025. }
  3026. }
  3027. else
  3028. {
  3029. sprintf(logBuff, "Section [CHILD-ZONES] Invalid Entry: %s ignored", iniStrPtr);
  3030. logDNSMess(logBuff, 1);
  3031. }
  3032. }
  3033. }
  3034. else
  3035. {
  3036. sprintf(logBuff, "Section [CHILD-ZONES], Missing value, entry %s ignored", iniStrPtr);
  3037. logDNSMess(logBuff, 1);
  3038. }
  3039. }
  3040. }
  3041. if (getSection("WILD-HOSTS", iniStr, 1, iniFile))
  3042. {
  3043. char *iniStrPtr = myGetToken(iniStr, 0);
  3044. for (int i = 0; i < 32 && iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  3045. {
  3046. mySplit(name, value, iniStrPtr, '=');
  3047. if (name[0] && value[0])
  3048. {
  3049. if (chkQu(name) && isIP(value))
  3050. {
  3051. DWORD ip = my_inet_addr(value);
  3052. strcpy(cfig.wildHosts[i].wildcard, name);
  3053. myLower(cfig.wildHosts[i].wildcard);
  3054. cfig.wildHosts[i].ip = ip;
  3055. i++;
  3056. }
  3057. else
  3058. {
  3059. sprintf(logBuff, "Section [WILD-HOSTS] Invalid Entry: %s ignored", iniStrPtr);
  3060. logDNSMess(logBuff, 1);
  3061. }
  3062. }
  3063. else
  3064. {
  3065. sprintf(logBuff, "Section [WILD-HOSTS], Missing value, entry %s ignored", iniStrPtr);
  3066. logDNSMess(logBuff, 1);
  3067. }
  3068. }
  3069. }
  3070. int i = 0;
  3071. for (int j = 0; j < MAX_SERVERS && cfig.listenServers[j]; j++)
  3072. {
  3073. cfig.dnsUdpConn[i].sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  3074. if (cfig.dnsUdpConn[i].sock == INVALID_SOCKET)
  3075. {
  3076. sprintf(logBuff, "Failed to Create Socket");
  3077. logDNSMess(logBuff, 1);
  3078. continue;
  3079. }
  3080. //printf("Socket %un", cfig.dnsUdpConn[i].sock);
  3081. cfig.dnsUdpConn[i].addr.sin_family = AF_INET;
  3082. cfig.dnsUdpConn[i].addr.sin_addr.s_addr = cfig.listenServers[j];
  3083. cfig.dnsUdpConn[i].addr.sin_port = htons(IPPORT_DNS);
  3084. int nRet = bind(cfig.dnsUdpConn[i].sock,
  3085.                 (sockaddr*)&cfig.dnsUdpConn[i].addr,
  3086.                 sizeof(struct sockaddr_in)
  3087.                );
  3088. if (nRet == SOCKET_ERROR)
  3089. {
  3090. closesocket(cfig.dnsUdpConn[i].sock);
  3091. sprintf(logBuff, "%s UDP Port 53 already in use", IP2String(tempbuff, cfig.listenServers[j]));
  3092. logDNSMess(logBuff, 1);
  3093. continue;
  3094. }
  3095. if (cfig.maxFD < cfig.dnsUdpConn[i].sock)
  3096. cfig.maxFD = cfig.dnsUdpConn[i].sock;
  3097. cfig.dnsUdpConn[i].server = cfig.listenServers[j];
  3098. if (!cfig.nsIP)
  3099. cfig.nsIP = cfig.listenServers[j];
  3100. i++;
  3101. }
  3102. cfig.forwConn.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  3103. if (cfig.forwConn.sock == INVALID_SOCKET)
  3104. {
  3105. sprintf(logBuff, "Failed to Create Socket");
  3106. logDNSMess(logBuff, 1);
  3107. }
  3108. else
  3109. {
  3110. cfig.forwConn.addr.sin_family = AF_INET;
  3111. //bind(cfig.forwConn.sock, (sockaddr*)&cfig.forwConn.addr, sizeof(struct sockaddr_in));
  3112. if (cfig.maxFD < cfig.forwConn.sock)
  3113. cfig.maxFD = cfig.forwConn.sock;
  3114. }
  3115. i = 0;
  3116. for (int j = 0; j < MAX_SERVERS && cfig.listenServers[j]; j++)
  3117. {
  3118. cfig.dnsTcpConn[i].sock = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP);
  3119. if (cfig.dnsTcpConn[i].sock == INVALID_SOCKET)
  3120. {
  3121. sprintf(logBuff, "Failed to Create Socket");
  3122. logDNSMess(logBuff, 1);
  3123. }
  3124. else
  3125. {
  3126. //printf("Socket %un", cfig.dnsTcpConn[i].sock);
  3127. cfig.dnsTcpConn[i].addr.sin_family = AF_INET;
  3128. cfig.dnsTcpConn[i].addr.sin_addr.s_addr = cfig.listenServers[j];
  3129. cfig.dnsTcpConn[i].addr.sin_port = htons(IPPORT_DNS);
  3130. int nRet = bind(cfig.dnsTcpConn[i].sock,
  3131.                 (sockaddr*)&cfig.dnsTcpConn[i].addr,
  3132.                 sizeof(struct sockaddr_in));
  3133. if (nRet == SOCKET_ERROR)
  3134. {
  3135. closesocket(cfig.dnsTcpConn[i].sock);
  3136. sprintf(logBuff, "%s TCP Port 53 already in use", IP2String(tempbuff, cfig.listenServers[j]));
  3137. logDNSMess(logBuff, 1);
  3138. }
  3139. else
  3140. {
  3141. nRet = listen(cfig.dnsTcpConn[i].sock, SOMAXCONN);
  3142. if (nRet == SOCKET_ERROR)
  3143. {
  3144. closesocket(cfig.dnsTcpConn[i].sock);
  3145. sprintf(logBuff, "TCP Port 53 Error on Listen");
  3146. logDNSMess(logBuff, 1);
  3147. }
  3148. else
  3149. {
  3150. cfig.dnsTcpConn[i].server = cfig.listenServers[j];
  3151. if (cfig.maxFD < cfig.dnsTcpConn[i].sock)
  3152. cfig.maxFD = cfig.dnsTcpConn[i].sock;
  3153. i++;
  3154. }
  3155. }
  3156. }
  3157. }
  3158. }
  3159. if (dhcpService)
  3160. {
  3161. FILE *f = fopen(leaFile, "rb");
  3162. if (f)
  3163. {
  3164. data8 dhcpData;
  3165. while (fread(&dhcpData, sizeof(data8), 1, f))
  3166. {
  3167. char rangeInd = -1;
  3168. int ind = -1;
  3169. if (!findServer(cfig.staticServers, dhcpData.ip) && !findServer(cfig.dns, dhcpData.ip))
  3170. {
  3171. data7 *dhcpEntry = dhcpCache[toUUE(tempbuff, dhcpData.bp_chaddr, dhcpData.bp_hlen)];
  3172. if (dhcpEntry)
  3173. {
  3174. if (dhcpEntry->ip != dhcpData.ip)
  3175. continue;
  3176. }
  3177. else
  3178. {
  3179. dhcpMap::iterator p = dhcpCache.begin();
  3180. for (; p != dhcpCache.end(); p++)
  3181. {
  3182. if (p->second && p->second->ip == dhcpData.ip)
  3183. break;
  3184. }
  3185. if (p != dhcpCache.end())
  3186. {
  3187. if (p->second && (p->second->fixed || p->second->expiry > dhcpData.expiry))
  3188. continue;
  3189. else
  3190. dhcpCache.erase(p);
  3191. }
  3192. }
  3193. rangeInd = getRangeInd(dhcpData.ip);
  3194. if(rangeInd >= 0)
  3195. {
  3196. ind = getIndex(rangeInd, dhcpData.ip);
  3197. if (ind >= 0 && !dhcpEntry)
  3198. {
  3199. dhcpEntry = (data7*)calloc(1, sizeof(data7));
  3200. if (!dhcpEntry)
  3201. {
  3202. sprintf(logBuff, "Loading Existing Leases, Memory Allocation Error");
  3203. logDHCPMess(logBuff, 1);
  3204. return;
  3205. }
  3206. dhcpEntry->mapname = cloneString(toUUE(tempbuff, dhcpData.bp_chaddr, dhcpData.bp_hlen));
  3207. if (!dhcpEntry->mapname)
  3208. {
  3209. sprintf(logBuff, "Loading Existing Leases, Memory Allocation Error");
  3210. free(dhcpEntry);
  3211. logDHCPMess(logBuff, 1);
  3212. return ;
  3213. }
  3214. //dhcpEntry->dataType = DHCP;
  3215. dhcpCache[dhcpEntry->mapname] = dhcpEntry;
  3216. }
  3217. }
  3218. if (dhcpEntry)
  3219. {
  3220. dhcpEntry->ip = dhcpData.ip;
  3221. dhcpEntry->rangeInd = rangeInd;
  3222. if (!dhcpEntry->fixed)
  3223. dhcpEntry->source = dhcpData.source;
  3224. if (dhcpData.expiry > t)
  3225. {
  3226. setLeaseExpiry(dhcpEntry, dhcpData.expiry - t, dhcpData.active);
  3227. addToCache(cacheInd, dhcpData.hostname, dhcpEntry->ip, dhcpData.expiry, LOCAL_A, NONE, cfig.serial1);
  3228. if (makeLocal(dhcpEntry->ip))
  3229. addToCache(cacheInd, dhcpData.hostname, dhcpEntry->ip, dhcpData.expiry, NONE, LOCAL_PTR_AUTH, cfig.serial2);
  3230. else
  3231. addToCache(cacheInd, dhcpData.hostname, dhcpEntry->ip, dhcpData.expiry, NONE, LOCAL_PTR_NAUTH, cfig.serial2);
  3232. }
  3233. else
  3234. setLeaseExpiry(dhcpEntry, 0, false);
  3235. }
  3236. }
  3237. }
  3238. fclose(f);
  3239. f = fopen(leaFile, "wb");
  3240. cfig.dhcpIndex = 0;
  3241. if (f)
  3242. {
  3243. dhcpMap::iterator p = dhcpCache.begin();
  3244. for (; p != dhcpCache.end(); p++)
  3245. {
  3246. if (p->second && p->second->expiry)
  3247. {
  3248. memset(&dhcpData, 0, sizeof(data8));
  3249. dhcpData.bp_hlen = fromUUE(dhcpData.bp_chaddr, p->second->mapname);
  3250. dhcpData.ip = p->second->ip;
  3251. dhcpData.expiry = p->second->expiry;
  3252. dhcpData.active = p->second->active;
  3253. if (!p->second->fixed)
  3254. dhcpData.source = p->second->source;
  3255. data7 *cache = findEntry(cacheInd, IP2String(tempbuff, htonl(p->second->ip)));
  3256. if (cache && cache->hostname)
  3257. strcpy(dhcpData.hostname, cache->hostname);
  3258. cfig.dhcpIndex++;
  3259. dhcpData.dhcpInd = cfig.dhcpIndex;
  3260. p->second->dhcpInd = cfig.dhcpIndex;
  3261. fwrite(&dhcpData, sizeof(data8), 1, f);
  3262. }
  3263. }
  3264. fclose(f);
  3265. }
  3266. }
  3267. }
  3268. if ((dhcpService && !cfig.dhcpConn[0].server) || (dnsService && !cfig.dnsUdpConn[0].server && !cfig.dnsTcpConn[0].server))
  3269. {
  3270. sprintf(logBuff, "Error: Static Interfaces/Listening Ports not available, Stopped..");
  3271. logMess(logBuff, 1);
  3272. kRunning = false;
  3273. exit(EXIT_FAILURE);
  3274. }
  3275. if (dhcpService)
  3276. {
  3277. cfig.httpConn.port = 6789;
  3278. cfig.httpConn.server = cfig.dhcpConn[0].server;
  3279. if (getSection("HTTP-INTERFACE", iniStr, 1, iniFile))
  3280. {
  3281. char *iniStrPtr = myGetToken(iniStr, 0);
  3282. if(iniStrPtr[0])
  3283. {
  3284. mySplit(name, value, iniStrPtr, ':');
  3285. if (name[0] && isIP(name) && my_inet_addr(name))
  3286. cfig.httpConn.server = my_inet_addr(name);
  3287. else
  3288. {
  3289. sprintf(logBuff, "Warning: Section [HTTP-INTERFACE], Invalid IP Address %s, ignored", name);
  3290. logDHCPMess(logBuff, 1);
  3291. }
  3292. if (value[0])
  3293. {
  3294. if (atoi(value))
  3295. cfig.httpConn.port = atoi(value);
  3296. else
  3297. {
  3298. sprintf(logBuff, "Warning: Section [HTTP-INTERFACE], Invalid port %s, ignored", value);
  3299. logDHCPMess(logBuff, 1);
  3300. }
  3301. }
  3302. }
  3303. }
  3304. cfig.httpConn.sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  3305. if (cfig.httpConn.sock == INVALID_SOCKET)
  3306. {
  3307. cfig.httpConn.server = 0;
  3308. sprintf(logBuff, "Failed to Create Socket");
  3309. logDHCPMess(logBuff, 1);
  3310. }
  3311. else
  3312. {
  3313. //printf("Socket %un", cfig.httpConn.sock);
  3314. cfig.httpConn.addr.sin_family = AF_INET;
  3315. cfig.httpConn.addr.sin_addr.s_addr = cfig.httpConn.server;
  3316. cfig.httpConn.addr.sin_port = htons(cfig.httpConn.port);
  3317. int nRet = bind(cfig.httpConn.sock,
  3318. (sockaddr*)&cfig.httpConn.addr,
  3319. sizeof(struct sockaddr_in));
  3320. if (nRet == SOCKET_ERROR)
  3321. {
  3322. sprintf(logBuff, "Http Interface %s TCP Port %u not available", IP2String(tempbuff, cfig.httpConn.server), cfig.httpConn.port);
  3323. logDHCPMess(logBuff, 1);
  3324. cfig.httpConn.server = 0;
  3325. closesocket(cfig.httpConn.sock);
  3326. }
  3327. else
  3328. {
  3329. nRet = listen(cfig.httpConn.sock, SOMAXCONN);
  3330. if (nRet == SOCKET_ERROR)
  3331. {
  3332. sprintf(logBuff, "%s TCP Port %u Error on Listen", IP2String(tempbuff, cfig.httpConn.server), cfig.httpConn.port);
  3333. logDHCPMess(logBuff, 1);
  3334. close(cfig.httpConn.sock);
  3335. cfig.httpConn.server = 0;
  3336. }
  3337. else if (cfig.httpConn.sock > cfig.maxFD)
  3338. cfig.maxFD = cfig.httpConn.sock;
  3339. }
  3340. }
  3341. }
  3342. cfig.maxFD++;
  3343. if (verbatim)
  3344. {
  3345. if (dhcpService)
  3346. printf("Starting DHCP...n");
  3347. if (dnsService)
  3348. {
  3349. printf("Starting DNS...n");
  3350. if (cfig.replication == 1 && dhcpService)
  3351. {
  3352. cfig.serial1 = t;
  3353. cfig.serial2 = t;
  3354. cfig.expireTime = LONG_MAX;
  3355. DWORD serial1 = getSerial(cfig.authority);
  3356. if (serial1)
  3357. {
  3358. getSecondary();
  3359. }
  3360. }
  3361. else if (cfig.replication == 2)
  3362. {
  3363. bool temp = false;
  3364. refresh(&temp);
  3365. }
  3366. else
  3367. {
  3368. cfig.serial1 = t;
  3369. cfig.serial2 = t;
  3370. cfig.expireTime = LONG_MAX;
  3371. }
  3372. if (!dhcpService && cfig.replication == 2)
  3373. {
  3374. pthread_t threadId;
  3375. pthread_attr_t attr;
  3376. pthread_attr_init(&attr);
  3377. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  3378. int errcode = pthread_create(&threadId, &attr, refresh, NULL);
  3379. pthread_attr_destroy(&attr);
  3380. if(errcode)
  3381. {
  3382. if (cfig.dnsLogLevel)
  3383. {
  3384. sprintf(logBuff, "Thread Creation Failed");
  3385. logDHCPMess(logBuff, 1);
  3386. }
  3387. exit(1);
  3388. }
  3389. //if(errcode)
  3390. //pthread_create(&threadId, 0, refresh, NULL);
  3391. }
  3392. }
  3393. printf("n");
  3394. }
  3395. else
  3396. {
  3397. if (dhcpService)
  3398. {
  3399. sprintf(logBuff, "Starting DHCP Service");
  3400. logDHCPMess(logBuff, 1);
  3401. }
  3402. if (dnsService)
  3403. {
  3404. sprintf(logBuff, "Starting DNS Service");
  3405. logDNSMess(logBuff, 1);
  3406. if (cfig.replication == 1 && dhcpService)
  3407. {
  3408. cfig.serial1 = t;
  3409. cfig.serial2 = t;
  3410. cfig.expireTime = LONG_MAX;
  3411. DWORD serial1 = getSerial(cfig.authority);
  3412. if (serial1)
  3413. {
  3414. getSecondary();
  3415. }
  3416. }
  3417. else if (cfig.replication == 2)
  3418. {
  3419. bool temp = false;
  3420. refresh(&temp);
  3421. }
  3422. else
  3423. {
  3424. cfig.serial1 = t;
  3425. cfig.serial2 = t;
  3426. cfig.expireTime = LONG_MAX;
  3427. }
  3428. if (!dhcpService && cfig.replication == 2)
  3429. {
  3430. pthread_t threadId;
  3431. pthread_attr_t attr;
  3432. pthread_attr_init(&attr);
  3433. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  3434. int errcode = pthread_create(&threadId, &attr, refresh, NULL);
  3435. pthread_attr_destroy(&attr);
  3436. if(errcode)
  3437. {
  3438. if (cfig.dnsLogLevel)
  3439. {
  3440. sprintf(logBuff, "Thread Creation Failed");
  3441. logDNSMess(logBuff, 1);
  3442. }
  3443. }
  3444. //pthread_create(&threadId, 0, refresh, NULL);
  3445. }
  3446. }
  3447. }
  3448. if (dnsService)
  3449. {
  3450. for (int i = 0; i < 32 && cfig.dnsRoutes[i].dns[0]; i++)
  3451. {
  3452. char temp[256];
  3453. if (!cfig.dnsRoutes[i].dns[1])
  3454. sprintf(logBuff, "Child DNS Server: %s for Zone %s", IP2String(tempbuff, cfig.dnsRoutes[i].dns[0]), cfig.dnsRoutes[i].zone);
  3455. else
  3456. sprintf(logBuff, "Child DNS Servers: %s, %s for Zone %s", IP2String(temp, cfig.dnsRoutes[i].dns[0]), IP2String(tempbuff, cfig.dnsRoutes[i].dns[1]), cfig.dnsRoutes[i].zone);
  3457. logDNSMess(logBuff, 1);
  3458. }
  3459. for (int i = 0; i < MAX_SERVERS && cfig.dns[i]; i++)
  3460. {
  3461. sprintf(logBuff, "Forwarding DNS Server: %s", IP2String(tempbuff, cfig.dns[i]));
  3462. logDNSMess(logBuff, 1);
  3463. }
  3464. }
  3465. if (dhcpService)
  3466. {
  3467. for (int i = 0; i < 32 && cfig.dhcpRanges[i].rangeStart;i++)
  3468. {
  3469. char *logPtr = logBuff;
  3470. logPtr += sprintf(logPtr, "DHCP Range: ");
  3471. logPtr += sprintf(logPtr, "%s", IP2String(tempbuff, htonl(cfig.dhcpRanges[i].rangeStart)));
  3472. logPtr += sprintf(logPtr, "-%s", IP2String(tempbuff, htonl(cfig.dhcpRanges[i].rangeEnd)));
  3473. logPtr += sprintf(logPtr, "/%s", IP2String(tempbuff, cfig.dhcpRanges[i].mask));
  3474. logDHCPMess(logBuff, 1);
  3475. }
  3476. }
  3477. if (dnsService)
  3478. {
  3479. char temp[128];
  3480. for (int i = 0; i <= 32 && cfig.dnsRanges[i].rangeStart; i++)
  3481. {
  3482. char *logPtr = logBuff;
  3483. logPtr += sprintf(logPtr, "%s", "DNS Service Permitted Hosts: ");
  3484. logPtr += sprintf(logPtr, "%s-", IP2String(tempbuff, htonl(cfig.dnsRanges[i].rangeStart)));
  3485. logPtr += sprintf(logPtr, "%s", IP2String(tempbuff, htonl(cfig.dnsRanges[i].rangeEnd)));
  3486. logDNSMess(logBuff, 1);
  3487. }
  3488. if (cfig.lease >= LONG_MAX)
  3489. sprintf(logBuff, "Default Host Expiry: Infinity");
  3490. else
  3491. sprintf(logBuff, "Default Host Expiry: %u (sec)", cfig.lease);
  3492. logDNSMess(logBuff, 1);
  3493. }
  3494. if (dhcpService)
  3495. {
  3496. if (cfig.lease >= LONG_MAX)
  3497. sprintf(logBuff, "Max Lease: Infinity");
  3498. else
  3499. sprintf(logBuff, "Max Lease: %u (sec)", cfig.lease);
  3500. logDHCPMess(logBuff, 1);
  3501. }
  3502. if (dnsService && cfig.replication)
  3503. {
  3504. sprintf(logBuff, "Refresh: %u (sec)", cfig.refresh);
  3505. logMess(logBuff, 1);
  3506. sprintf(logBuff, "Retry: %u (sec)", cfig.retry);
  3507. logMess(logBuff, 1);
  3508. if (cfig.expire == ULONG_MAX)
  3509. sprintf(logBuff, "Expire: Infinity");
  3510. else
  3511. sprintf(logBuff, "Expire: %u (sec)", cfig.expire);
  3512. logMess(logBuff, 1);
  3513. sprintf(logBuff, "Min: %u (sec)", cfig.minimum);
  3514. logMess(logBuff, 1);
  3515. }
  3516. if (cfig.replication == 1)
  3517. sprintf(logBuff, "Server Name: %s (Primary)", cfig.servername);
  3518. else if (cfig.replication == 2)
  3519. sprintf(logBuff, "Server Name: %s (Secondary)", cfig.servername);
  3520. else
  3521. sprintf(logBuff, "Server Name: %s", cfig.servername);
  3522. logMess(logBuff, 1);
  3523. if (dnsService)
  3524. {
  3525. if (cfig.authorized)
  3526. sprintf(logBuff, "Authority for Zone: %s (%s)", cfig.zone, cfig.authority);
  3527. else
  3528. sprintf(logBuff, "Domain Name: %s", cfig.zone);
  3529. }
  3530. else
  3531. sprintf(logBuff, "Domain Name: %s", cfig.zone);
  3532. logDNSMess(logBuff, 1);
  3533. for (int i = 0; i < MAX_SERVERS && cfig.staticServers[i]; i++)
  3534. {
  3535. for (BYTE j = 0; j < MAX_SERVERS; j++)
  3536. {
  3537. if (cfig.dhcpConn[j].server == cfig.staticServers[i] || cfig.dnsUdpConn[j].server == cfig.staticServers[i])
  3538. {
  3539. sprintf(logBuff, "Listening On: %s", IP2String(tempbuff, cfig.staticServers[i]));
  3540. logMess(logBuff, 1);
  3541. break;
  3542. }
  3543. }
  3544. }
  3545. if (dhcpService && cfig.httpConn.server)
  3546. {
  3547. sprintf(logBuff, "Lease Status URL: http://%s:%u", IP2String(tempbuff, cfig.httpConn.server), cfig.httpConn.port);
  3548. logDHCPMess(logBuff, 1);
  3549. }
  3550. if (!verbatim)
  3551. {
  3552. if (cfig.dnsLogLevel > 1)
  3553. sprintf(logBuff, "DNS Logging: All");
  3554. else if (cfig.dnsLogLevel)
  3555. sprintf(logBuff, "DNS Logging: Errors");
  3556. else
  3557. sprintf(logBuff, "DNS Logging: None");
  3558. logMess(logBuff, 1);
  3559. if (cfig.dhcpLogLevel > 1)
  3560. sprintf(logBuff, "DHCP Logging: All");
  3561. else if (cfig.dhcpLogLevel)
  3562. sprintf(logBuff, "DHCP Logging: Errors");
  3563. else
  3564. sprintf(logBuff, "DHCP Logging: None");
  3565. logMess(logBuff, 1);
  3566. }
  3567. else
  3568. {
  3569. printf("nAccepting requests..n");
  3570. }
  3571. }
  3572. void getServ()
  3573. {
  3574.     for (int i = 0; i < MAX_SERVERS; i++)
  3575.     {
  3576.         cfig.allServers[i] = 0;
  3577.         cfig.listenServers[i] = 0;
  3578.         cfig.listenMasks[i] = 0;
  3579.     }
  3580.     struct ifconf Ifc;
  3581.     struct ifreq IfcBuf[2*MAX_SERVERS];
  3582.     struct ifreq *pIfr;
  3583.     int num_ifreq, fd, i;
  3584.     DWORD addr, mask;
  3585.     short flags;
  3586.     Ifc.ifc_len = sizeof(IfcBuf);
  3587.     Ifc.ifc_buf = (char *) IfcBuf;
  3588.     if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0)
  3589.     {
  3590.         if ( ioctl(fd, SIOCGIFCONF, &Ifc) >= 0)
  3591.         {
  3592.             num_ifreq = Ifc.ifc_len / sizeof(struct ifreq);
  3593.             for ( pIfr = Ifc.ifc_req, i = 0 ; i < num_ifreq; pIfr++, i++ )
  3594.             {
  3595.                 if (!ioctl(fd, SIOCGIFADDR, pIfr))
  3596.                     addr = ((struct sockaddr_in*)&pIfr->ifr_addr)->sin_addr.s_addr;
  3597.                 else
  3598.                     addr = 0;
  3599.                 if (!ioctl(fd, SIOCGIFNETMASK, pIfr))
  3600.                     mask = ((struct sockaddr_in*)&pIfr->ifr_addr)->sin_addr.s_addr;
  3601.                 else
  3602.                     mask = 0;
  3603.                 if (!ioctl(fd, SIOCGIFFLAGS, pIfr))
  3604.                     flags = pIfr->ifr_flags;
  3605.                 else
  3606.                     flags = 0;
  3607.                 if (addr && !(flags & IFF_LOOPBACK))
  3608.                     addServer(cfig.allServers, addr);
  3609.                 //if (addr && mask && !(flags & IFF_POINTOPOINT) && !(flags & IFF_DYNAMIC))
  3610.                 if (addr && mask && !(flags & IFF_POINTOPOINT) && !(flags & IFF_LOOPBACK) && !(flags & IFF_DYNAMIC))
  3611.                 {
  3612.                     for (BYTE m = 0; m < MAX_SERVERS; m++)
  3613.                     {
  3614.                         if (cfig.staticServers[m] == addr)
  3615.                             break;
  3616.                         else if (!cfig.staticServers[m])
  3617.                         {
  3618.                             cfig.staticServers[m] = addr;
  3619.                             cfig.staticMasks[m] = mask;
  3620.                             break;
  3621.                         }
  3622.                     }
  3623.                 }
  3624.             }
  3625.         }
  3626.         close(fd);
  3627.     }
  3628. /*
  3629.     FILE *f = popen("/sbin/route", "r");
  3630.     char buff[256];
  3631.     while (f && fgets(buff, sizeof(buff), f))
  3632.     {
  3633.         myTokenize(buff, buff, NULL, true);
  3634.         if (!strcasecmp(myGetToken(buff, 0), "default") || !strcasecmp(myGetToken(buff, 0), "0.0.0.0"))
  3635.         {
  3636.             char *value = myGetToken(buff, 1);
  3637.             int addr = my_inet_addr(value);
  3638.             if (!addr)
  3639.             {
  3640.                 char *dot = strchr(value, 46);
  3641.                 if (dot)
  3642.                     *dot = 0;
  3643.                 hostent *ent = gethostbyname(value);
  3644.                 if (ent)
  3645.                     addr = fIP(ent->h_addr_list[0]);
  3646.             }
  3647. //printf("router=%sn", IP2String(tempbuff, addr));
  3648.             addServer(cfig.routers, addr);
  3649.         }
  3650.     }
  3651.     if (f)
  3652.         pclose(f);
  3653. */
  3654. }
  3655. void getDServ()
  3656. {
  3657.     gethostname(cfig.servername, sizeof(cfig.servername));
  3658.     if (!cfig.zone[0])
  3659.     {
  3660.         getdomainname(cfig.zone, sizeof(cfig.zone));
  3661.         cfig.zLen = strlen(cfig.zone);
  3662.     }
  3663.     if (!strncmp(cfig.zone, "(none)", 6) || !cfig.zone[0])
  3664.     {
  3665.         strcpy(cfig.zone, "workgroup");
  3666.         cfig.zLen = strlen(cfig.zone);
  3667.     }
  3668.     char iniStr[9192];
  3669.     DWORD dservers[MAX_SERVERS];
  3670.     for (int i = 0; i < MAX_SERVERS; i++)
  3671.     {
  3672.         dservers[i] = 0;
  3673.         cfig.dns[i] = 0;
  3674.     }
  3675.     if (getSection("DNS-SERVERS", iniStr, 1, iniFile))
  3676.     {
  3677.         char *iniStrPtr = myGetToken(iniStr, 0);
  3678.         for (int i = 0; i < MAX_SERVERS && iniStrPtr[0]; iniStrPtr = myGetToken(iniStrPtr, 1))
  3679.         {
  3680.             DWORD addr = my_inet_addr(iniStrPtr);
  3681.             if (addr && addr != INADDR_NONE)
  3682.             {
  3683.                 if (addServer(dservers, addr))
  3684.                     i++;
  3685.             }
  3686.             else
  3687.             {
  3688.                 sprintf(logBuff, "Warning Section [DNS-SERVERS], Invalid DNS Server %s", iniStrPtr);
  3689.                 logMess(logBuff, 1);
  3690.             }
  3691.         }
  3692.     }
  3693.     if (!dservers[0])
  3694.     {
  3695.         FILE *f = fopen("/etc/resolv.conf", "rt");
  3696.         char buff[256];
  3697.         DWORD addr;
  3698.         while (f && fgets(buff, 255, f))
  3699.         {
  3700. myTokenize(buff, buff, NULL, true);
  3701.             if (!strcasecmp(myGetToken(buff, 0), "nameserver"))
  3702.             {
  3703.                 DWORD addr = my_inet_addr(myGetToken(buff, 1));
  3704.                 addServer(dservers, addr);
  3705.             }
  3706.         }
  3707.         if (f)
  3708.             fclose(f);
  3709.     }
  3710.     for (int i = 0; i < MAX_SERVERS && dservers[i]; i++)
  3711.     {
  3712.         if (dnsService)
  3713.         {
  3714.             if (findServer(cfig.staticServers, dservers[i]))
  3715.                 continue;
  3716.             addServer(cfig.dns, dservers[i]);
  3717.         }
  3718.         else
  3719.             addServer(cfig.dns, dservers[i]);
  3720.     }
  3721.     return;
  3722. }
  3723. void *updateStateFile(void *lparam)
  3724. {
  3725. data8 *dhcpData = (data8*)lparam;
  3726. pthread_mutex_lock( &mutStateFile );
  3727. if (dhcpData->dhcpInd)
  3728. {
  3729. FILE *f = fopen(leaFile, "rb+");
  3730. if (f)
  3731. {
  3732. if (fseek(f, (dhcpData->dhcpInd - 1)*sizeof(data8), SEEK_SET) >= 0)
  3733. {
  3734. fwrite(dhcpData, sizeof(data8), 1, f);
  3735. }
  3736. fclose(f);
  3737. }
  3738. }
  3739. else
  3740. {
  3741. dhcpData->dhcpInd = cfig.dhcpIndex;
  3742. FILE *f = fopen(leaFile, "ab");
  3743. if (f)
  3744. {
  3745. fwrite(dhcpData, sizeof(data8), 1, f);
  3746. fclose(f);
  3747. }
  3748. }
  3749. free(dhcpData);
  3750. pthread_mutex_unlock( &mutStateFile );
  3751. pthread_exit(NULL);
  3752. }
  3753. DWORD my_inet_addr(char* str)
  3754. {
  3755.     if (str == NULL)
  3756.         return INADDR_ANY;
  3757.     else
  3758.      return inet_addr(str);
  3759. }
  3760. WORD gdmess(data1 *req, BYTE sockInd)
  3761. {
  3762.     //printf("%un", sockInd);
  3763.     memset(req, 0, sizeof(data1));
  3764.     errno = 0;
  3765.     if (sockInd == 255)
  3766.     {
  3767.         int msgflags = 0;
  3768.         req->iov[0].iov_base = req->raw;
  3769.         req->iov[0].iov_len = sizeof(dhcp_packet);
  3770.         req->msg.msg_iov = req->iov;
  3771.         req->msg.msg_iovlen = 1;
  3772.         req->msg.msg_name = &req->addr;
  3773.         req->msg.msg_namelen = sizeof(sockaddr_in);
  3774.         req->msg.msg_control = &req->msgcontrol;
  3775.         req->msg.msg_controllen = sizeof(msg_control);
  3776.         req->msg.msg_flags = msgflags;
  3777.         int flags = 0;
  3778.         req->bytes = recvmsg(cfig.dhcpListener.sock, &req->msg, flags);
  3779.         if (errno || req->bytes <= 0)
  3780.         {
  3781.             return 0;
  3782.         }
  3783.         //printf("%un", req->msg.msg_controllen);
  3784.         //msgcontrol = (msg_control*)msg.msg_control;
  3785.         //struct in_addr local_addr;
  3786.         //struct in_addr rem_addr;
  3787.         //local_addr = msgcontrol->pktinfo.ipi_addr;
  3788.         //rem_addr = msgcontrol->pktinfo.ipi_spec_dst;
  3789.         //printf("IF = %un", req->msgcontrol.pktinfo.ipi_ifindex);
  3790.         //printf("LADDR = %sn", inet_ntoa(req->msgcontrol.pktinfo.ipi_addr));
  3791.         //printf("RADDR = %sn", inet_ntoa(req->msgcontrol.   pktinfo.ipi_spec_dst));
  3792.         DWORD addr = req->msgcontrol.pktinfo.ipi_spec_dst.s_addr;
  3793.         //printf("%sn",IP2String(tempbuff, addr));
  3794.         if (!addr)
  3795.             return 0;
  3796.         for (int i = 0; ; i++)
  3797.         {
  3798.             if ( i == MAX_SERVERS || (!cfig.dhcpConn[i].server))
  3799.                 return 0;
  3800.             else if (addr == cfig.dhcpConn[i].server)
  3801.             {
  3802.                 req->sockInd = i;
  3803.                 break;
  3804.             }
  3805.         }
  3806.     }
  3807.     else
  3808.     {
  3809.         req->sockInd = sockInd;
  3810.         req->sockLen = sizeof(req->addr);
  3811.         errno = 0;
  3812.         req->bytes = recvfrom(cfig.dhcpConn[sockInd].sock,
  3813.                               req->raw,
  3814.                               sizeof(dhcp_packet),
  3815.                               0,
  3816.                               (sockaddr*)&req->addr,
  3817.                               &req->sockLen);
  3818.         if (errno || req->bytes <= 0)
  3819.             return 0;
  3820.     }
  3821. if (req->dhcpp.header.bp_op != BOOTP_REQUEST)
  3822. return 0;
  3823.     data3 *op;
  3824.     BYTE *raw = req->dhcpp.vend_data;
  3825.     BYTE *rawEnd = raw + (req->bytes - sizeof(dhcp_header));
  3826.     for (; raw < rawEnd && *raw != DHCP_OPTION_END;)
  3827.     {
  3828.         op = (data3*)raw;
  3829.         //printf("OpCode=%u,MessSize=%un", op->opt_code, op->size);
  3830.         switch (op->opt_code)
  3831.         {
  3832.             case DHCP_OPTION_PAD:
  3833.                 raw++;
  3834.                 continue;
  3835.             case DHCP_OPTION_PARAMREQLIST:
  3836.                 for (int ix = 0; ix < op->size; ix++)
  3837.                     req->paramreqlist[op->value[ix]] = 1;
  3838.                 break;
  3839.             case DHCP_OPTION_MESSAGETYPE:
  3840.                 req->req_type = op->value[0];
  3841.                 break;
  3842.             case DHCP_OPTION_SERVERID:
  3843.                 req->server = fIP(op->value);
  3844.                 break;
  3845.             case DHCP_OPTION_IPADDRLEASE:
  3846.                 req->lease = fULong(op->value);
  3847.                 break;
  3848.             case DHCP_OPTION_MAXDHCPMSGSIZE:
  3849.                 req->messsize = fUShort(op->value);
  3850.                 break;
  3851.             case DHCP_OPTION_REQUESTEDIPADDR:
  3852.                 req->reqIP = fIP(op->value);
  3853.                 break;
  3854.             case DHCP_OPTION_HOSTNAME:
  3855.                 if (op->size && strcasecmp((char*)op->value, "(none)") && strcasecmp((char*)op->value, cfig.servername))
  3856.                 {
  3857.                     memcpy(req->hostname, op->value, op->size);
  3858.                     req->hostname[op->size] = 0;
  3859.                 }
  3860.                 break;
  3861. case DHCP_OPTION_VENDORCLASSID:
  3862. memcpy(req->vendClass, op->value, op->size);
  3863. req->vendClassSize = op->size;
  3864. break;
  3865. case DHCP_OPTION_USERCLASS:
  3866. memcpy(req->userClass, op->value, op->size);
  3867. req->userClassSize = op->size;
  3868. break;
  3869.             case DHCP_OPTION_RELAYAGENTINFO:
  3870.                 memcpy(&req->agentOption, op, op->size + 2);
  3871.                 break;
  3872.             case DHCP_OPTION_CLIENTID:
  3873.                 memcpy(&req->clientId, op, op->size + 2);
  3874.                 break;
  3875.             case DHCP_OPTION_SERIAL:
  3876.                 req->serial = fULong(op->value);
  3877.                 break;
  3878.         }
  3879.         raw += 2;
  3880.         raw += op->size;
  3881.     }
  3882. req->vp = req->dhcpp.vend_data;
  3883. memset(req->vp, 0, sizeof(dhcp_packet) - sizeof(dhcp_header));
  3884.     //printf("MsgType=%un",req->req_type);
  3885.     return 1;
  3886. }
  3887. void logDNSMess(char *logBuff, BYTE logLevel)
  3888. {
  3889. // pthread_mutex_lock( &mutLogFile );
  3890.     if (verbatim)
  3891.         printf("%sn", logBuff);
  3892. else if (cfig.logfile && logLevel <= cfig.dnsLogLevel)
  3893. {
  3894. time_t t = time(NULL);
  3895. tm *ttm = localtime(&t);
  3896. if (ttm->tm_yday != loggingDay)
  3897. {
  3898. loggingDay = ttm->tm_yday;
  3899. strftime(extbuff, sizeof(extbuff), logFile, ttm);
  3900. if (strcasecmp(currentLogFile, extbuff))
  3901. {
  3902. strcpy(currentLogFile, extbuff);
  3903. fprintf(cfig.logfile, "Logging Continued on file %sn", currentLogFile);
  3904. fclose(cfig.logfile);
  3905. cfig.logfile = fopen(currentLogFile, "at");
  3906. if (cfig.logfile)
  3907. fprintf(cfig.logfile, "%snn", sVersion);
  3908. else
  3909. {
  3910. sprintf(tempbuff, "Warning: faled to open log file %s", currentLogFile);
  3911. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), tempbuff);
  3912. if (logLevel <= 1)
  3913. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  3914. return;
  3915. }
  3916. }
  3917. }
  3918. strftime(extbuff, sizeof(extbuff), "%d-%b-%y %X", ttm);
  3919.         fprintf(cfig.logfile, "[%s] %sn", extbuff, logBuff);
  3920. fflush(cfig.logfile);
  3921. }
  3922.     else if (logLevel <= 1)
  3923.         syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  3924. // pthread_mutex_unlock( &mutLogFile );
  3925. }
  3926. void logMess(char *logBuff, BYTE logLevel)
  3927. {
  3928. // pthread_mutex_lock( &mutLogFile );
  3929.     if (verbatim)
  3930.         printf("%sn", logBuff);
  3931. else if (cfig.logfile && (logLevel <= cfig.dnsLogLevel || logLevel <= cfig.dhcpLogLevel))
  3932. {
  3933. time_t t = time(NULL);
  3934. tm *ttm = localtime(&t);
  3935. if (ttm->tm_yday != loggingDay)
  3936. {
  3937. loggingDay = ttm->tm_yday;
  3938. strftime(extbuff, sizeof(extbuff), logFile, ttm);
  3939. if (strcasecmp(currentLogFile, extbuff))
  3940. {
  3941. strcpy(currentLogFile, extbuff);
  3942. fprintf(cfig.logfile, "Logging Continued on file %sn", currentLogFile);
  3943. fclose(cfig.logfile);
  3944. cfig.logfile = fopen(currentLogFile, "at");
  3945. if (cfig.logfile)
  3946. fprintf(cfig.logfile, "%snn", sVersion);
  3947. else
  3948. {
  3949. sprintf(tempbuff, "Warning: faled to open log file %s", currentLogFile);
  3950. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), tempbuff);
  3951. if (logLevel <= 1)
  3952. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  3953. return;
  3954. }
  3955. }
  3956. }
  3957. strftime(extbuff, sizeof(extbuff), "%d-%b-%y %X", ttm);
  3958.         fprintf(cfig.logfile, "[%s] %sn", extbuff, logBuff);
  3959. fflush(cfig.logfile);
  3960. }
  3961.     else if (logLevel <= 1)
  3962.         syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  3963. // pthread_mutex_unlock( &mutLogFile );
  3964. }
  3965. void logDHCPMess(char *logBuff, BYTE dhcpLogLevel)
  3966. {
  3967. // pthread_mutex_lock( &mutLogFile );
  3968.     if (verbatim)
  3969.         printf("%sn", logBuff);
  3970. else if (cfig.logfile && dhcpLogLevel <= cfig.dhcpLogLevel)
  3971. {
  3972. time_t t = time(NULL);
  3973. tm *ttm = localtime(&t);
  3974. if (ttm->tm_yday != loggingDay)
  3975. {
  3976. loggingDay = ttm->tm_yday;
  3977. strftime(extbuff, sizeof(extbuff), logFile, ttm);
  3978. if (strcasecmp(currentLogFile, extbuff))
  3979. {
  3980. strcpy(currentLogFile, extbuff);
  3981. fprintf(cfig.logfile, "Logging Continued on file %sn", currentLogFile);
  3982. fclose(cfig.logfile);
  3983. cfig.logfile = fopen(currentLogFile, "at");
  3984. if (cfig.logfile)
  3985. fprintf(cfig.logfile, "%snn", sVersion);
  3986. else
  3987. {
  3988. sprintf(tempbuff, "Warning: faled to open log file %s", currentLogFile);
  3989. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), tempbuff);
  3990. if (dhcpLogLevel <= 1)
  3991. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  3992. return;
  3993. }
  3994. }
  3995. }
  3996. strftime(extbuff, sizeof(extbuff), "%d-%b-%y %X", ttm);
  3997.         fprintf(cfig.logfile, "[%s] %sn", extbuff, logBuff);
  3998. fflush(cfig.logfile);
  3999. }
  4000.     else if (dhcpLogLevel <= 1)
  4001.         syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  4002. // pthread_mutex_unlock( &mutLogFile );
  4003. }
  4004. void logDNSMess(data5 *req, char *logBuff, BYTE dnsLogLevel)
  4005. {
  4006. // pthread_mutex_lock( &mutLogFile );
  4007.     if (verbatim)
  4008.         printf("%sn", logBuff);
  4009. else if (cfig.logfile && dnsLogLevel <= cfig.dnsLogLevel)
  4010. {
  4011. time_t t = time(NULL);
  4012. tm *ttm = localtime(&t);
  4013. if (ttm->tm_yday != loggingDay)
  4014. {
  4015. loggingDay = ttm->tm_yday;
  4016. strftime(extbuff, sizeof(extbuff), logFile, ttm);
  4017. if (strcasecmp(currentLogFile, extbuff))
  4018. {
  4019. strcpy(currentLogFile, extbuff);
  4020. fprintf(cfig.logfile, "Logging Continued on file %sn", currentLogFile);
  4021. fclose(cfig.logfile);
  4022. cfig.logfile = fopen(currentLogFile, "at");
  4023. if (cfig.logfile)
  4024. fprintf(cfig.logfile, "%snn", sVersion);
  4025. else
  4026. {
  4027. sprintf(tempbuff, "Warning: faled to open log file %s", currentLogFile);
  4028. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), tempbuff);
  4029. if (dnsLogLevel <= 1)
  4030. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  4031. return;
  4032. }
  4033. }
  4034. }
  4035. strftime(extbuff, sizeof(extbuff), "%d-%b-%y %X", ttm);
  4036. fprintf(cfig.logfile, "[%s] Client %s, %sn", extbuff, inet_ntoa(req->addr.sin_addr), logBuff);
  4037. fflush(cfig.logfile);
  4038. }
  4039.     else if (dnsLogLevel <= 1)
  4040.         syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  4041. // pthread_mutex_unlock( &mutLogFile );
  4042. }
  4043. void logTCPMess(data5 *req, char *logBuff, BYTE dnsLogLevel)
  4044. {
  4045. // pthread_mutex_lock( &mutLogFile );
  4046.     if (verbatim)
  4047.         printf("%sn", logBuff);
  4048. else if (cfig.logfile && dnsLogLevel <= cfig.dnsLogLevel)
  4049. {
  4050. time_t t = time(NULL);
  4051. tm *ttm = localtime(&t);
  4052. if (ttm->tm_yday != loggingDay)
  4053. {
  4054. loggingDay = ttm->tm_yday;
  4055. strftime(extbuff, sizeof(extbuff), logFile, ttm);
  4056. if (strcasecmp(currentLogFile, extbuff))
  4057. {
  4058. strcpy(currentLogFile, extbuff);
  4059. fprintf(cfig.logfile, "Logging Continued on file %sn", currentLogFile);
  4060. fclose(cfig.logfile);
  4061. cfig.logfile = fopen(currentLogFile, "at");
  4062. if (cfig.logfile)
  4063. fprintf(cfig.logfile, "%snn", sVersion);
  4064. else
  4065. {
  4066. sprintf(tempbuff, "Warning: faled to open log file %s", currentLogFile);
  4067. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), tempbuff);
  4068. if (dnsLogLevel <= 1)
  4069. syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  4070. return;
  4071. }
  4072. }
  4073. }
  4074. strftime(extbuff, sizeof(extbuff), "%d-%b-%y %X", ttm);
  4075.         fprintf(cfig.logfile, "[%s] TCP Client %s, %sn", extbuff, inet_ntoa(req->addr.sin_addr), logBuff);
  4076. fflush(cfig.logfile);
  4077. }
  4078.     else if (dnsLogLevel <= 1)
  4079.         syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);
  4080. // pthread_mutex_unlock( &mutLogFile );
  4081. }