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

网络

开发平台:

Visual C++

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