diff --git a/Conf.cpp b/Conf.cpp index 85d243d..f8ece94 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -237,19 +237,29 @@ bool CConf::read() continue; } - char* key = ::strtok(buffer, " \t=\r\n"); - if (key == NULL) - continue; + char* key = ::strtok(buffer, " \t=\r\n"); + if (key == NULL) + continue; - char* value = ::strtok(NULL, "\r\n"); - if (value == NULL) - continue; + char* value = ::strtok(NULL, "\r\n"); + if (value == NULL) + continue; // Remove quotes from the value size_t len = ::strlen(value); if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; + } else { + char *p; + + // if value is not quoted, remove after # (to make comment) + if ((p = strchr(value, '#')) != NULL) + *p = '\0'; + + // remove trailing tab/space + for (p = value + strlen(value) - 1U; p >= value && (*p == '\t' || *p == ' '); p--) + *p = '\0'; } if (section == SECTION_GENERAL) { diff --git a/MMDVMNetwork.cpp b/MMDVMNetwork.cpp index d65254a..529eba4 100644 --- a/MMDVMNetwork.cpp +++ b/MMDVMNetwork.cpp @@ -89,7 +89,7 @@ bool CMMDVMNetwork::open() { LogMessage("MMDVM Network, Opening"); - return m_socket.open(); + return m_socket.open(m_rptAddress); } bool CMMDVMNetwork::read(CDMRData& data) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 659d816..48e779f 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -96,28 +96,47 @@ int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_ return 0; } -bool CUDPSocket::match(const sockaddr_storage& addr1, const sockaddr_storage& addr2) +bool CUDPSocket::match(const sockaddr_storage& addr1, const sockaddr_storage& addr2, IPMATCHTYPE type) { if (addr1.ss_family != addr2.ss_family) return false; - switch (addr1.ss_family) { - case AF_INET: - struct sockaddr_in *in_1, *in_2; - in_1 = (struct sockaddr_in*)&addr1; - in_2 = (struct sockaddr_in*)&addr2; - return ((in_1->sin_addr.s_addr == in_2->sin_addr.s_addr) && (in_1->sin_port == in_2->sin_port)); - case AF_INET6: - struct sockaddr_in6 *in6_1, *in6_2; - in6_1 = (struct sockaddr_in6*)&addr1; - in6_2 = (struct sockaddr_in6*)&addr2; - return (IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr) && (in6_1->sin6_port == in6_2->sin6_port)); - default: + if (type == IMT_ADDRESS_AND_PORT) { + switch (addr1.ss_family) { + case AF_INET: + struct sockaddr_in *in_1, *in_2; + in_1 = (struct sockaddr_in*)&addr1; + in_2 = (struct sockaddr_in*)&addr2; + return (in_1->sin_addr.s_addr == in_2->sin_addr.s_addr) && (in_1->sin_port == in_2->sin_port); + case AF_INET6: + struct sockaddr_in6 *in6_1, *in6_2; + in6_1 = (struct sockaddr_in6*)&addr1; + in6_2 = (struct sockaddr_in6*)&addr2; + return IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr) && (in6_1->sin6_port == in6_2->sin6_port); + default: + return false; + } + } else if (type == IMT_ADDRESS_ONLY) { + switch (addr1.ss_family) { + case AF_INET: + struct sockaddr_in *in_1, *in_2; + in_1 = (struct sockaddr_in*)&addr1; + in_2 = (struct sockaddr_in*)&addr2; + return in_1->sin_addr.s_addr == in_2->sin_addr.s_addr; + case AF_INET6: + struct sockaddr_in6 *in6_1, *in6_2; + in6_1 = (struct sockaddr_in6*)&addr1; + in6_2 = (struct sockaddr_in6*)&addr2; + return IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr); + default: + return false; + } + } else { return false; } } -bool CUDPSocket::isnone(const sockaddr_storage& addr) +bool CUDPSocket::isNone(const sockaddr_storage& addr) { struct sockaddr_in *in = (struct sockaddr_in *)&addr; @@ -129,14 +148,19 @@ bool CUDPSocket::open() return open(AF_UNSPEC); } -bool CUDPSocket::open(const unsigned int af) +bool CUDPSocket::open(const sockaddr_storage& address) +{ + return open(address.ss_family); +} + +bool CUDPSocket::open(unsigned int af) { sockaddr_storage addr; unsigned int addrlen; struct addrinfo hints; ::memset(&hints, 0, sizeof(hints)); - hints.ai_flags = AI_PASSIVE; + hints.ai_flags = AI_PASSIVE; hints.ai_family = af; /* to determine protocol family, call lookup() first. */ @@ -235,6 +259,7 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storag } address_length = size; + return len; } diff --git a/UDPSocket.h b/UDPSocket.h index 386f059..92daa1f 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -35,6 +35,11 @@ #include #endif +enum IPMATCHTYPE { + IMT_ADDRESS_AND_PORT, + IMT_ADDRESS_ONLY +}; + class CUDPSocket { public: CUDPSocket(const std::string& address, unsigned int port = 0U); @@ -42,7 +47,8 @@ public: ~CUDPSocket(); bool open(); - bool open(const unsigned int af); + bool open(unsigned int af); + bool open(const sockaddr_storage& address); int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length); bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length); @@ -51,8 +57,10 @@ public: static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage& address, unsigned int& address_length); static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage& address, unsigned int& address_length, struct addrinfo& hints); - static bool match(const sockaddr_storage& addr1, const sockaddr_storage& addr2); - static bool isnone(const sockaddr_storage& addr); + + static bool match(const sockaddr_storage& addr1, const sockaddr_storage& addr2, IPMATCHTYPE type = IMT_ADDRESS_AND_PORT); + + static bool isNone(const sockaddr_storage& addr); private: std::string m_address; diff --git a/Version.h b/Version.h index ff2325e..facbd36 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200903"; +const char* VERSION = "20200905"; #endif