示例#1
0
int main(int argc, char *argv[]) {
    _cleanup_resolve_query_unref_ sd_resolve_query *q1 = NULL, *q2 = NULL, *q3 = NULL;
    _cleanup_resolve_unref_ sd_resolve *resolve = NULL;
    int r = 0;

    struct addrinfo hints = {
        .ai_family = PF_UNSPEC,
        .ai_socktype = SOCK_STREAM,
        .ai_flags = AI_CANONNAME
    };

    struct sockaddr_in sa = {
        .sin_family = AF_INET,
        .sin_port = htons(80)
    };

    assert_se(sd_resolve_default(&resolve) >= 0);

    /* Make a name -> address query */
    r = sd_resolve_getaddrinfo(resolve, &q1, argc >= 2 ? argv[1] : "www.heise.de", NULL, &hints, getaddrinfo_handler, NULL);
    if (r < 0)
        log_error("sd_resolve_getaddrinfo(): %s\n", strerror(-r));

    /* Make an address -> name query */
    sa.sin_addr.s_addr = inet_addr(argc >= 3 ? argv[2] : "193.99.144.71");
    r = sd_resolve_getnameinfo(resolve, &q2, (struct sockaddr*) &sa, sizeof(sa), 0, SD_RESOLVE_GET_BOTH, getnameinfo_handler, NULL);
    if (r < 0)
        log_error("sd_resolve_getnameinfo(): %s\n", strerror(-r));

    /* Make a res_query() call */
    r = sd_resolve_res_query(resolve, &q3, "_xmpp-client._tcp.gmail.com", C_IN, T_SRV, res_handler, NULL);
    if (r < 0)
        log_error("sd_resolve_res_query(): %s\n", strerror(-r));

    /* Wait until the three queries are completed */
    while (sd_resolve_query_is_done(q1) == 0 ||
            sd_resolve_query_is_done(q2) == 0 ||
            sd_resolve_query_is_done(q3) == 0) {

        r = sd_resolve_wait(resolve, (uint64_t) -1);
        if (r < 0) {
            log_error("sd_resolve_wait(): %s\n", strerror(-r));
            assert_not_reached("sd_resolve_wait() failed");
        }
    }

    return 0;
}
示例#2
0
int main(int argc, char *argv[]) {
        _cleanup_(sd_resolve_query_unrefp) sd_resolve_query *q1 = NULL, *q2 = NULL;
        _cleanup_(sd_resolve_unrefp) sd_resolve *resolve = NULL;
        int r = 0;

        struct addrinfo hints = {
                .ai_family = PF_UNSPEC,
                .ai_socktype = SOCK_STREAM,
                .ai_flags = AI_CANONNAME
        };

        struct sockaddr_in sa = {
                .sin_family = AF_INET,
                .sin_port = htons(80)
        };

        assert_se(sd_resolve_default(&resolve) >= 0);

        /* Test a floating resolver query */
        sd_resolve_getaddrinfo(resolve, NULL, "redhat.com", "http", NULL, getaddrinfo_handler, NULL);

        /* Make a name -> address query */
        r = sd_resolve_getaddrinfo(resolve, &q1, argc >= 2 ? argv[1] : "www.heise.de", NULL, &hints, getaddrinfo_handler, NULL);
        if (r < 0)
                log_error_errno(r, "sd_resolve_getaddrinfo(): %m");

        /* Make an address -> name query */
        sa.sin_addr.s_addr = inet_addr(argc >= 3 ? argv[2] : "193.99.144.71");
        r = sd_resolve_getnameinfo(resolve, &q2, (struct sockaddr*) &sa, sizeof(sa), 0, SD_RESOLVE_GET_BOTH, getnameinfo_handler, NULL);
        if (r < 0)
                log_error_errno(r, "sd_resolve_getnameinfo(): %m");

        /* Wait until the two queries are completed */
        while (sd_resolve_query_is_done(q1) == 0 ||
               sd_resolve_query_is_done(q2) == 0) {

                r = sd_resolve_wait(resolve, (uint64_t) -1);
                if (r < 0) {
                        log_error_errno(r, "sd_resolve_wait(): %m");
                        assert_not_reached("sd_resolve_wait() failed");
                }
        }

        return 0;
}