Esempio n. 1
0
/* 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, "===============================");
}
Esempio n. 2
0
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*/;
}
Esempio n. 3
0
/* 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, "===============================");
}
Esempio n. 4
0
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;
}