bool Host::isBlacklisted(Database db) { string query = "SELECT 1 FROM blacklisted_hosts WHERE host = '" + getIPv4Address() + "'"; if(db.getNumOfResults(query) > 0) { return 1; } else { return 0; } }
int main(int argc, char** argv) { validateAndPopulateConfigurationItems(); localIPv4Address = getIPv4Address(); controlSocket = createNetworkChannelReceiver(localPort); printf( "Bootstrapping name server...\r\nCreated control channel for %s:%s\r\n", localIPv4Address, localPort); nsList = readNSInfo(); nsId = DArray_count(nsList); nsCount = nsId; int pos = checkNSExists(nsList, localIPv4Address, localPort); if (pos == -1) { writeNSInfo(localIPv4Address, localPort, nsId); } NodeAddress *ownAddress = malloc(sizeof(NodeAddress)); ownAddress->ip = malloc(sizeof(char) * 20); strcpy(ownAddress->ip, localIPv4Address); ownAddress->portNumber = malloc(sizeof(char) * 20); strcpy(ownAddress->portNumber, localPort); addNSToList(ownAddress); loopOnNeighbouringNSToRegister(); fsList = DArray_create(sizeof(NodeAddress), 100); serviceRequestLoop(); return 0; }
bool Host::addToBlacklist(Database db) { string query = "INSERT INTO blacklisted_hosts(host, created_at, updated_at) " "VALUES('" + getIPv4Address() + "', NOW(), NOW())"; return db.setQuery(db.getHandle(), query); }
/** Create a receive socket for a network interface @param networkInterface The network interface object. This function expects it to be filled with all information, except for the socket descriptor. @param rxSocketHandlerFunction The function that handles reception of data on the network interface @param rxMcAddr The receive multicast address @return - the socket descriptor (>= 0) - -1 if an error occurred */ static int createRxSocket(TRxTxNetworkInterface * networkInterface, socket_handler_func rxSocketHandlerFunction, union olsr_sockaddr * rxMcAddr) { int ipFamilySetting; int ipProtoSetting; int ipMcLoopSetting; int ipAddMembershipSetting; union olsr_sockaddr address; void * addr; size_t addrSize; int rxSocket = -1; int socketReuseFlagValue = 1; int mcLoopValue = 1; assert(networkInterface != NULL); assert(rxSocketHandlerFunction != NULL); assert(strncmp((char *) &networkInterface->name[0], "", sizeof(networkInterface->name)) != 0); memset(&address, 0, sizeof(address)); if (rxMcAddr->in.sa_family == AF_INET) { assert(rxMcAddr->in4.sin_addr.s_addr != INADDR_ANY); ipFamilySetting = AF_INET; ipProtoSetting = IPPROTO_IP; ipMcLoopSetting = IP_MULTICAST_LOOP; ipAddMembershipSetting = IP_ADD_MEMBERSHIP; address.in4.sin_family = ipFamilySetting; address.in4.sin_addr.s_addr = INADDR_ANY; address.in4.sin_port = getRxMcPort(); addr = &address.in4; addrSize = sizeof(struct sockaddr_in); } else { assert(rxMcAddr->in6.sin6_addr.s6_addr != in6addr_any.s6_addr); ipFamilySetting = AF_INET6; ipProtoSetting = IPPROTO_IPV6; ipMcLoopSetting = IPV6_MULTICAST_LOOP; ipAddMembershipSetting = IPV6_ADD_MEMBERSHIP; address.in6.sin6_family = ipFamilySetting; address.in6.sin6_addr = in6addr_any; address.in6.sin6_port = getRxMcPort(); addr = &address.in6; addrSize = sizeof(struct sockaddr_in6); } /* Create a datagram socket on which to receive. */ errno = 0; rxSocket = socket(ipFamilySetting, SOCK_DGRAM, 0); if (rxSocket < 0) { pudError(true, "Could not create a receive socket for interface %s", networkInterface->name); goto bail; } /* Enable SO_REUSEADDR to allow multiple applications to receive the same * multicast messages */ errno = 0; if (setsockopt(rxSocket, SOL_SOCKET, SO_REUSEADDR, &socketReuseFlagValue, sizeof(socketReuseFlagValue)) < 0) { pudError(true, "Could not set the reuse flag on the receive socket for" " interface %s", networkInterface->name); goto bail; } /* Bind to the proper port number with the IP address INADDR_ANY * (INADDR_ANY is really required here, do not change it) */ errno = 0; if (bind(rxSocket, addr, addrSize) < 0) { pudError(true, "Could not bind the receive socket for interface" " %s to port %u", networkInterface->name, ntohs(getRxMcPort())); goto bail; } /* Enable multicast local loopback */ errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipMcLoopSetting, &mcLoopValue, sizeof(mcLoopValue)) < 0) { pudError(true, "Could not enable multicast loopback on the" " receive socket for interface %s", networkInterface->name); goto bail; } /* Join the multicast group on the local interface. Note that this * ADD_MEMBERSHIP option must be called for each local interface over * which the multicast datagrams are to be received. */ if (ipFamilySetting == AF_INET) { struct ip_mreq mc_settings; struct ifreq ifr; struct in_addr * ifAddr = getIPv4Address(networkInterface->name, &ifr); if (!ifAddr) { pudError(true, "Could not get interface address of %s", networkInterface->name); goto bail; } (void) memset(&mc_settings, 0, sizeof(mc_settings)); mc_settings.imr_multiaddr = rxMcAddr->in4.sin_addr; mc_settings.imr_interface = *ifAddr; errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipAddMembershipSetting, &mc_settings, sizeof(mc_settings)) < 0) { pudError(true, "Could not subscribe interface %s to the configured" " multicast group", networkInterface->name); goto bail; } } else { struct ipv6_mreq mc6_settings; (void) memset(&mc6_settings, 0, sizeof(mc6_settings)); mc6_settings.ipv6mr_multiaddr = rxMcAddr->in6.sin6_addr; mc6_settings.ipv6mr_interface = if_nametoindex(networkInterface->name); errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipAddMembershipSetting, &mc6_settings, sizeof(mc6_settings)) < 0) { pudError(true, "Could not subscribe interface %s to the configured" " multicast group", networkInterface->name); goto bail; } } add_olsr_socket(rxSocket, rxSocketHandlerFunction, NULL, networkInterface, SP_PR_READ); return rxSocket; bail: if (rxSocket >= 0) { close(rxSocket); } return -1; }
/** Create a transmit socket for a network interface @param networkInterface The network interface object. This function expects it to be filled with all information, except for the socket descriptor. @param txMcAddr The transmit multicast address @return - the socket descriptor (>= 0) - -1 if an error occurred */ static int createTxSocket(TRxTxNetworkInterface * networkInterface, union olsr_sockaddr * txMcAddr) { int ipFamilySetting; int ipProtoSetting; int ipMcLoopSetting; int ipMcIfSetting; int ipTtlSetting; unsigned int ifIndex; union olsr_sockaddr address; void * addr; size_t addrSize; int txSocket = -1; int mcLoopValue = 1; int txTtl = getTxTtl(); assert(networkInterface != NULL); assert(strncmp((char *) &networkInterface->name[0], "", sizeof(networkInterface->name)) != 0); memset(&address, 0, sizeof(address)); if (txMcAddr->in.sa_family == AF_INET) { struct ifreq ifr; struct in_addr * ifAddr = getIPv4Address(networkInterface->name, &ifr); if (!ifAddr) { pudError(true, "Could not get interface address of %s", networkInterface->name); goto bail; } assert(txMcAddr->in4.sin_addr.s_addr != INADDR_ANY); ipFamilySetting = AF_INET; ipProtoSetting = IPPROTO_IP; ipMcLoopSetting = IP_MULTICAST_LOOP; ipMcIfSetting = IP_MULTICAST_IF; ipTtlSetting = IP_MULTICAST_TTL; ifIndex = 0; address.in4.sin_family = ipFamilySetting; address.in4.sin_addr = *ifAddr; address.in4.sin_port = getTxMcPort(); addr = &address.in4; addrSize = sizeof(struct sockaddr_in); } else { assert(txMcAddr->in6.sin6_addr.s6_addr != in6addr_any.s6_addr); ipFamilySetting = AF_INET6; ipProtoSetting = IPPROTO_IPV6; ipMcLoopSetting = IPV6_MULTICAST_LOOP; ipMcIfSetting = IPV6_MULTICAST_IF; ipTtlSetting = IPV6_MULTICAST_HOPS; ifIndex = if_nametoindex(networkInterface->name); addr = &ifIndex; addrSize = sizeof(ifIndex); } /* Create a datagram socket on which to transmit */ errno = 0; txSocket = socket(ipFamilySetting, SOCK_DGRAM, 0); if (txSocket < 0) { pudError(true, "Could not create a transmit socket for interface %s", networkInterface->name); goto bail; } /* Bind the socket to the desired interface */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipMcIfSetting, addr, addrSize) < 0) { pudError(true, "Could not set the multicast interface on the" " transmit socket to interface %s", networkInterface->name); goto bail; } /* Disable multicast local loopback */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipMcLoopSetting, &mcLoopValue, sizeof(mcLoopValue)) < 0) { pudError(true, "Could not disable multicast loopback on the" " transmit socket for interface %s", networkInterface->name); goto bail; } /* Set the TTL on the socket */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipTtlSetting, &txTtl, sizeof(txTtl)) < 0) { pudError(true, "Could not set TTL on the transmit socket" " for interface %s", networkInterface->name); goto bail; } /* Set the no delay option on the socket */ errno = 0; if (fcntl(txSocket, F_SETFL, O_NDELAY) < 0) { pudError(true, "Could not set the no delay option on the" " transmit socket for interface %s", networkInterface->name); goto bail; } return txSocket; bail: if (txSocket >= 0) { close(txSocket); } return -1; }