From a1c3caa3d720c2b0c7cedbf3ff2bbdaf03f7c742 Mon Sep 17 00:00:00 2001 From: huangxin Date: Thu, 22 Sep 2022 16:40:25 +0800 Subject: [PATCH] =?UTF-8?q?Add=20ZNJK-1005=20=E5=A2=9E=E5=8A=A0DHCP=20Serv?= =?UTF-8?q?er=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- srcs/open_dhcp/opendhcpd.cpp | 998 ++++++++++++++++++++++------------- srcs/open_dhcp/opendhcpd.h | 12 +- 2 files changed, 626 insertions(+), 384 deletions(-) diff --git a/srcs/open_dhcp/opendhcpd.cpp b/srcs/open_dhcp/opendhcpd.cpp index 8e659ef..1c12002 100644 --- a/srcs/open_dhcp/opendhcpd.cpp +++ b/srcs/open_dhcp/opendhcpd.cpp @@ -19,33 +19,35 @@ ***************************************************************************/ // opendhcpd.cpp // #include -#include +#include #include using namespace std; #include #include -#include +#include #include #include #include #include -#include #include -#include -#include +#include +#include #include -#include +#include #include #include -#include +#include #include #include "opendhcpd.h" #include "dhcpd.h" +#include "s2j/cJSON.h" + +#define STR2INT(val) ((int)strtol((val), nullptr, 10)) //Global Variables timeval tv; fd_set readfds; -fd_set writefds; +//fd_set writefds; data9 dhcpr; data9 token; data1 network; @@ -58,16 +60,17 @@ char serviceName[] = "OpenDHCPServer"; //char tempbuff[512] = ""; //char logBuff[256]; //char extbuff[256] = ""; -bool verbatim = false; -char iniFile[256] = ""; -char leaFile[256] = ""; -char logFile[256] = ""; -char filePATH[256] = ""; -char htmlTitle[256] = ""; -char arpa[] = ".in-addr.arpa"; -time_t t = time(NULL); -pthread_mutex_t mutStateFile = PTHREAD_MUTEX_INITIALIZER; -pthread_mutex_t mutLogFile = PTHREAD_MUTEX_INITIALIZER; +bool verbatim = false; +char iniFile[256] = ""; +char leaFile[256] = ""; +char logFile[256] = ""; +char filePATH[256] = ""; +char htmlTitle[256] = ""; +char nicif[256] = ""; +//char arpa[] = ".in-addr.arpa"; +time_t t = time(nullptr); +pthread_mutex_t mutStateFile = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t mutLogFile = PTHREAD_MUTEX_INITIALIZER; struct ifconf Ifc; struct ifreq IfcBuf[MAX_SERVERS]; @@ -75,7 +78,7 @@ struct ifreq IfcBuf[MAX_SERVERS]; const char NBSP = 32; const char RANGESET[] = "RANGE_SET"; const char GLOBALOPTIONS[] = "GLOBAL_OPTIONS"; -const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +//const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //const char send200[] = "HTTP/1.1 200 OK\r\nDate: %s\r\nLast-Modified: %s\r\nContent-Type: text/html\r\nConnection: Close\r\nTransfer-Encoding: chunked\r\n"; //const char send200[] = "HTTP/1.1 200 OK\r\nDate: %s\r\nLast-Modified: %s\r\nContent-Type: text/html\r\nConnection: Close\r\nContent-Length: \r\n\r\n"; //const char send200[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"; @@ -90,132 +93,133 @@ const char htmlStart[] = const char bodyStart[] = "
\n
%s
Server: " - "%s %shttp://dhcpserver.sourceforge.net
"; + "%s %s
"; //const char htmlStart[] = "\n\n%s\n\n\n"; //const char bodyStart[] = "
%s
http://dhcp-dns-server.sourceforge.net/
"; //const char bodyStart[] = "
%s
http://dhcpserver.sourceforge.net
"; //const char bodyStart[] = "
%s
%s
"; const data4 opData[] = { - {"SubnetMask", 1, 3, 1}, - {"TimeOffset", 2, 4, 1}, - {"Router", 3, 3, 1}, - {"TimeServer", 4, 3, 1}, - {"NameServer", 5, 3, 1}, - {"DomainServer", 6, 3, 1}, - {"LogServer", 7, 3, 1}, - {"QuotesServer", 8, 3, 1}, - {"LPRServer", 9, 3, 1}, - {"ImpressServer", 10, 3, 1}, - {"RLPServer", 11, 3, 1}, - {"Hostname", 12, 1, 1}, - {"BootFileSize", 13, 5, 1}, - {"MeritDumpFile", 14, 1, 1}, - {"DomainName", 15, 1, 1}, - {"SwapServer", 16, 3, 1}, - {"RootPath", 17, 1, 1}, - {"ExtensionFile", 18, 1, 1}, - {"ForwardOn/Off", 19, 7, 1}, - {"SrcRteOn/Off", 20, 7, 1}, - {"PolicyFilter", 21, 8, 1}, - {"MaxDGAssembly", 22, 5, 1}, - {"DefaultIPTTL", 23, 6, 1}, - {"MTUTimeout", 24, 4, 1}, - {"MTUPlateau", 25, 2, 1}, - {"MTUInterface", 26, 5, 1}, - {"MTUSubnet", 27, 7, 1}, - {"BroadcastAddress", 28, 3, 1}, - {"MaskDiscovery", 29, 7, 1}, - {"MaskSupplier", 30, 7, 1}, - {"RouterDiscovery", 31, 7, 1}, - {"RouterRequest", 32, 3, 1}, - {"StaticRoute", 33, 8, 1}, - {"Trailers", 34, 7, 1}, - {"ARPTimeout", 35, 4, 1}, - {"Ethernet", 36, 7, 1}, - {"DefaultTCPTTL", 37, 6, 1}, - {"KeepaliveTime", 38, 4, 1}, - {"KeepaliveData", 39, 7, 1}, - {"NISDomain", 40, 1, 1}, - {"NISServers", 41, 3, 1}, - {"NTPServers", 42, 3, 1}, - {"VendorSpecificInf", 43, 2, 0}, - {"NETBIOSNameSrv", 44, 3, 1}, - {"NETBIOSDistSrv", 45, 3, 1}, - {"NETBIOSNodeType", 46, 6, 1}, - {"NETBIOSScope", 47, 1, 1}, - {"XWindowFont", 48, 1, 1}, - {"XWindowManager", 49, 3, 1}, - {"AddressRequest", 50, 3, 0}, - {"AddressTime", 51, 4, 1}, - {"OverLoad", 52, 7, 0}, - {"DHCPMsgType", 53, 6, 0}, - {"DHCPServerId", 54, 3, 0}, - {"ParameterList", 55, 2, 0}, - {"DHCPMessage", 56, 1, 0}, - {"DHCPMaxMsgSize", 57, 5, 0}, - {"RenewalTime", 58, 4, 1}, - {"RebindingTime", 59, 4, 1}, - {"ClassId", 60, 1, 0}, - {"ClientId", 61, 2, 0}, - {"NetWareIPDomain", 62, 1, 1}, - {"NetWareIPOption", 63, 2, 1}, - {"NISDomainName", 64, 1, 1}, - {"NISServerAddr", 65, 3, 1}, - {"TFTPServerName", 66, 1, 1}, - {"BootFileOption", 67, 1, 1}, - {"HomeAgentAddrs", 68, 3, 1}, - {"SMTPServer", 69, 3, 1}, - {"POP3Server", 70, 3, 1}, - {"NNTPServer", 71, 3, 1}, - {"WWWServer", 72, 3, 1}, - {"FingerServer", 73, 3, 1}, - {"IRCServer", 74, 3, 1}, - {"StreetTalkServer", 75, 3, 1}, - {"STDAServer", 76, 3, 1}, - {"UserClass", 77, 1, 0}, - {"DirectoryAgent", 78, 1, 1}, - {"ServiceScope", 79, 1, 1}, - {"RapidCommit", 80, 2, 0}, - {"ClientFQDN", 81, 2, 0}, - {"RelayAgentInformation", 82, 2, 0}, - {"iSNS", 83, 1, 1}, - {"NDSServers", 85, 3, 1}, - {"NDSTreeName", 86, 1, 1}, - {"NDSContext", 87, 1, 1}, - {"LDAP", 95, 1, 1}, - {"PCode", 100, 1, 1}, - {"TCode", 101, 1, 1}, - {"NetInfoAddress", 112, 3, 1}, - {"NetInfoTag", 113, 1, 1}, - {"URL", 114, 1, 1}, - {"AutoConfig", 116, 7, 1}, - {"NameServiceSearch", 117, 2, 1}, - {"SubnetSelectionOption", 118, 3, 1}, - {"DomainSearch", 119, 1, 1}, - {"SIPServersDHCPOption", 120, 1, 1}, - // { "121", 121, 2 , 1}, - {"CCC", 122, 1, 1}, - {"TFTPServerIPaddress", 128, 3, 1}, - {"CallServerIPaddress", 129, 3, 1}, - {"DiscriminationString", 130, 1, 1}, - {"RemoteStatisticsServerIPAddress", 131, 3, 1}, - {"HTTPProxyPhone", 135, 3, 1}, - {"OPTION_CAPWAP_AC_V4", 138, 1, 1}, - {"OPTIONIPv4_AddressMoS", 139, 1, 1}, - {"OPTIONIPv4_FQDNMoS", 140, 1, 1}, - {"SIPUAServiceDomains", 141, 1, 1}, - {"OPTIONIPv4_AddressANDSF", 142, 1, 1}, - {"IPTelephone", 176, 1, 1}, - {"ConfigurationFile", 209, 1, 1}, - {"PathPrefix", 210, 1, 1}, - {"RebootTime", 211, 4, 1}, - {"OPTION_6RD", 212, 1, 1}, - {"OPTION_V4_ACCESS_DOMAIN", 213, 1, 1}, - {"BootFileName", 253, 1, 1}, - {"NextServer", 254, 3, 1}, + {"SubnetMask", 1, 3, true}, + {"TimeOffset", 2, 4, true}, + {"Router", 3, 3, true}, + {"TimeServer", 4, 3, true}, + {"NameServer", 5, 3, true}, + {"DomainServer", 6, 3, true}, + {"LogServer", 7, 3, true}, + {"QuotesServer", 8, 3, true}, + {"LPRServer", 9, 3, true}, + {"ImpressServer", 10, 3, true}, + {"RLPServer", 11, 3, true}, + {"Hostname", 12, 1, true}, + {"BootFileSize", 13, 5, true}, + {"MeritDumpFile", 14, 1, true}, + {"DomainName", 15, 1, true}, + {"SwapServer", 16, 3, true}, + {"RootPath", 17, 1, true}, + {"ExtensionFile", 18, 1, true}, + {"ForwardOn/Off", 19, 7, true}, + {"SrcRteOn/Off", 20, 7, true}, + {"PolicyFilter", 21, 8, true}, + {"MaxDGAssembly", 22, 5, true}, + {"DefaultIPTTL", 23, 6, true}, + {"MTUTimeout", 24, 4, true}, + {"MTUPlateau", 25, 2, true}, + {"MTUInterface", 26, 5, true}, + {"MTUSubnet", 27, 7, true}, + {"BroadcastAddress", 28, 3, true}, + {"MaskDiscovery", 29, 7, true}, + {"MaskSupplier", 30, 7, true}, + {"RouterDiscovery", 31, 7, true}, + {"RouterRequest", 32, 3, true}, + {"StaticRoute", 33, 8, true}, + {"Trailers", 34, 7, true}, + {"ARPTimeout", 35, 4, true}, + {"Ethernet", 36, 7, true}, + {"DefaultTCPTTL", 37, 6, true}, + {"KeepaliveTime", 38, 4, true}, + {"KeepaliveData", 39, 7, true}, + {"NISDomain", 40, 1, true}, + {"NISServers", 41, 3, true}, + {"NTPServers", 42, 3, true}, + {"VendorSpecificInf", 43, 2, false}, + {"NETBIOSNameSrv", 44, 3, true}, + {"NETBIOSDistSrv", 45, 3, true}, + {"NETBIOSNodeType", 46, 6, true}, + {"NETBIOSScope", 47, 1, true}, + {"XWindowFont", 48, 1, true}, + {"XWindowManager", 49, 3, true}, + {"AddressRequest", 50, 3, false}, + {"AddressTime", 51, 4, true}, + {"OverLoad", 52, 7, false}, + {"DHCPMsgType", 53, 6, false}, + {"DHCPServerId", 54, 3, false}, + {"ParameterList", 55, 2, false}, + {"DHCPMessage", 56, 1, false}, + {"DHCPMaxMsgSize", 57, 5, false}, + {"RenewalTime", 58, 4, true}, + {"RebindingTime", 59, 4, true}, + {"ClassId", 60, 1, false}, + {"ClientId", 61, 2, false}, + {"NetWareIPDomain", 62, 1, true}, + {"NetWareIPOption", 63, 2, true}, + {"NISDomainName", 64, 1, true}, + {"NISServerAddr", 65, 3, true}, + {"TFTPServerName", 66, 1, true}, + {"BootFileOption", 67, 1, true}, + {"HomeAgentAddrs", 68, 3, true}, + {"SMTPServer", 69, 3, true}, + {"POP3Server", 70, 3, true}, + {"NNTPServer", 71, 3, true}, + {"WWWServer", 72, 3, true}, + {"FingerServer", 73, 3, true}, + {"IRCServer", 74, 3, true}, + {"StreetTalkServer", 75, 3, true}, + {"STDAServer", 76, 3, true}, + {"UserClass", 77, 1, false}, + {"DirectoryAgent", 78, 1, true}, + {"ServiceScope", 79, 1, true}, + {"RapidCommit", 80, 2, false}, + {"ClientFQDN", 81, 2, false}, + {"RelayAgentInformation", 82, 2, false}, + {"iSNS", 83, 1, true}, + {"NDSServers", 85, 3, true}, + {"NDSTreeName", 86, 1, true}, + {"NDSContext", 87, 1, true}, + {"LDAP", 95, 1, true}, + {"PCode", 100, 1, true}, + {"TCode", 101, 1, true}, + {"NetInfoAddress", 112, 3, true}, + {"NetInfoTag", 113, 1, true}, + {"URL", 114, 1, true}, + {"AutoConfig", 116, 7, true}, + {"NameServiceSearch", 117, 2, true}, + {"SubnetSelectionOption", 118, 3, true}, + {"DomainSearch", 119, 1, true}, + {"SIPServersDHCPOption", 120, 1, true}, + // { "121", 121, 2 , true}, + {"CCC", 122, 1, true}, + {"TFTPServerIPaddress", 128, 3, true}, + {"CallServerIPaddress", 129, 3, true}, + {"DiscriminationString", 130, 1, true}, + {"RemoteStatisticsServerIPAddress", 131, 3, true}, + {"HTTPProxyPhone", 135, 3, true}, + {"OPTION_CAPWAP_AC_V4", 138, 1, true}, + {"OPTIONIPv4_AddressMoS", 139, 1, true}, + {"OPTIONIPv4_FQDNMoS", 140, 1, true}, + {"SIPUAServiceDomains", 141, 1, true}, + {"OPTIONIPv4_AddressANDSF", 142, 1, true}, + {"IPTelephone", 176, 1, true}, + {"ConfigurationFile", 209, 1, true}, + {"PathPrefix", 210, 1, true}, + {"RebootTime", 211, 4, true}, + {"OPTION_6RD", 212, 1, true}, + {"OPTION_V4_ACCESS_DOMAIN", 213, 1, true}, + {"BootFileName", 253, 1, true}, + {"NextServer", 254, 3, true}, }; +static void sendUserList(data19 *req, const char *pRequest); + int dhcpd_main(int argc, char **argv) { char logBuff[256] = ""; @@ -243,7 +247,7 @@ int dhcpd_main(int argc, char **argv) { { while (fgets(tempbuff, sizeof(tempbuff), p)) { - if (atoi(tempbuff) != getpid()) + if (STR2INT(tempbuff) != getpid()) { sprintf(logBuff, "Error: %s is already running, Pid = %s", ds, tempbuff); break; @@ -264,12 +268,17 @@ int dhcpd_main(int argc, char **argv) { } else if (!strcmp(argv[i], "-s") && argc > i + 1 && argv[i + 1][0] != '-') { myTrim(leaFile, argv[i + 1]); i++; + } else if (!strcmp(argv[i], "-k") && argc > i + 1 && argv[i + 1][0] != '-') { + myTrim(nicif, argv[i + 1]); + i++; } else if (!strncasecmp(argv[i], "-i", 2)) myTrim(iniFile, argv[i] + 2); else if (!strncasecmp(argv[i], "-l", 2)) myTrim(logFile, argv[i] + 2); else if (!strncasecmp(argv[i], "-s", 2)) myTrim(leaFile, argv[i] + 2); + else if (!strncasecmp(argv[i], "-k", 2)) + myTrim(nicif, argv[i] + 2); else sprintf(logBuff, "Error: Invalid Argument %s", argv[i]); } @@ -280,6 +289,9 @@ int dhcpd_main(int argc, char **argv) { if (!iniFile[0]) strcpy(iniFile, "/etc/opendhcp.ini"); + if (!nicif[0]) + strcpy(nicif, "vxlan0"); + strcpy(filePATH, iniFile); if (strrchr(filePATH, '/')) { @@ -306,7 +318,7 @@ int dhcpd_main(int argc, char **argv) { pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - int errcode = pthread_create(&threadId, &attr, init, NULL); + int errcode = pthread_create(&threadId, &attr, init, nullptr); pthread_attr_destroy(&attr); if (errcode) { @@ -337,13 +349,13 @@ int dhcpd_main(int argc, char **argv) { if (cfig.replication) FD_SET(cfig.dhcpReplConn.sock, &readfds); - //printf("%i\n",select(network.maxFD, &readfds, NULL, NULL, &tv)); - if (select(network.maxFD, &readfds, NULL, NULL, &tv)) { - t = time(NULL); + //printf("%i\n",select(network.maxFD, &readfds, nullptr, nullptr, &tv)); + if (select(network.maxFD, &readfds, nullptr, nullptr, &tv)) { + t = time(nullptr); network.busy = true; if (network.httpConn.ready && FD_ISSET(network.httpConn.sock, &readfds)) { - data19 *req = (data19 *)calloc(1, sizeof(data19)); + auto *req = (data19 *)calloc(1, sizeof(data19)); if (req) { req->sockLen = sizeof(req->remote); @@ -373,12 +385,12 @@ int dhcpd_main(int argc, char **argv) { if (cfig.dhcpReplConn.ready && FD_ISSET(cfig.dhcpReplConn.sock, &readfds)) { errno = 0; dhcpr.sockLen = sizeof(dhcpr.remote); - dhcpr.bytes = recvfrom(cfig.dhcpReplConn.sock, - dhcpr.raw, - sizeof(dhcpr.raw), - 0, - (sockaddr *)&dhcpr.remote, - &dhcpr.sockLen); + dhcpr.bytes = (int)recvfrom(cfig.dhcpReplConn.sock, + dhcpr.raw, + sizeof(dhcpr.raw), + 0, + (sockaddr *)&dhcpr.remote, + &dhcpr.sockLen); //errno = WSAGetLastError(); @@ -386,7 +398,7 @@ int dhcpd_main(int argc, char **argv) { cfig.dhcpRepl = 0; } } else - t = time(NULL); + t = time(nullptr); } } else { if (logBuff[0]) { @@ -439,12 +451,12 @@ int dhcpd_main(int argc, char **argv) { /* Daemon-specific initialization goes here */ memset(&cfig, 0, sizeof(cfig)); cfig.ppid = getpid(); - data9 dhcpr; + data9 dhcpr_local {}; pthread_t threadId; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - int errcode = pthread_create(&threadId, &attr, init, NULL); + int errcode = pthread_create(&threadId, &attr, init, nullptr); pthread_attr_destroy(&attr); if (errcode) { @@ -477,13 +489,13 @@ int dhcpd_main(int argc, char **argv) { if (cfig.replication) FD_SET(cfig.dhcpReplConn.sock, &readfds); - //printf("%i\n",select(network.maxFD, &readfds, NULL, NULL, &tv)); - if (select(network.maxFD, &readfds, NULL, NULL, &tv)) { - t = time(NULL); + //printf("%i\n",select(network.maxFD, &readfds, nullptr, nullptr, &tv)); + if (select(network.maxFD, &readfds, nullptr, nullptr, &tv)) { + t = time(nullptr); network.busy = true; if (network.httpConn.ready && FD_ISSET(network.httpConn.sock, &readfds)) { - data19 *req = (data19 *)calloc(1, sizeof(data19)); + auto *req = (data19 *)calloc(1, sizeof(data19)); if (req) { req->sockLen = sizeof(req->remote); @@ -503,30 +515,30 @@ int dhcpd_main(int argc, char **argv) { } for (int i = 0; i < MAX_SERVERS && network.dhcpConn[i].ready; i++) { - if (FD_ISSET(network.dhcpConn[i].sock, &readfds) && gdmess(&dhcpr, i) && sdmess(&dhcpr)) - alad(&dhcpr); + if (FD_ISSET(network.dhcpConn[i].sock, &readfds) && gdmess(&dhcpr_local, i) && sdmess(&dhcpr_local)) + alad(&dhcpr_local); } - if (FD_ISSET(network.dhcpListener.sock, &readfds) && gdmess(&dhcpr, 255) && sdmess(&dhcpr)) - alad(&dhcpr); + if (FD_ISSET(network.dhcpListener.sock, &readfds) && gdmess(&dhcpr_local, 255) && sdmess(&dhcpr_local)) + alad(&dhcpr_local); if (cfig.dhcpReplConn.ready && FD_ISSET(cfig.dhcpReplConn.sock, &readfds)) { - errno = 0; - dhcpr.sockLen = sizeof(dhcpr.remote); - dhcpr.bytes = recvfrom(cfig.dhcpReplConn.sock, - dhcpr.raw, - sizeof(dhcpr.raw), - 0, - (sockaddr *)&dhcpr.remote, - &dhcpr.sockLen); + errno = 0; + dhcpr_local.sockLen = sizeof(dhcpr_local.remote); + dhcpr_local.bytes = (int)recvfrom(cfig.dhcpReplConn.sock, + dhcpr_local.raw, + sizeof(dhcpr_local.raw), + 0, + (sockaddr *)&dhcpr_local.remote, + &dhcpr_local.sockLen); //errno = WSAGetLastError(); - if (errno || dhcpr.bytes <= 0) + if (errno || dhcpr_local.bytes <= 0) cfig.dhcpRepl = 0; } } else - t = time(NULL); + t = time(nullptr); } } @@ -604,7 +616,27 @@ MYBYTE pIP(void *raw, MYDWORD data) { return sizeof(MYDWORD); } +const char *getRequestMethod(const char *buffer) { + int i = 0; + char httpMethod[64] = {0}; + + for (; i < 64 && i < strlen(buffer); i++) { + if (buffer[i] >= 'A' && buffer[i] <= 'Z') { + if (buffer[i] == ' ') { + break; + } else { + httpMethod[i] = buffer[i]; + } + } + } + + httpMethod[i] = 0; + + return strdup(httpMethod); +} + void procHTTP(data19 *req) { + static int recCnt = 0; //debug("procHTTP"); char tempbuff[512]; char logBuff[256]; @@ -613,14 +645,14 @@ void procHTTP(data19 *req) { req->ling.l_linger = 30;//0 = discard data, nonzero = wait for data sent setsockopt(req->sock, SOL_SOCKET, SO_LINGER, (const char *)&req->ling, sizeof(req->ling)); - timeval tv1; + timeval tv1 {}; fd_set readfds1; FD_ZERO(&readfds1); tv1.tv_sec = 1; tv1.tv_usec = 0; FD_SET(req->sock, &readfds1); - if (!select((req->sock + 1), &readfds1, NULL, NULL, &tv1)) { + if (!select((req->sock + 1), &readfds1, nullptr, nullptr, &tv1)) { sprintf(logBuff, "HTTP Client %s, Message Receive failed", IP2String(tempbuff, req->remote.sin_addr.s_addr)); logDHCPMess(logBuff, 1); closesocket(req->sock); @@ -628,11 +660,16 @@ void procHTTP(data19 *req) { return; } - errno = 0; - char buffer[1024]; - req->bytes = recv(req->sock, buffer, sizeof(buffer), 0); + errno = 0; + char buffer[1024] = {0}; + req->bytes = (int)recv(req->sock, buffer, sizeof(buffer), 0); //errno = WSAGetLastError(); + recCnt++; + // printf("+++++++receive(%04d)\n", recCnt); + // printf("%s\n", buffer); + // printf("-------receive(%04d)\n", recCnt); + if (errno || req->bytes <= 0) { sprintf(logBuff, "HTTP Client %s, Message Receive failed, Error %s", @@ -667,8 +704,29 @@ void procHTTP(data19 *req) { } buffer[sizeof(buffer) - 1] = 0; - char *fp = NULL; - char *end = strchr(buffer, '\n'); + const char *pMethod = getRequestMethod(buffer); + char *pBody = strstr(buffer, "\r\n\r\n"); + + if (strlen(pBody) > 4) { + pBody = strdup(&pBody[4]); + } else { + pBody = nullptr; + } + + // // printf("+++++++pBody(%04d)\n", recCnt); + // if (pBody == nullptr) { + // // printf("NULL\n"); + // + // } else if (strlen(pBody) <= 4) { + // // printf("Empty\n"); + // } else { + // pBody = strdup(&pBody[4]); + // // printf("(%s): %s\n", pMethod, pBody); + // } + // // printf("-------pBody(%04d)\n", recCnt); + + char *fp = nullptr; + char *end = strchr(buffer, '\n'); if (end && end > buffer && (*(end - 1) == '\r')) { *(end - 1) = 0; @@ -677,6 +735,21 @@ void procHTTP(data19 *req) { fp = myGetToken(buffer, 1); } + printf("Head: [%s]\n", fp); + + if (strcmp(pMethod, "POST") == 0) { + sendUserList(req, pBody); + return; + } + + if (pMethod) { + free((void *)pMethod); + } + + if (pBody) { + free((void *)pBody); + } + if (fp && !strcasecmp(fp, "/")) sendStatus(req); // else if (fp && !strcasecmp(fp, "/scopestatus")) @@ -699,8 +772,125 @@ void procHTTP(data19 *req) { pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); int errcode = pthread_create(&threadId, &attr, sendHTTP, (void *)req); pthread_attr_destroy(&attr); + } +} + +typedef struct { + +} USER_INFO, *PUSER_INFO; + +static void sendUserList(data19 *req, const char *pRequest) { + char rsp[] = + "{\"ver\":3,\"cryptoType\":0,\"timeStamp\":1599187216753,\"code\":200,\"msgContent\":{\"items\":[],\"status\":" + "0,\"message\":[\"Success\"]}}"; + + char logBuff[512]; + char rspBuf[2048] = {0}; + dhcpMap::iterator p; + + printf("Input: %s\n", pRequest); + + if (pRequest == nullptr || strlen(pRequest) == 0) { + sprintf(logBuff, "Requeset Json"); + logDHCPMess(logBuff, 1); + closesocket(req->sock); + free(req); return; } + + cJSON *pRoot = cJSON_Parse(pRequest); + + if (!pRoot) { + closesocket(req->sock); + free(req); + return; + } + + cJSON *pMsgContent = cJSON_GetObjectItem(pRoot, "msgContent"); + + if (!pMsgContent) { + closesocket(req->sock); + free(req); + cJSON_Delete(pRoot); + return; + } + + cJSON *pUserMac = cJSON_GetObjectItem(pMsgContent, "userMac"); + + if (!pUserMac) { + closesocket(req->sock); + free(req); + cJSON_Delete(pRoot); + return; + } + + req->memSize = (int)(2048 + (135 * dhcpCache.size()) + (cfig.dhcpSize * 26)); + req->dp = (char *)calloc(1, req->memSize); + + if (!req->dp) { + sprintf(logBuff, "Memory Error"); + logDHCPMess(logBuff, 1); + closesocket(req->sock); + free(req); + return; + } + + cJSON *pRspRoot = cJSON_CreateObject(); + cJSON_AddNumberToObject(pRspRoot, "version", 3); + cJSON_AddNumberToObject(pRspRoot, "cryptoType", 0); + cJSON_AddNumberToObject(pRspRoot, "timeStamp", (unsigned int)time(nullptr)); + + cJSON *pRspMsg = cJSON_CreateObject(); + cJSON *pMsgArray = cJSON_CreateArray(); + + cJSON_AddItemToObject(pRspMsg, "userInfo", pMsgArray); + + for (int i = 0; i < cJSON_GetArraySize(pUserMac); i++) { + char tempbuff[512]; + cJSON *pItem = cJSON_GetArrayItem(pUserMac, i); + cJSON *pRspItem = cJSON_CreateObject(); + + p = dhcpCache.find(pItem->valuestring); + cJSON_AddStringToObject(pRspItem, "userMac", pItem->valuestring); + + if (p != dhcpCache.end()) { + data7 *dhcpEntry = p->second; + + cJSON_AddStringToObject(pRspItem, "ip", IP2String(tempbuff, dhcpEntry->ip)); + cJSON_AddStringToObject(pRspItem, "hostname", dhcpEntry->hostname); + if (dhcpEntry->display && dhcpEntry->expiry >= t) { + tm *ttm = localtime(&dhcpEntry->expiry); + strftime(tempbuff, sizeof(tempbuff), "%d-%b-%y %X", ttm); + cJSON_AddStringToObject(pRspItem, "leaseExpiry", tempbuff); + } else { + cJSON_AddStringToObject(pRspItem, "leaseExpiry", "Expiry"); + } + } else { + cJSON_AddStringToObject(pRspItem, "ip", ""); + cJSON_AddStringToObject(pRspItem, "hostname", ""); + } + + cJSON_AddItemToArray(pMsgArray, pRspItem); + } + + cJSON_AddItemToObject(pRspRoot, "msgContent", pRspMsg); + + char *fp = req->dp; + char *maxData = req->dp + (req->memSize - 512); + + //fp += sprintf(fp, send200, strlen(rspBuf)); + fp += sprintf(fp, "%s", cJSON_Print(pRspRoot)); + + cJSON_Delete(pRoot); + cJSON_Delete(pRspRoot); + + req->bytes = (int)(fp - req->dp); + pthread_t threadId; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + int errcode = pthread_create(&threadId, &attr, sendHTTP, (void *)req); + pthread_attr_destroy(&attr); } void sendStatus(data19 *req) { @@ -712,10 +902,10 @@ void sendStatus(data19 *req) { dhcpMap::iterator p; MYDWORD iip = 0; - data7 *dhcpEntry = NULL; - //data7 *cache = NULL; + data7 *dhcpEntry = nullptr; + //data7 *cache = nullptr; //printf("%d=%d\n", dhcpCache.size(), cfig.dhcpSize); - req->memSize = 2048 + (135 * dhcpCache.size()) + (cfig.dhcpSize * 26); + req->memSize = (int)(2048 + (135 * dhcpCache.size()) + (cfig.dhcpSize * 26)); req->dp = (char *)calloc(1, req->memSize); if (!req->dp) { @@ -752,15 +942,14 @@ void sendStatus(data19 *req) { } else { fp += sprintf(fp, "Active Leases\n"); fp += sprintf( - fp, - "Mac AddressIPLease ExpiryHostname (first 20 chars)\n"); + fp, "Mac AddressIPLease ExpiryHostname (first 20 chars)\n"); } for (p = dhcpCache.begin(); kRunning && p != dhcpCache.end() && fp < maxData; p++) { //if ((dhcpEntry = p->second) && dhcpEntry->display) if ((dhcpEntry = p->second) && dhcpEntry->display && dhcpEntry->expiry >= t) { fp += sprintf(fp, ""); - fp += sprintf(fp, td200, dhcpEntry->mapname); // mapname is MAC address + fp += sprintf(fp, td200, dhcpEntry->mapname);// mapname is MAC address fp += sprintf(fp, td200, IP2String(tempbuff, dhcpEntry->ip)); if (dhcpEntry->expiry >= MY_MAX_TIME) @@ -804,8 +993,7 @@ void sendStatus(data19 *req) { MYWORD ipfree = 0; MYWORD ind = 0; - for (MYDWORD iip = cfig.dhcpRanges[rangeInd].rangeStart; iip <= cfig.dhcpRanges[rangeInd].rangeEnd; - iip++, ind++) { + for (MYDWORD ip = cfig.dhcpRanges[rangeInd].rangeStart; ip <= cfig.dhcpRanges[rangeInd].rangeEnd; ip++, ind++) { if (cfig.dhcpRanges[rangeInd].expiry[ind] < MY_MAX_TIME) { if (cfig.dhcpRanges[rangeInd].expiry[ind] < t) ipfree++; @@ -856,7 +1044,7 @@ void sendStatus(data19 *req) { fp += sprintf(fp, "\n\n"); //MYBYTE x = sprintf(tempbuff, "%u", (fp - contentStart)); //memcpy((contentStart - 12), tempbuff, x); - req->bytes = fp - req->dp; + req->bytes = (int)(fp - req->dp); pthread_t threadId; pthread_attr_t attr; pthread_attr_init(&attr); @@ -946,7 +1134,7 @@ void *sendHTTP(void *lpParam) FD_ZERO(&writefds1); FD_SET(req->sock, &writefds1); - if (select((req->sock + 1), NULL, &writefds1, NULL, &tv1)) + if (select((req->sock + 1), nullptr, &writefds1, nullptr, &tv1)) { if (sendheader) { @@ -989,7 +1177,7 @@ void *sendHTTP(void *lpParam) closesocket(req->sock); free(req->dp); free(req); - pthread_exit(NULL); + pthread_exit(nullptr); } */ @@ -1014,7 +1202,7 @@ void *sendHTTP(void *lpParam) FD_ZERO(&writefds1); FD_SET(req->sock, &writefds1); - if (select((req->sock + 1), NULL, &writefds1, NULL, &tv1)) + if (select((req->sock + 1), nullptr, &writefds1, nullptr, &tv1)) { if (sendheader) { @@ -1045,18 +1233,18 @@ void *sendHTTP(void *lpParam) closesocket(req->sock); free(req->dp); free(req); - pthread_exit(NULL); + pthread_exit(nullptr); } */ void *sendHTTP(void *lpParam) { - data19 *req = (data19 *)lpParam; + auto *req = (data19 *)lpParam; //sprintf(logBuff, "sendHTTP memsize=%d bytes=%d", req->memSize, req->bytes); //(logBuff); char *dp = req->dp; - timeval tv1; + timeval tv1 {}; fd_set writefds1; int sent = 0; bool sendheader = true; @@ -1067,20 +1255,22 @@ void *sendHTTP(void *lpParam) { FD_ZERO(&writefds1); FD_SET(req->sock, &writefds1); - if (select((req->sock + 1), NULL, &writefds1, NULL, &tv1)) { + if (select((req->sock + 1), nullptr, &writefds1, nullptr, &tv1)) { if (sendheader) { - char send200[] = - "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: %i\r\n\r\n"; + char send200 + [] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: " + "close\r\nContent-Length: %i\r\n\r\n"; char header[256]; sprintf(header, send200, req->bytes); send(req->sock, header, strlen(header), 0); sendheader = false; - } else if (req->bytes > 1024) - sent = send(req->sock, dp, 1024, 0); - else if (req->bytes > 0) - sent = send(req->sock, dp, req->bytes, 0); - else + } else if (req->bytes > 1024) { + sent = (int)send(req->sock, dp, 1024, 0); + } else if (req->bytes > 0) { + sent = (int)send(req->sock, dp, req->bytes, 0); + } else { break; + } //errno = WSAGetLastError(); @@ -1097,7 +1287,7 @@ void *sendHTTP(void *lpParam) { closesocket(req->sock); free(req->dp); free(req); - pthread_exit(NULL); + pthread_exit(nullptr); } bool checkRange(data17 *rangeData, char rangeInd) { @@ -1128,7 +1318,7 @@ bool checkIP(data9 *req, data17 *rangeData, MYDWORD ip) { MYDWORD rangeStart; MYDWORD rangeEnd; - char rangeInd = getRangeInd(ip); + char rangeInd = (char)(getRangeInd(ip) & 0xFF); if (rangeInd < 0) return false; @@ -1192,10 +1382,8 @@ MYDWORD resad(data9 *req) { return req->dhcpEntry->ip; } else { if (verbatim || cfig.dhcpLogLevel) { - sprintf(logBuff, - "Static DHCP Host %s (%s) has No IP, DHCPDISCOVER ignored", - req->chaddr, - req->hostname); + sprintf( + logBuff, "Static DHCP Host %s (%s) has No IP, DHCPDISCOVER ignored", req->chaddr, req->hostname); logDHCPMess(logBuff, 1); } return 0; @@ -1207,7 +1395,7 @@ MYDWORD resad(data9 *req) { MYDWORD iipNew = 0; MYDWORD iipExp = 0; bool rangeFound = false; - data17 rangeData; + data17 rangeData {}; memset(&rangeData, 0, sizeof(data17)); if (cfig.hasFilter) { @@ -1298,7 +1486,7 @@ MYDWORD resad(data9 *req) { if (cfig.replication == 2) { for (MYDWORD m = rangeEnd; m >= rangeStart; m--) { - int ind = m - range->rangeStart; + unsigned int ind = m - range->rangeStart; if (!range->expiry[ind]) { iipNew = m; @@ -1309,7 +1497,7 @@ MYDWORD resad(data9 *req) { } } else { for (MYDWORD m = rangeStart; m <= rangeEnd; m++) { - int ind = m - range->rangeStart; + unsigned int ind = m - range->rangeStart; //sprintf(logBuff, "Ind=%u Exp=%u", m, range->expiry[ind]); //logMess(logBuff, 1); @@ -1406,10 +1594,10 @@ MYDWORD chkaddr(data9 *req) { MYDWORD rangeEnd = 0; if (req->dhcpEntry->rangeInd >= 0) { - data17 rangeData; + data17 rangeData {}; memset(&rangeData, 0, sizeof(data17)); data13 *range = &cfig.dhcpRanges[req->dhcpEntry->rangeInd]; - int ind = getIndex(req->dhcpEntry->rangeInd, req->dhcpEntry->ip); + int ind = getIndex((char)req->dhcpEntry->rangeInd, req->dhcpEntry->ip); bool rangeOK = true; if (cfig.hasFilter) { @@ -1509,6 +1697,68 @@ MYDWORD chkaddr(data9 *req) { return 0; } +#include + +int getHwAddr(char *buff, char *mac) { + if (buff == NULL || mac == NULL) { + return -1; + } + + int i = 0; + unsigned int p[6]; + + if (sscanf(mac, "%x:%x:%x:%x:%x:%x", &p[0], &p[1], &p[2], &p[3], &p[4], &p[5]) < 6) { + return -1; + } + + for (i = 0; i < 6; i++) { + buff[i] = p[i]; + } + + return 0; +} + +int arpSet(const char *ifname, char *ipStr, char *mac) { + if (ifname == NULL || ipStr == NULL || mac == NULL) { + printf("para is null.\n"); + return -1; + } + + struct arpreq req {}; + struct sockaddr_in *sin; + int ret = 0; + int sock_fd = 0; + + memset(&req, 0, sizeof(struct arpreq)); + sin = (struct sockaddr_in *)&req.arp_pa; + sin->sin_family = AF_INET; + sin->sin_addr.s_addr = inet_addr(ipStr); + //arp_dev长度为[16],注意越界 + strncpy(req.arp_dev, ifname, 15); + req.arp_flags = ATF_PERM | ATF_COM; + + if (getHwAddr((char *)req.arp_ha.sa_data, mac) < 0) { + printf("get mac error.\n"); + return -1; + } + + sock_fd = socket(AF_INET, SOCK_DGRAM, 0); + if (sock_fd < 0) { + printf("get socket error.\n"); + return -1; + } + + ret = ioctl(sock_fd, SIOCSARP, &req); + if (ret < 0) { + printf("ioctl error.\n"); + close(sock_fd); + return -1; + } + + close(sock_fd); + return 0; +} + MYDWORD sdmess(data9 *req) { //sprintf(logBuff, "sdmess, Request Type = %u",req->req_type); //debug(logBuff); @@ -1639,7 +1889,7 @@ MYDWORD sdmess(data9 *req) { return 0; addOptions(req); - int packSize = req->vp - (MYBYTE *)&req->dhcpp; + int packSize = (int)(req->vp - (MYBYTE *)&req->dhcpp); packSize++; if (req->req_type == DHCP_MESS_NONE) @@ -1666,20 +1916,22 @@ MYDWORD sdmess(data9 *req) { req->dhcpp.header.bp_op = BOOTP_REPLY; errno = 0; + arpSet(nicif, IP2String(tempbuff, req->dhcpp.header.bp_yiaddr), req->chaddr); + + sockaddr_in cliAddr {}; + memcpy(&cliAddr, &req->remote, sizeof(sockaddr_in)); + cliAddr.sin_addr.s_addr = inet_addr(IP2String(tempbuff, req->dhcpp.header.bp_yiaddr)); + if (req->req_type == DHCP_MESS_DISCOVER && !req->remote.sin_addr.s_addr) { - req->bytes = sendto(network.dhcpConn[req->sockInd].sock, - req->raw, - packSize, - MSG_DONTROUTE, - (sockaddr *)&req->remote, - sizeof(req->remote)); + req->bytes = (int)sendto(network.dhcpConn[req->sockInd].sock, + req->raw, + packSize, + MSG_DONTROUTE, + (sockaddr *)&cliAddr, + sizeof(req->remote)); } else { - req->bytes = sendto(network.dhcpConn[req->sockInd].sock, - req->raw, - packSize, - 0, - (sockaddr *)&req->remote, - sizeof(req->remote)); + req->bytes = (int)sendto( + network.dhcpConn[req->sockInd].sock, req->raw, packSize, 0, (sockaddr *)&cliAddr, sizeof(req->remote)); } if (errno || req->bytes <= 0) @@ -1756,7 +2008,7 @@ MYDWORD alad(data9 *req) { void addOptions(data9 *req) { //debug("addOptions"); - data3 op; + data3 op {}; int i; if (req->req_type && req->resp_type) { @@ -1956,7 +2208,7 @@ void setLeaseExpiry(data7 *dhcpEntry, MYDWORD lease) { void setLeaseExpiry(data7 *dhcpEntry) { if (dhcpEntry && dhcpEntry->ip) { - int ind = getIndex(dhcpEntry->rangeInd, dhcpEntry->ip); + int ind = getIndex((char)dhcpEntry->rangeInd, dhcpEntry->ip); if (ind >= 0) { cfig.dhcpRanges[dhcpEntry->rangeInd].dhcpEntry[ind] = dhcpEntry; @@ -1972,7 +2224,7 @@ void lockIP(MYDWORD ip) { for (char rangeInd = 0; rangeInd < cfig.rangeCount; rangeInd++) { if (iip >= cfig.dhcpRanges[rangeInd].rangeStart && iip <= cfig.dhcpRanges[rangeInd].rangeEnd) { - int ind = iip - cfig.dhcpRanges[rangeInd].rangeStart; + unsigned int ind = iip - cfig.dhcpRanges[rangeInd].rangeStart; if (cfig.dhcpRanges[rangeInd].expiry[ind] < MY_MAX_TIME) cfig.dhcpRanges[rangeInd].expiry[ind] = MY_MAX_TIME; @@ -1982,13 +2234,14 @@ void lockIP(MYDWORD ip) { } } +#if 0 void holdIP(MYDWORD ip) { if (ip) { MYDWORD iip = htonl(ip); for (char rangeInd = 0; rangeInd < cfig.rangeCount; rangeInd++) { if (iip >= cfig.dhcpRanges[rangeInd].rangeStart && iip <= cfig.dhcpRanges[rangeInd].rangeEnd) { - int ind = iip - cfig.dhcpRanges[rangeInd].rangeStart; + unsigned int ind = iip - cfig.dhcpRanges[rangeInd].rangeStart; if (cfig.dhcpRanges[rangeInd].expiry[ind] == 0) cfig.dhcpRanges[rangeInd].expiry[ind] = 1; @@ -1998,6 +2251,7 @@ void holdIP(MYDWORD ip) { } } } +#endif void *sendToken(void *lpParam) { //debug("Send Token"); @@ -2019,14 +2273,14 @@ void *sendToken(void *lpParam) { sleep(300); } - pthread_exit(NULL); + pthread_exit(nullptr); } MYDWORD sendRepl(data9 *req) { char ipBuff[16]; char logBuff[256]; - data3 op; + data3 op {}; MYBYTE *opPointer = req->dhcpp.vend_data; @@ -2059,13 +2313,13 @@ MYDWORD sendRepl(data9 *req) { *(req->vp) = DHCP_OPTION_END; req->vp++; - req->bytes = req->vp - (MYBYTE *)req->raw; + req->bytes = (int)(req->vp - (MYBYTE *)req->raw); req->dhcpp.header.bp_op = BOOTP_REQUEST; errno = 0; - req->bytes = - sendto(cfig.dhcpReplConn.sock, req->raw, req->bytes, 0, (sockaddr *)&token.remote, sizeof(token.remote)); + req->bytes = (int)sendto( + cfig.dhcpReplConn.sock, req->raw, req->bytes, 0, (sockaddr *)&token.remote, sizeof(token.remote)); //errno = WSAGetLastError(); @@ -2156,7 +2410,7 @@ void recvRepl(data9 *req) { return; } - char rInd = getRangeInd(ip); + int rInd = getRangeInd(ip); req->dhcpEntry = findDHCPEntry(req->chaddr); if (req->dhcpEntry && req->dhcpEntry->ip != ip) { @@ -2167,18 +2421,16 @@ void recvRepl(data9 *req) { req->chaddr, IP2String(ipbuff, ip)); else - sprintf(logBuff, - "DHCP Update ignored for %s (%s) from Primary Server", - req->chaddr, - IP2String(ipbuff, ip)); + sprintf( + logBuff, "DHCP Update ignored for %s (%s) from Primary Server", req->chaddr, IP2String(ipbuff, ip)); logDHCPMess(logBuff, 1); return; } else if (req->dhcpEntry->rangeInd >= 0) { - int ind = getIndex(req->dhcpEntry->rangeInd, req->dhcpEntry->ip); + int ind = getIndex((char)req->dhcpEntry->rangeInd, req->dhcpEntry->ip); if (ind >= 0) - cfig.dhcpRanges[req->dhcpEntry->rangeInd].dhcpEntry[ind] = 0; + cfig.dhcpRanges[req->dhcpEntry->rangeInd].dhcpEntry[ind] = nullptr; } } @@ -2252,10 +2504,8 @@ void recvRepl(data9 *req) { } } else { if (cfig.replication == 1) - sprintf(logBuff, - "DHCP Update ignored for %s (%s) from Secondary Server", - req->chaddr, - IP2String(ipbuff, ip)); + sprintf( + logBuff, "DHCP Update ignored for %s (%s) from Secondary Server", req->chaddr, IP2String(ipbuff, ip)); else sprintf(logBuff, "DHCP Update ignored for %s (%s) from Primary Server", req->chaddr, IP2String(ipbuff, ip)); @@ -2264,7 +2514,7 @@ void recvRepl(data9 *req) { } } -char getRangeInd(MYDWORD ip) { +int getRangeInd(MYDWORD ip) { if (ip) { MYDWORD iip = htonl(ip); @@ -2279,7 +2529,7 @@ int getIndex(char rangeInd, MYDWORD ip) { if (ip && rangeInd >= 0 && rangeInd < cfig.rangeCount) { MYDWORD iip = htonl(ip); if (iip >= cfig.dhcpRanges[rangeInd].rangeStart && iip <= cfig.dhcpRanges[rangeInd].rangeEnd) - return (iip - cfig.dhcpRanges[rangeInd].rangeStart); + return (int)(iip - cfig.dhcpRanges[rangeInd].rangeStart); } return -1; } @@ -2338,7 +2588,7 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { sectionName, raw); logDHCPMess(logBuff, 1); - } else if (!isIP(value) && strcasecmp(value, "0.0.0.0")) { + } else if (!isIP(value) && strcasecmp(value, "0.0.0.0") != 0) { sprintf(logBuff, "Warning: section [%s] option Invalid IP Addr %s option ignored", sectionName, value); logDHCPMess(logBuff, 1); } else @@ -2383,9 +2633,9 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { valSize = strlen(value); } else memcpy(value, hoption, valSize); - } else if (isInt(value) && atol(value) > USHRT_MAX) + } else if (isInt(value) && strtol(value, nullptr, 10) > USHRT_MAX) valType = 4; - else if (isInt(value) && atoi(value) > UCHAR_MAX) + else if (isInt(value) && STR2INT(value) > UCHAR_MAX) valType = 5; else if (isInt(value)) valType = 6; @@ -2404,8 +2654,8 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { for (; *ptr; ptr = myGetToken(ptr, 1)) { //printf("%s:", ptr); - if (isInt(ptr) && atoi(ptr) <= UCHAR_MAX) { - hoption[valSize] = atoi(ptr); + if (isInt(ptr) && STR2INT(ptr) <= UCHAR_MAX) { + hoption[valSize] = STR2INT(ptr); valSize++; } else break; @@ -2457,7 +2707,7 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { logDHCPMess(logBuff, 1); } else if (!strcasecmp(sectionName, RANGESET)) { addServer(cfig.rangeSet[optionData->rangeSetInd].subnetIP, MAX_RANGE_FILTERS, fIP(value)); - cfig.hasFilter = 1; + cfig.hasFilter = true; } else { sprintf(logBuff, "Warning: section [%s] option %s not allowed in this section, option ignored", @@ -2486,13 +2736,13 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { opTag = 0; if (isInt(name)) { - if (atoi(name) < 1 || atoi(name) >= 254) { + if (STR2INT(name) < 1 || STR2INT(name) >= 254) { sprintf(logBuff, "Warning: section [%s] invalid option %s, ignored", sectionName, raw); logDHCPMess(logBuff, 1); continue; } - opTag = atoi(name); + opTag = STR2INT(name); opType = 0; } @@ -2612,10 +2862,8 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { dp += valSize; buffsize -= (valSize + 2); } else { - sprintf(logBuff, - "Warning: section [%s] option %s, no more space for options", - sectionName, - raw); + sprintf( + logBuff, "Warning: section [%s] option %s, no more space for options", sectionName, raw); logDHCPMess(logBuff, 1); } } else { @@ -2633,7 +2881,7 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { if (valType == 2 && valSize == 4) j = fUInt(value); else if (valType >= 4 && valType <= 6) - j = atol(value); + j = strtol(value, nullptr, 10); else { sprintf(logBuff, "Warning: section [%s] option %s, value should be integer between 0 & %u or 4 bytes, " @@ -2692,7 +2940,7 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { if (valType == 2 && valSize == 2) j = fUShort(value); else if (valType == 5 || valType == 6) - j = atol(value); + j = strtol(value, nullptr, 10); else { sprintf( logBuff, @@ -2723,7 +2971,7 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { if (valType == 2 && valSize == 1) j = *value; else if (valType == 6) - j = atol(value); + j = strtol(value, nullptr, 10); else { sprintf(logBuff, "Warning: section [%s] option %s, value should be between 0 & %u or single byte, option " @@ -2760,8 +3008,8 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { else if (valType == 1 && (!strcasecmp(value, "no") || !strcasecmp(value, "off") || !strcasecmp(value, "false"))) j = 0; - else if (valType == 6 && atoi(value) < 2) - j = atoi(value); + else if (valType == 6 && STR2INT(value) < 2) + j = STR2INT(value); else { sprintf(logBuff, "Warning: section [%s] option %s, value should be yes/on/true/1 or no/off/false/0, option " @@ -2790,7 +3038,7 @@ void loadOptions(FILE *f, const char *sectionName, data20 *optionData) { if (valType == 6) { valType = 2; valSize = 1; - *value = atoi(value); + *value = (char)STR2INT(value); } if (opType == 2 && valType != 2) { @@ -2844,7 +3092,7 @@ void lockOptions(FILE *f) { for (op_index = 0; op_index < n; op_index++) if (!strcasecmp(name, opData[op_index].opName) - || (opData[op_index].opTag && atoi(name) == opData[op_index].opTag)) + || (opData[op_index].opTag && STR2INT(name) == opData[op_index].opTag)) break; if (op_index >= n) @@ -2857,10 +3105,8 @@ void lockOptions(FILE *f) { MYBYTE valueSize = 0; for (; *ptr; ptr = myGetToken(ptr, 1)) { - if (valueSize >= UCHAR_MAX) - break; - else if (isInt(ptr) && atoi(ptr) <= UCHAR_MAX) { - hoption[valueSize] = atoi(ptr); + if (isInt(ptr) && STR2INT(ptr) <= UCHAR_MAX) { + hoption[valueSize] = (char)STR2INT(ptr); valueSize++; } else break; @@ -2919,7 +3165,7 @@ void addDHCPRange(char *dp) { range->rangeStart = rs; range->rangeEnd = re; range->expiry = (time_t *)calloc((re - rs + 1), sizeof(time_t)); - range->dhcpEntry = (data7 **)calloc((re - rs + 1), sizeof(data7 *)); + range->dhcpEntry = (data7 **)calloc((re - rs + 1), sizeof(struct data7 *)); if (!range->expiry || !range->dhcpEntry) { if (range->expiry) @@ -3021,10 +3267,10 @@ void addMacRange(MYBYTE rangeSetInd, char *macRange) { sprintf(logBuff, "Section [%s], invalid Filter_Mac_Range %s, ignored", RANGESET, macRange); logDHCPMess(logBuff, 1); } else { - MYBYTE macSize1 = 16; - MYBYTE macSize2 = 16; - MYBYTE *macStart = (MYBYTE *)calloc(1, macSize1); - MYBYTE *macEnd = (MYBYTE *)calloc(1, macSize2); + MYBYTE macSize1 = 16; + MYBYTE macSize2 = 16; + auto *macStart = (MYBYTE *)calloc(1, macSize1); + auto *macEnd = (MYBYTE *)calloc(1, macSize2); if (!macStart || !macEnd) { sprintf(logBuff, "DHCP Range Load, Memory Allocation Error"); @@ -3064,14 +3310,14 @@ void addMacRange(MYBYTE rangeSetInd, char *macRange) { void loadDHCP() { char ipbuff[32]; char logBuff[512]; - data7 *dhcpEntry = NULL; - data8 dhcpData; + data7 *dhcpEntry = nullptr; + data8 dhcpData {}; char mapname[64]; - FILE *f = NULL; - FILE *ff = NULL; + FILE *f = nullptr; + FILE *ff = nullptr; if ((f = openSection(GLOBALOPTIONS, 1))) { - data20 optionData; + data20 optionData {}; loadOptions(f, GLOBALOPTIONS, &optionData); cfig.options = (MYBYTE *)calloc(1, optionData.optionSize); memcpy(cfig.options, optionData.options, optionData.optionSize); @@ -3082,12 +3328,12 @@ void loadDHCP() { cfig.mask = inet_addr("255.255.255.0"); for (MYBYTE i = 1; i <= MAX_RANGE_SETS; i++) { - if (f = openSection(RANGESET, i)) { + if ((f = openSection(RANGESET, i))) { MYBYTE m = cfig.rangeCount; - data20 optionData; + data20 optionData {}; optionData.rangeSetInd = i - 1; loadOptions(f, RANGESET, &optionData); - MYBYTE *options = NULL; + MYBYTE *options = nullptr; cfig.rangeSet[optionData.rangeSetInd].active = true; if (optionData.optionSize > 3) { @@ -3100,7 +3346,7 @@ void loadDHCP() { cfig.dhcpRanges[m].options = options; cfig.dhcpRanges[m].mask = optionData.mask; } - cfig.rangeCount = m; + cfig.rangeCount = (char)m; } else break; } @@ -3120,11 +3366,11 @@ void loadDHCP() { } } - if (f = openSection(GLOBALOPTIONS, 1)) + if ((f = openSection(GLOBALOPTIONS, 1))) lockOptions(f); for (MYBYTE i = 1; i <= MAX_RANGE_SETS; i++) { - if (f = openSection(RANGESET, i)) + if ((f = openSection(RANGESET, i))) lockOptions(f); else break; @@ -3155,19 +3401,19 @@ void loadDHCP() { MYBYTE hexValue[UCHAR_MAX]; MYBYTE hexValueSize = sizeof(hexValue); - data20 optionData; + data20 optionData {}; if (strlen(sectionName) <= 48 && !getHexValue(hexValue, sectionName, &hexValueSize)) { if (hexValueSize <= 16) { dhcpEntry = findDHCPEntry(hex2String(mapname, hexValue, hexValueSize)); if (!dhcpEntry) { - if (f = openSection(sectionName, 1)) + if ((f = openSection(sectionName, 1))) loadOptions(f, sectionName, &optionData); - if (f = openSection(sectionName, 1)) + if ((f = openSection(sectionName, 1))) lockOptions(f); - dhcpMap::iterator p = dhcpCache.begin(); + auto p = dhcpCache.begin(); for (; p != dhcpCache.end(); p++) { if (p->second && p->second->ip && p->second->ip == optionData.ip) @@ -3225,8 +3471,8 @@ void loadDHCP() { if (f) { while (fread(&dhcpData, sizeof(data8), 1, f)) { - char rangeInd = -1; - int ind = -1; + int rangeInd = -1; + int ind = -1; //sprintf(logBuff, "Loading %s=%s", dhcpData.hostname, IP2String(ipbuff, dhcpData.ip)); //logDHCPMess(logBuff, 1); @@ -3234,7 +3480,7 @@ void loadDHCP() { && !findServer(network.allServers, MAX_SERVERS, dhcpData.ip)) { hex2String(mapname, dhcpData.bp_chaddr, dhcpData.bp_hlen); - dhcpMap::iterator p = dhcpCache.begin(); + auto p = dhcpCache.begin(); for (; p != dhcpCache.end(); p++) { dhcpEntry = p->second; @@ -3243,7 +3489,8 @@ void loadDHCP() { break; } - if ((p != dhcpCache.end()) && (strcasecmp(mapname, dhcpEntry->mapname) || dhcpEntry->ip != dhcpData.ip)) + if ((p != dhcpCache.end()) + && (strcasecmp(mapname, dhcpEntry->mapname) != 0 || dhcpEntry->ip != dhcpData.ip)) continue; dhcpEntry = findDHCPEntry(mapname); @@ -3279,7 +3526,7 @@ void loadDHCP() { f = fopen(leaFile, "rb+"); if (f) { - dhcpMap::iterator p = dhcpCache.begin(); + auto p = dhcpCache.begin(); for (; p != dhcpCache.end(); p++) { if ((dhcpEntry = p->second) && dhcpEntry->expiry > (t - 31 * 24 * 3600)) { @@ -3296,7 +3543,7 @@ void loadDHCP() { dhcpEntry->dhcpInd = cfig.dhcpInd; dhcpData.dhcpInd = dhcpEntry->dhcpInd; - if (fseek(f, (dhcpData.dhcpInd - 1) * sizeof(data8), SEEK_SET) >= 0) + if (fseek(f, (long)((dhcpData.dhcpInd - 1) * sizeof(data8)), SEEK_SET) >= 0) fwrite(&dhcpData, sizeof(data8), 1, f); } } @@ -3305,6 +3552,7 @@ void loadDHCP() { } } +#if 0 bool getSection(const char *sectionName, char *buffer, MYBYTE serial, char *fileName) { //printf("%s=%s\n",fileName,sectionName); char section[128]; @@ -3346,6 +3594,7 @@ bool getSection(const char *sectionName, char *buffer, MYBYTE serial, char *file *(buffer + 1) = 0; return (found == serial); } +#endif FILE *openSection(const char *sectionName, MYBYTE serial) { char tempbuff[512]; @@ -3353,7 +3602,7 @@ FILE *openSection(const char *sectionName, MYBYTE serial) { char section[128]; sprintf(section, "[%s]", sectionName); myUpper(section); - FILE *f = NULL; + FILE *f = nullptr; f = fopen(iniFile, "rt"); if (f) { @@ -3376,7 +3625,7 @@ FILE *openSection(const char *sectionName, MYBYTE serial) { if (buff[0] == '@') { fclose(f); - f = NULL; + f = nullptr; buff[0] = NBSP; myTrim(buff, buff); @@ -3393,7 +3642,7 @@ FILE *openSection(const char *sectionName, MYBYTE serial) { else { sprintf(logBuff, "Error: Section [%s], file %s not found", sectionName, tempbuff); logDHCPMess(logBuff, 1); - return NULL; + return nullptr; } } else { fseek(f, fpos, SEEK_SET); @@ -3405,7 +3654,7 @@ FILE *openSection(const char *sectionName, MYBYTE serial) { } fclose(f); } - return NULL; + return nullptr; } char *readSection(char *buff, FILE *f) { @@ -3421,7 +3670,7 @@ char *readSection(char *buff, FILE *f) { } fclose(f); - return NULL; + return nullptr; } char *myGetToken(char *buff, MYBYTE index) { @@ -3494,7 +3743,7 @@ char *myTrim(char *target, char *source) { return target; } -void mySplit(char *name, char *value, char *source, char splitChar) { +void mySplit(char *name, char *value, const char *source, char splitChar) { int i = 0; int j = 0; int k = 0; @@ -3518,6 +3767,7 @@ void mySplit(char *name, char *value, char *source, char splitChar) { //printf("%s %s\n", name, value); } +#if 0 MYDWORD getClassNetwork(MYDWORD ip) { data15 data; data.ip = ip; @@ -3531,7 +3781,7 @@ MYDWORD getClassNetwork(MYDWORD ip) { return data.ip; } - +#endif /* char *IP2Auth(MYDWORD ip) { @@ -3551,7 +3801,7 @@ return tempbuff; */ char *IP2String(char *target, MYDWORD ip) { - data15 inaddr; + data15 inaddr {}; inaddr.ip = ip; sprintf(target, "%u.%u.%u.%u", inaddr.octate[0], inaddr.octate[1], inaddr.octate[2], inaddr.octate[3]); //MYBYTE *octate = (MYBYTE*)&ip; @@ -3580,7 +3830,7 @@ MYDWORD *findServer(MYDWORD *array, MYBYTE kount, MYDWORD ip) { return &(array[i]); } } - return 0; + return nullptr; } bool isInt(char *str) { @@ -3783,7 +4033,7 @@ MYBYTE fromUUE(MYBYTE *target, char *source) } */ -char *hex2String(char *target, MYBYTE *hex, MYBYTE bytes) { +char *hex2String(char *target, const MYBYTE *hex, MYBYTE bytes) { char *dp = target; if (bytes) @@ -3797,7 +4047,7 @@ char *hex2String(char *target, MYBYTE *hex, MYBYTE bytes) { return target; } -char *genHostName(char *target, MYBYTE *hex, MYBYTE bytes) { +char *genHostName(char *target, const MYBYTE *hex, MYBYTE bytes) { char *dp = target; if (bytes) @@ -3832,6 +4082,7 @@ char *IP62String(char *target, MYBYTE *source) } */ +#if 0 char *IP62String(char *target, MYBYTE *source) { char *dp = target; bool zerostarted = false; @@ -3867,6 +4118,7 @@ char *IP62String(char *target, MYBYTE *source) { return target; } +#endif char *getHexValue(MYBYTE *target, char *source, MYBYTE *size) { if (*size) @@ -3914,7 +4166,7 @@ char *getHexValue(MYBYTE *target, char *source, MYBYTE *size) { if (*source) return source; - return NULL; + return nullptr; } char *myUpper(char *string) { @@ -3922,7 +4174,7 @@ char *myUpper(char *string) { MYWORD len = strlen(string); for (int i = 0; i < len; i++) if (string[i] >= 'a' && string[i] <= 'z') - string[i] -= diff; + string[i] = (char)(string[i] - diff); return string; } @@ -3931,15 +4183,16 @@ char *myLower(char *string) { MYWORD len = strlen(string); for (int i = 0; i < len; i++) if (string[i] >= 'A' && string[i] <= 'Z') - string[i] += diff; + string[i] = (char)(string[i] - diff); return string; } +#if 0 bool wildcmp(char *string, char *wild) { // Written by Jack Handy - jakkhandy@hotmail.com // slightly modified - char *cp = NULL; - char *mp = NULL; + char *cp = nullptr; + char *mp = nullptr; while ((*string) && (*wild != '*')) { if ((*wild != *string) && (*wild != '?')) { @@ -3970,11 +4223,12 @@ bool wildcmp(char *string, char *wild) { return !(*wild); } +#endif /* void checkSize() { - data7 *dhcpEntry = NULL; + data7 *dhcpEntry = nullptr; //printf("checksize dhcpdhcpEntry[%d]=%d dhcpAge[%d]=%d\n", currentInd, dhcpdhcpEntry.size(), currentInd, dhcpAge.size()); expiryMap::iterator p = dhcpAge.begin(); @@ -4013,8 +4267,8 @@ void checkSize() void *updateStateFile(void *lpParam) { pthread_mutex_lock(&mutStateFile); - data7 *dhcpEntry = (data7 *)lpParam; - data8 dhcpData; + auto *dhcpEntry = (data7 *)lpParam; + data8 dhcpData {}; memset(&dhcpData, 0, sizeof(data8)); MYBYTE bp_hlen = 16; getHexValue(dhcpData.bp_chaddr, dhcpEntry->mapname, &bp_hlen); @@ -4034,14 +4288,14 @@ void *updateStateFile(void *lpParam) { FILE *f = fopen(leaFile, "rb+"); if (f) { - if (fseek(f, (dhcpData.dhcpInd - 1) * sizeof(data8), SEEK_SET) >= 0) + if (fseek(f, (long)((dhcpData.dhcpInd - 1) * sizeof(data8)), SEEK_SET) >= 0) fwrite(&dhcpData, sizeof(data8), 1, f); fclose(f); } pthread_mutex_unlock(&mutStateFile); - pthread_exit(NULL); + pthread_exit(nullptr); } void calcRangeLimits(MYDWORD ip, MYDWORD mask, MYDWORD *rangeStart, MYDWORD *rangeEnd) { @@ -4052,10 +4306,10 @@ void calcRangeLimits(MYDWORD ip, MYDWORD mask, MYDWORD *rangeStart, MYDWORD *ran data7 *findDHCPEntry(char *key) { //printf("finding %u=%s\n",ind,key); myLower(key); - dhcpMap::iterator it = dhcpCache.find(key); + auto it = dhcpCache.find(key); if (it == dhcpCache.end()) - return NULL; + return nullptr; else return it->second; } @@ -4073,6 +4327,7 @@ bool checkMask(MYDWORD mask) { return true; } +#if 0 MYDWORD calcMask(MYDWORD rangeStart, MYDWORD rangeEnd) { data15 ip1, ip2, mask; @@ -4105,10 +4360,11 @@ MYDWORD calcMask(MYDWORD rangeStart, MYDWORD rangeEnd) { } return mask.ip; } +#endif char *cloneString(char *string) { if (!string) - return NULL; + return nullptr; char *s = (char *)calloc(1, strlen(string) + 1); @@ -4124,9 +4380,9 @@ void *init(void *lparam) { char raw[512]; char name[512]; char value[512]; - FILE *f = NULL; + FILE *f = nullptr; - if (f = openSection("LOGGING", 1)) { + if ((f = openSection("LOGGING", 1))) { cfig.dhcpLogLevel = 1; tempbuff[0] = 0; @@ -4177,7 +4433,7 @@ void *init(void *lparam) { logDHCPMess(logBuff, 1); - if (f = openSection("LISTEN_ON", 1)) { + if ((f = openSection("LISTEN_ON", 1))) { while (readSection(raw, f)) { if (isIP(raw)) { MYDWORD addr = inet_addr(raw); @@ -4228,7 +4484,7 @@ void *init(void *lparam) { getInterfaces(&newNetwork); memcpy(cfig.oldservers, newNetwork.staticServers, (MAX_SERVERS * sizeof(MYDWORD))); - if (f = openSection("REPLICATION_SERVERS", 1)) { + if ((f = openSection("REPLICATION_SERVERS", 1))) { while (readSection(raw, f)) { mySplit(name, value, raw, '='); @@ -4309,7 +4565,7 @@ void *init(void *lparam) { cfig.dhcpReplConn.loaded = true; cfig.dhcpReplConn.ready = true; - data3 op; + data3 op {}; memset(&token, 0, sizeof(data9)); token.vp = token.dhcpp.vend_data; token.messsize = sizeof(dhcp_packet); @@ -4333,7 +4589,7 @@ void *init(void *lparam) { token.vp[0] = DHCP_OPTION_END; token.vp++; - token.bytes = token.vp - (MYBYTE *)token.raw; + token.bytes = (int)(token.vp - (MYBYTE *)token.raw); token.remote.sin_port = htons(IPPORT_DHCPS); token.remote.sin_family = AF_INET; @@ -4348,7 +4604,7 @@ void *init(void *lparam) { pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - int errcode = pthread_create(&threadId, &attr, sendToken, 0); + int errcode = pthread_create(&threadId, &attr, sendToken, nullptr); pthread_attr_destroy(&attr); } } @@ -4473,9 +4729,8 @@ void *init(void *lparam) { SO_BROADCAST, (char *)&newNetwork.dhcpConn[i].broadCastVal, newNetwork.dhcpConn[i].broadCastSize); - int nRet = bind(newNetwork.dhcpConn[i].sock, - (sockaddr *)&newNetwork.dhcpConn[i].addr, - sizeof(struct sockaddr_in)); + int nRet = bind( + newNetwork.dhcpConn[i].sock, (sockaddr *)&newNetwork.dhcpConn[i].addr, sizeof(struct sockaddr_in)); if (nRet == SOCKET_ERROR) { close(newNetwork.dhcpConn[i].sock); @@ -4553,7 +4808,7 @@ void *init(void *lparam) { newNetwork.httpConn.server = newNetwork.dhcpConn[0].server; newNetwork.httpConn.loaded = true; - if (f = openSection("HTTP_INTERFACE", 1)) { + if ((f = openSection("HTTP_INTERFACE", 1))) { while (readSection(raw, f)) { mySplit(name, value, raw, '='); @@ -4570,8 +4825,8 @@ void *init(void *lparam) { } if (value[0]) { - if (atoi(value)) - newNetwork.httpConn.port = atoi(value); + if (STR2INT(value)) + newNetwork.httpConn.port = STR2INT(value); else { newNetwork.httpConn.loaded = false; sprintf(logBuff, "Warning: Section [HTTP_INTERFACE], Invalid port %s, ignored", value); @@ -4627,8 +4882,8 @@ void *init(void *lparam) { newNetwork.httpConn.addr.sin_addr.s_addr = newNetwork.httpConn.server; newNetwork.httpConn.addr.sin_port = htons(newNetwork.httpConn.port); - int nRet = - bind(newNetwork.httpConn.sock, (sockaddr *)&newNetwork.httpConn.addr, sizeof(struct sockaddr_in)); + int nRet = bind( + newNetwork.httpConn.sock, (sockaddr *)&newNetwork.httpConn.addr, sizeof(struct sockaddr_in)); if (nRet == SOCKET_ERROR) { bindfailed = true; @@ -4689,10 +4944,10 @@ void *init(void *lparam) { logDHCPMess(logBuff, 1); } - for (int i = 0; i < MAX_SERVERS && network.allServers[i]; i++) { - for (MYBYTE j = 0; j < MAX_SERVERS; j++) { - if (network.dhcpConn[j].server == network.allServers[i]) { - sprintf(logBuff, "Listening On: %s", IP2String(tempbuff, network.allServers[i])); + for (int k = 0; k < MAX_SERVERS && network.allServers[k]; k++) { + for (auto &j : network.dhcpConn) { + if (j.server == network.allServers[k]) { + sprintf(logBuff, "Listening On: %s", IP2String(tempbuff, network.allServers[k])); logDHCPMess(logBuff, 1); break; } @@ -4703,7 +4958,7 @@ void *init(void *lparam) { } while (detectChange()); - pthread_exit(NULL); + pthread_exit(nullptr); } bool detectChange() { @@ -4716,7 +4971,7 @@ bool detectChange() { getInterfaces(&newNetwork); - if (memcmp(cfig.oldservers, newNetwork.staticServers, (MAX_SERVERS * sizeof(MYDWORD)))) { + if (memcmp(cfig.oldservers, newNetwork.staticServers, (MAX_SERVERS * sizeof(MYDWORD))) != 0) { memcpy(cfig.oldservers, newNetwork.staticServers, (MAX_SERVERS * sizeof(MYDWORD))); sprintf(logBuff, "Network changed, re-detecting Listening Interfaces.."); logDHCPMess(logBuff, 1); @@ -4743,8 +4998,8 @@ bool detectChange() { return (kRunning); } -void getInterfaces(data1 *network) { - memset(network, 0, sizeof(data1)); +void getInterfaces(data1 *pNetwork) { + memset(pNetwork, 0, sizeof(data1)); Ifc.ifc_len = sizeof(IfcBuf); Ifc.ifc_buf = (char *)IfcBuf; @@ -4753,7 +5008,7 @@ void getInterfaces(data1 *network) { MYDWORD addr, mask; short flags; - struct ifreq pIfr; + struct ifreq pIfr {}; MYBYTE numInterfaces = Ifc.ifc_len / sizeof(ifreq); for (MYBYTE i = 0; i < numInterfaces; i++) { @@ -4776,13 +5031,13 @@ void getInterfaces(data1 *network) { if (addr && mask && (flags & IFF_RUNNING) && (flags & IFF_UP) && !(flags & IFF_LOOPBACK) && !(flags & IFF_POINTOPOINT)) { - MYBYTE k = addServer(network->allServers, MAX_SERVERS, addr); + MYBYTE k = addServer(pNetwork->allServers, MAX_SERVERS, addr); if (k != MAX_SERVERS) - network->allMasks[k] = mask; + pNetwork->allMasks[k] = mask; if (!(flags & IFF_DYNAMIC)) - addServer(network->staticServers, MAX_SERVERS, addr); + addServer(pNetwork->staticServers, MAX_SERVERS, addr); } } } @@ -4809,15 +5064,6 @@ void getInterfaces(data1 *network) { strcpy(cfig.zone, "workgroup"); cfig.zLen = strlen(cfig.zone); } - - return; -} - -MYDWORD inet_addr(char *str) { - if (str == NULL) - return INADDR_ANY; - else - return inet_addr(str); } MYWORD gdmess(data9 *req, MYBYTE sockInd) { @@ -4839,7 +5085,7 @@ MYWORD gdmess(data9 *req, MYBYTE sockInd) { req->msg.msg_flags = msgflags; int flags = 0; - req->bytes = recvmsg(network.dhcpListener.sock, &req->msg, flags); + req->bytes = (int)recvmsg(network.dhcpListener.sock, &req->msg, flags); if (errno || req->bytes <= 0) return 0; @@ -4876,12 +5122,8 @@ MYWORD gdmess(data9 *req, MYBYTE sockInd) { req->sockInd = sockInd; req->sockLen = sizeof(req->remote); errno = 0; - req->bytes = recvfrom(network.dhcpConn[sockInd].sock, - req->raw, - sizeof(dhcp_packet), - 0, - (sockaddr *)&req->remote, - &req->sockLen); + req->bytes = (int)recvfrom( + network.dhcpConn[sockInd].sock, req->raw, sizeof(dhcp_packet), 0, (sockaddr *)&req->remote, &req->sockLen); if (errno || req->bytes <= 0) return 0; @@ -5053,9 +5295,9 @@ MYWORD gdmess(data9 *req, MYBYTE sockInd) { } void debug(const char *mess) { - char t[254]; - strcpy(t, mess); - logDHCPMess(t, 1); + char tmp[254]; + strcpy(tmp, mess); + logDHCPMess(tmp, 1); } void *logThread(void *lpParam) { @@ -5065,7 +5307,7 @@ void *logThread(void *lpParam) { char buffer[256]; strftime(buffer, sizeof(buffer), logFile, ttm); - if (strcmp(cfig.logFileName, buffer)) { + if (strcmp(cfig.logFileName, buffer) != 0) { if (cfig.logFileName[0]) { FILE *f = fopen(cfig.logFileName, "at"); @@ -5102,7 +5344,7 @@ void *logThread(void *lpParam) { free(mess); pthread_mutex_unlock(&mutLogFile); - pthread_exit(NULL); + pthread_exit(nullptr); } void logDHCPMess(char *logBuff, MYBYTE logLevel) { @@ -5120,30 +5362,30 @@ void logDHCPMess(char *logBuff, MYBYTE logLevel) { } } -data7 *createCache(data71 *lump) { - MYWORD dataSize = 70 + sizeof(data7) + strlen(lump->mapname) + lump->optionSize; - data7 *cache = (data7 *)calloc(1, dataSize); +data7 *createCache(data71 *pLump) { + MYWORD dataSize = 70 + sizeof(data7) + strlen(pLump->mapname) + pLump->optionSize; + auto *cache = (data7 *)calloc(1, dataSize); if (!cache) - return NULL; + return nullptr; MYBYTE *dp = &cache->data; cache->mapname = (char *)dp; - strcpy(cache->mapname, lump->mapname); + strcpy(cache->mapname, pLump->mapname); dp += strlen(cache->mapname); dp++; cache->hostname = (char *)dp; - if (lump->hostname) - strcpy(cache->hostname, lump->hostname); + if (pLump->hostname) + strcpy(cache->hostname, pLump->hostname); dp += 65; - if (lump->optionSize >= 3) { + if (pLump->optionSize >= 3) { cache->options = dp; - memcpy(cache->options, lump->options, lump->optionSize); + memcpy(cache->options, pLump->options, pLump->optionSize); } else - cache->options = NULL; + cache->options = nullptr; return cache; } diff --git a/srcs/open_dhcp/opendhcpd.h b/srcs/open_dhcp/opendhcpd.h index fb5b4cc..eaeab26 100644 --- a/srcs/open_dhcp/opendhcpd.h +++ b/srcs/open_dhcp/opendhcpd.h @@ -575,13 +575,13 @@ MYBYTE pIP(void*, MYDWORD); MYBYTE pUInt(void*, MYDWORD); MYBYTE pUShort(void*, MYWORD); MYBYTE addServer(MYDWORD*, MYBYTE, MYDWORD); -char getRangeInd(MYDWORD); +int getRangeInd(MYDWORD); char* myTrim(char*, char*); char* myGetToken(char*, MYBYTE); char* cloneString(char*); char* getHexValue(MYBYTE*, char*, MYBYTE*); -char* genHostName(char*, MYBYTE*, MYBYTE); -char* hex2String(char*, MYBYTE*, MYBYTE); +char* genHostName(char*, const MYBYTE*, MYBYTE); +char* hex2String(char*, const MYBYTE*, MYBYTE); char* IP2String(char*, MYDWORD); char* IP2arpa(char*, MYDWORD); char* IP62String(char*, MYBYTE*); @@ -589,7 +589,7 @@ char* myUpper(char* string); char* myLower(char* string); char* readSection(char*, FILE*); data7* findDHCPEntry(char*); -data7 *createCache(data71 *lump); +data7 *createCache(data71 *pLump); MYDWORD alad(data9*); MYDWORD calcMask(MYDWORD, MYDWORD); MYDWORD chaddr(data9*); @@ -614,8 +614,8 @@ void *init(void*); void lockOptions(FILE*); void loadOptions(FILE*, const char*, data20*); void logDHCPMess(char*, MYBYTE); -void mySplit(char*, char*, char*, char); -void *sendHTTP(void*); +void mySplit(char*, char*, const char*, char); +void *sendHTTP(void *lpParam); void procHTTP(data19*); void pvdata(data9*, data3*); void recvRepl(data9*);