1871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline/*
2871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * Copyright (C) 2016 The Android Open Source Project
3871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline *
4871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * Licensed under the Apache License, Version 2.0 (the "License");
5871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * you may not use this file except in compliance with the License.
6871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * You may obtain a copy of the License at
7871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline *
8871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline *      http://www.apache.org/licenses/LICENSE-2.0
9871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline *
10871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * Unless required by applicable law or agreed to in writing, software
11871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * distributed under the License is distributed on an "AS IS" BASIS,
12871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * See the License for the specific language governing permissions and
14871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline * limitations under the License.
15871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline */
16871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
17871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
18871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <arpa/inet.h>
19871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <errno.h>
20871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <netdb.h>
21871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <netinet/in.h>
22871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <string.h>
23871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <sys/socket.h>
24871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
25871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <iostream>
26871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <string>
27871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
28871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include <android/multinetwork.h>
29871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline#include "common.h"
30871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
31871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
32871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Klineint main(int argc, const char* argv[]) {
33871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    int rval = -1;
34871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
35871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    struct Arguments args;
36871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    if (!args.parseArguments(argc, argv)) { return rval; }
37871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
38871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    const struct addrinfo hints = {
39871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            .ai_family = args.family,
40871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            .ai_socktype = SOCK_DGRAM,
41871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    };
42871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    struct addrinfo *result = nullptr;
43871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
44871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    std::cout << "# " << args.arg1
45871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline              << " (via nethandle " << args.nethandle << "):"
46871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline              << std::endl;
47871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
48871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    switch (args.api_mode) {
49871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline        case ApiMode::EXPLICIT:
50871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            rval = android_getaddrinfofornetwork(args.nethandle,
51871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                    args.arg1, nullptr, &hints, &result);
52871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            break;
53871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline        case ApiMode::PROCESS:
54871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            if (args.nethandle != NETWORK_UNSPECIFIED) {
55871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                rval = android_setprocnetwork(args.nethandle);
56871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                if (rval != 0) {
57871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                    std::cerr << "android_setprocnetwork returned " << rval
58871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                              << std::endl;
59871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                    return rval;
60871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                }
61871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            }
62871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            rval = getaddrinfo(args.arg1, nullptr, &hints, &result);
63871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            break;
64871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline        default:
65871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            // Unreachable.
66871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            std::cerr << "Unknown api mode." << std::endl;
67871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline            return -1;
68871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    }
69871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
70871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    if (rval != 0) {
71871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline        std::cerr << "DNS resolution failure; gaierror=" << rval
72871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                  << " [" << gai_strerror(rval) << "]"
73871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline                  << std::endl;
74871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline        return rval;
75871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    }
76871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
77871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    for (struct addrinfo* rp = result; rp != nullptr; rp = rp->ai_next) {
78871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline        std::cout << inetSockaddrToString(rp->ai_addr) << std::endl;
79871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    }
80871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline
81871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    freeaddrinfo(result);
82871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline    return 0;
83871e63d9b7e584bc398dd4aa983cf561a5e8394eErik Kline}
84