1 /** @file
2   Translate the port number into a service name
3 
4   Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 **/
13 #include <errno.h>
14 #include <netdb.h>
15 #include <stdio.h>
16 #include <string.h>
17 #include <Uefi.h>
18 #include <unistd.h>
19 
20 #include <arpa/nameser.h>
21 #include <arpa/nameser_compat.h>
22 
23 #include <Library/DebugLib.h>
24 #include <Library/UefiLib.h>
25 
26 #include <sys/socket.h>
27 
28 /**
29   Translate the IP address into a host name
30 
31   @param[in] Argc   The number of arguments
32   @param[in] Argv   The argument value array
33 
34   @retval  0        The application exited normally.
35   @retval  Other    An error occurred.
36 **/
37 int
main(IN int Argc,IN char ** Argv)38 main (
39   IN int Argc,
40   IN char **Argv
41   )
42 {
43   UINTN Index;
44   UINT8 IpAddress[4];
45   struct hostent * pHost;
46   UINT8 * pIpAddress;
47   char ** ppName;
48   UINT32 RemoteAddress[4];
49 
50   //
51   //  Determine if the IPv4 address is specified
52   //
53   if (( 2 != Argc )
54     || ( 4 != sscanf ( Argv[1],
55                        "%d.%d.%d.%d",
56                        &RemoteAddress[0],
57                        &RemoteAddress[1],
58                        &RemoteAddress[2],
59                        &RemoteAddress[3]))
60     || ( 255 < RemoteAddress[0])
61     || ( 255 < RemoteAddress[1])
62     || ( 255 < RemoteAddress[2])
63     || ( 255 < RemoteAddress[3])) {
64     Print ( L"%a  <IPv4 Address>\r\n", Argv[0]);
65   }
66   else {
67     //
68     //  Translate the address into a host name
69     //
70     IpAddress[0] = (UINT8)RemoteAddress[0];
71     IpAddress[1] = (UINT8)RemoteAddress[1];
72     IpAddress[2] = (UINT8)RemoteAddress[2];
73     IpAddress[3] = (UINT8)RemoteAddress[3];
74     pHost = gethostbyaddr ( (const char *)&IpAddress[0], INADDRSZ, AF_INET );
75     if ( NULL == pHost ) {
76       Print ( L"ERROR - host not found, h_errno: %d\r\n", h_errno );
77     }
78     else {
79       pIpAddress = (UINT8 *)pHost->h_addr_list[ 0 ];
80       Print ( L"%d.%d.%d.%d, %a\r\n",
81               pIpAddress[0],
82               pIpAddress[1],
83               pIpAddress[2],
84               pIpAddress[3],
85               pHost->h_name );
86 
87       //
88       //  Display the other addresses
89       //
90       for ( Index = 1; NULL != pHost->h_addr_list[Index]; Index++ ) {
91         pIpAddress = (UINT8 *)pHost->h_addr_list[Index];
92         Print ( L"%d.%d.%d.%d\r\n",
93                 pIpAddress[0],
94                 pIpAddress[1],
95                 pIpAddress[2],
96                 pIpAddress[3]);
97       }
98 
99       //
100       //  Display the list of aliases
101       //
102       ppName = pHost->h_aliases;
103       if (( NULL == ppName ) || ( NULL == *ppName )) {
104         Print ( L"No aliases\r\n" );
105       }
106       else {
107         Print ( L"Aliases: " );
108         while ( NULL != *ppName ) {
109           //
110           //  Display the alias
111           //
112           Print ( L"%a", *ppName );
113 
114           //
115           //  Set the next alias
116           //
117           ppName += 1;
118           if ( NULL != *ppName ) {
119             Print ( L", " );
120           }
121         }
122         Print ( L"\r\n" );
123       }
124     }
125   }
126 
127   //
128   //  All done
129   //
130   return errno;
131 }
132