4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Translate the port number into a service name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2011, Intel Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync All rights reserved. This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <errno.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <netdb.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdio.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <string.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Uefi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <unistd.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <arpa\nameser.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <arpa\nameser_compat.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/socket.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Translate the IP address into a host name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param [in] Argc The number of arguments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param [in] Argv The argument value array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval 0 The application exited normally.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other An error occurred.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncmain (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN int Argc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN char **Argv
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 IpAddress[4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct hostent * pHost;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 * pIpAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char ** ppName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 RemoteAddress[4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Determine if the IPv4 address is specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (( 2 != Argc )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ( 4 != sscanf ( Argv[1],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%d.%d.%d.%d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &RemoteAddress[0],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &RemoteAddress[1],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &RemoteAddress[2],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &RemoteAddress[3]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ( 255 < RemoteAddress[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ( 255 < RemoteAddress[1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ( 255 < RemoteAddress[2])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ( 255 < RemoteAddress[3])) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L"%a <IPv4 Address>\r\n", Argv[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Translate the address into a host name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpAddress[0] = (UINT8)RemoteAddress[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpAddress[1] = (UINT8)RemoteAddress[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpAddress[2] = (UINT8)RemoteAddress[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpAddress[3] = (UINT8)RemoteAddress[3];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pHost = gethostbyaddr ( &IpAddress[0], INADDRSZ, AF_INET );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( NULL == pHost ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L"ERROR - host not found, h_errno: %d\r\n", h_errno );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress = (UINT8 *)pHost->h_addr_list[ 0 ];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L"%d.%d.%d.%d, %a\r\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress[0],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress[1],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress[2],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress[3],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pHost->h_name );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the other addresses
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Index = 1; NULL != pHost->h_addr_list[Index]; Index++ ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress = (UINT8 *)pHost->h_addr_list[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L"%d.%d.%d.%d\r\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress[0],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress[1],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress[2],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pIpAddress[3]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the list of aliases
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ppName = pHost->h_aliases;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (( NULL == ppName ) || ( NULL == *ppName )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L"No aliases\r\n" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L"Aliases: " );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ( NULL != *ppName ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L"%a", *ppName );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the next alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ppName += 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( NULL != *ppName ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L", " );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print ( L"\r\n" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // All done
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return errno;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}