/* Try SOCK_htonl(), SOCK_gethostbyname() and SOCK_gethostbyaddr() */ static void TEST_gethostby(void) { CORE_LOG(eLOG_Note, "==============================="); assert( SOCK_HostToNetLong(0) == 0 ); assert( SOCK_HostToNetLong(0xFFFFFFFF) == 0xFFFFFFFF ); assert( !TEST_gethostbyname(" ") ); assert( !TEST_gethostbyname("a1....b1") ); assert( !TEST_gethostbyname("boo.foo.bar.doo") ); (void) TEST_gethostbyname("localhost"); (void) TEST_gethostbyname("ncbi.nlm.nih.gov"); (void) TEST_gethostbyname("127.0.0.1"); (void) TEST_gethostbyname("130.14.25.1"); (void) TEST_gethostbyaddr(0); (void) TEST_gethostbyaddr(SOCK_gethostbyname("127.0.0.1")); (void) TEST_gethostbyaddr(SOCK_gethostbyname("130.14.25.1")); (void) TEST_gethostbyaddr(SOCK_gethostbyname("234.234.234.234")); (void) TEST_gethostbyaddr(0xFFFFFFFF); CORE_LOG(eLOG_Note, "==============================="); }
static int/*bool*/ s_ParseHeader(const char* header, void* data, int server_error) { static const char kStateless[] = "TRY_STATELESS"; static const size_t klen = sizeof(kStateless) - 1; SServiceConnector* uuu = (SServiceConnector*) data; SERV_Update(uuu->iter, header, server_error); if (server_error) return 1/*parsed okay*/; while (header && *header) { if (strncasecmp(header, HTTP_CONNECTION_INFO, sizeof(HTTP_CONNECTION_INFO) - 1) == 0) { unsigned int i1, i2, i3, i4, ticket; unsigned char o1, o2, o3, o4; char ipaddr[40]; if (uuu->host) break/*failed - duplicate connection info*/; header += sizeof(HTTP_CONNECTION_INFO) - 1; while (*header && isspace((unsigned char)(*header))) header++; if (strncasecmp(header, kStateless, klen) == 0 && (!header[klen] || isspace((unsigned char) header[klen]))) { /* Special keyword for switching into stateless mode */ uuu->host = (unsigned int)(-1); #if defined(_DEBUG) && !defined(NDEBUG) if (uuu->net_info->debug_printout) { CORE_LOGF_X(2, eLOG_Note, ("[%s] Fallback to stateless", uuu->service)); } #endif /*_DEBUG && !NDEBUG*/ } else { int n; if (sscanf(header, "%u.%u.%u.%u %hu %x%n", &i1, &i2, &i3, &i4, &uuu->port, &ticket, &n) < 6 || (header[n] && !isspace((unsigned char) header[n]))) { break/*failed - unreadable connection info*/; } o1 = i1; o2 = i2; o3 = i3; o4 = i4; sprintf(ipaddr, "%u.%u.%u.%u", o1, o2, o3, o4); if (!(uuu->host = SOCK_gethostbyname(ipaddr)) || !uuu->port) break/*failed - bad host:port in connection info*/; uuu->ticket = SOCK_HostToNetLong(ticket); } } if ((header = strchr(header, '\n')) != 0) header++; } if (!header || !*header) return 1/*success*/; uuu->host = 0; return 0/*failure*/; }
/* Try SOCK_isip() */ static void TEST_SOCK_isip(void) { CORE_LOG(eLOG_Note, "==============================="); assert(TEST_isip("0") && TEST_isip("0.0.0.0")); assert(TEST_gethostbyname("0") == 0); assert(TEST_isip("1")); assert(TEST_gethostbyname("1") == SOCK_HostToNetLong(1)); assert(TEST_isip("0x7F000002")); assert(TEST_gethostbyname("0x7F000002") == TEST_gethostbyname("127.0.0.2")); assert(TEST_isip("127.234")); assert(TEST_gethostbyname("127.234") == TEST_gethostbyname("127.0.0.234")); assert(TEST_isip("127.16777215")); assert(TEST_gethostbyname("127.16777215") == TEST_gethostbyname("127.255.255.255")); assert(TEST_isip("127.234.0x345")); assert(TEST_gethostbyname("127.234.3.69") == TEST_gethostbyname("127.234.3.69")); assert(TEST_isip("127.234.0xFFFF")); assert(TEST_gethostbyname("127.234.0xFFFF") == TEST_gethostbyname("127.234.255.255")); assert(TEST_isip("127.012344321")); assert(TEST_gethostbyname("127.012344321") == TEST_gethostbyname("127.41.200.209")); assert(TEST_isip("127.077777777")); assert(TEST_gethostbyname("127.077777777") == TEST_gethostbyname("127.255.255.255")); assert(TEST_isip("0.0321.0xAB.123")); assert(TEST_isip("255.255.255.255")); assert(!TEST_isip("a")); assert(!TEST_isip("-1")); assert(!TEST_isip("1.2.3a")); assert(!TEST_isip("1.0xDEATH")); assert(!TEST_isip("1.2.3.256")); assert(!TEST_isip("1.2.0200000")); assert(!TEST_isip("1.1.1.1.")); assert(!TEST_isip("1.1.-1.1")); assert(!TEST_isip("1.0x100.1.1")); assert(!TEST_isip("1.0100000000")); assert(!TEST_isip("0x100000000")); CORE_LOG(eLOG_Note, "==============================="); }
static CONNECTOR s_Init (SOCK sock, const char* host, unsigned short port, unsigned short try_own, const void* init_data, size_t init_size, TSOCK_Flags flags) { CONNECTOR ccc; SSockConnector* xxx; /* some sanity checks */ assert(!sock || !(init_size || init_data || flags)); assert(!init_size || init_data); if (!(ccc = (SConnector*) malloc(sizeof(SConnector)))) return 0; if (!(xxx = (SSockConnector*) malloc(sizeof(*xxx) + (init_data ? init_size : 0) + (host ? strlen(host) + 1 : MAX_IP_ADDR_LEN)))) { free(ccc); return 0; } /* initialize internal data structures */ if (sock || !host || !port) { xxx->sock = sock; xxx->init_size = 0; xxx->init_data = 0; if (host) { xxx->host = strcpy((char*) xxx + sizeof(*xxx), host); xxx->port = 0; } else if (sock) { unsigned int x_host; char* addr = (char*) xxx + sizeof(*xxx); SOCK_GetPeerAddress(sock, &x_host, &xxx->port, eNH_HostByteOrder); SOCK_ntoa(SOCK_HostToNetLong(x_host), addr, MAX_IP_ADDR_LEN); xxx->host = addr; assert(xxx->port); } else { /* this signifies invalid state */ xxx->host = 0; xxx->port = 0; } xxx->try_own = try_own ? 1 : 0; } else { void* data = (char*) xxx + sizeof(*xxx); xxx->sock = 0; xxx->init_size = init_data ? init_size : 0; xxx->init_data = memcpy(data, init_data, xxx->init_size); xxx->host = strcpy((char*) data + xxx->init_size, host); xxx->port = port; xxx->try_own = try_own ? try_own : 1; xxx->flags = flags; } /* initialize connector data */ ccc->handle = xxx; ccc->next = 0; ccc->meta = 0; ccc->setup = s_Setup; ccc->destroy = s_Destroy; return ccc; }