1*1285115cSWilliam A. Kennington III /*
2*1285115cSWilliam A. Kennington III  * Copyright 2021 Google LLC
3*1285115cSWilliam A. Kennington III  *
4*1285115cSWilliam A. Kennington III  * Licensed under the Apache License, Version 2.0 (the "License");
5*1285115cSWilliam A. Kennington III  * you may not use this file except in compliance with the License.
6*1285115cSWilliam A. Kennington III  * You may obtain a copy of the License at
7*1285115cSWilliam A. Kennington III  *
8*1285115cSWilliam A. Kennington III  *      http://www.apache.org/licenses/LICENSE-2.0
9*1285115cSWilliam A. Kennington III  *
10*1285115cSWilliam A. Kennington III  * Unless required by applicable law or agreed to in writing, software
11*1285115cSWilliam A. Kennington III  * distributed under the License is distributed on an "AS IS" BASIS,
12*1285115cSWilliam A. Kennington III  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1285115cSWilliam A. Kennington III  * See the License for the specific language governing permissions and
14*1285115cSWilliam A. Kennington III  * limitations under the License.
15*1285115cSWilliam A. Kennington III  */
16*1285115cSWilliam A. Kennington III 
17*1285115cSWilliam A. Kennington III #include <arpa/inet.h>
18*1285115cSWilliam A. Kennington III #include <stdio.h>
19*1285115cSWilliam A. Kennington III 
20*1285115cSWilliam A. Kennington III int main(int argc, char* argv[])
21*1285115cSWilliam A. Kennington III {
22*1285115cSWilliam A. Kennington III     if (argc < 1)
23*1285115cSWilliam A. Kennington III     {
24*1285115cSWilliam A. Kennington III         return 1;
25*1285115cSWilliam A. Kennington III     }
26*1285115cSWilliam A. Kennington III     if (argc != 2)
27*1285115cSWilliam A. Kennington III     {
28*1285115cSWilliam A. Kennington III         fprintf(stderr, "Usage: %s <ip address>\n", argv[0]);
29*1285115cSWilliam A. Kennington III         return 1;
30*1285115cSWilliam A. Kennington III     }
31*1285115cSWilliam A. Kennington III 
32*1285115cSWilliam A. Kennington III     union
33*1285115cSWilliam A. Kennington III     {
34*1285115cSWilliam A. Kennington III         struct in_addr in;
35*1285115cSWilliam A. Kennington III         struct in6_addr in6;
36*1285115cSWilliam A. Kennington III     } buf;
37*1285115cSWilliam A. Kennington III     int af = AF_INET6;
38*1285115cSWilliam A. Kennington III     if (inet_pton(af, argv[1], &buf) != 1)
39*1285115cSWilliam A. Kennington III     {
40*1285115cSWilliam A. Kennington III         af = AF_INET;
41*1285115cSWilliam A. Kennington III         if (inet_pton(af, argv[1], &buf) != 1)
42*1285115cSWilliam A. Kennington III         {
43*1285115cSWilliam A. Kennington III             fprintf(stderr, "Invalid IP Address: %s\n", argv[1]);
44*1285115cSWilliam A. Kennington III             return 2;
45*1285115cSWilliam A. Kennington III         }
46*1285115cSWilliam A. Kennington III     }
47*1285115cSWilliam A. Kennington III 
48*1285115cSWilliam A. Kennington III     char str[INET6_ADDRSTRLEN];
49*1285115cSWilliam A. Kennington III     if (inet_ntop(af, &buf, str, sizeof(str)) == NULL)
50*1285115cSWilliam A. Kennington III     {
51*1285115cSWilliam A. Kennington III         return 1;
52*1285115cSWilliam A. Kennington III     }
53*1285115cSWilliam A. Kennington III 
54*1285115cSWilliam A. Kennington III     printf("%s\n", str);
55*1285115cSWilliam A. Kennington III     return 0;
56*1285115cSWilliam A. Kennington III }
57