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