| /** @file | |
| Test the getaddrinfo API | |
| Copyright (c) 2011-2012, Intel Corporation | |
| All rights reserved. This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include <errno.h> | |
| #include <netdb.h> | |
| #include <string.h> | |
| #include <stdio.h> | |
| #include <Uefi.h> | |
| #include <unistd.h> | |
| #include <netinet/in.h> | |
| #include <sys/socket.h> | |
| char mBuffer[65536]; | |
| /** | |
| Test the getaddrinfo API | |
| @param [in] Argc The number of arguments | |
| @param [in] Argv The argument value array | |
| @retval 0 The application exited normally. | |
| @retval Other An error occurred. | |
| **/ | |
| int | |
| main ( | |
| IN int Argc, | |
| IN char **Argv | |
| ) | |
| { | |
| int AppStatus; | |
| int Index; | |
| int MaxLen; | |
| struct addrinfo * pAddrInfo; | |
| char * pHostName; | |
| struct addrinfo * pInfo; | |
| char * pServerName; | |
| // | |
| // Determine if the host name is specified | |
| // | |
| AppStatus = 0; | |
| if ( 1 == Argc ) { | |
| printf ( "%s <host name> <server name>\r\n", Argv[0]); | |
| } | |
| else { | |
| // | |
| // Translate the host name | |
| // | |
| pHostName = Argv[1]; | |
| pServerName = NULL; | |
| if ( 2 < Argc ) { | |
| pServerName = Argv[2]; | |
| } | |
| AppStatus = getaddrinfo ( pHostName, | |
| pServerName, | |
| NULL, | |
| &pAddrInfo ); | |
| if ( 0 != AppStatus ) { | |
| printf ( "ERROR - address info not found, errno: %d\r\n", AppStatus ); | |
| } | |
| if ( NULL == pAddrInfo ) { | |
| printf ( "ERROR - No address info structure allocated\r\n" ); | |
| } | |
| else { | |
| // | |
| // Walk the list of addresses | |
| // | |
| pInfo = pAddrInfo; | |
| while ( NULL != pInfo ) { | |
| // | |
| // Display this entry | |
| // | |
| printf ( "0x%08x: ai_flags\r\n", pInfo->ai_flags ); | |
| printf ( "0x%08x: ai_family\r\n", pInfo->ai_family ); | |
| printf ( "0x%08x: ai_socktype\r\n", pInfo->ai_socktype ); | |
| printf ( "0x%08x: ai_protocol\r\n", pInfo->ai_protocol ); | |
| printf ( "0x%08x: ai_addrlen\r\n", pInfo->ai_addrlen ); | |
| printf ( "%s: ai_canonname\r\n", pInfo->ai_canonname ); | |
| printf ( " 0x%02x: ai_addr->sa_len\r\n", (UINT8)pInfo->ai_addr->sa_len ); | |
| printf ( " 0x%02x: ai_addr->sa_family\r\n", (UINT8)pInfo->ai_addr->sa_family ); | |
| MaxLen = pInfo->ai_addr->sa_len; | |
| if ( sizeof ( struct sockaddr_in6 ) < MaxLen ) { | |
| MaxLen = sizeof ( struct sockaddr_in6 ); | |
| } | |
| for ( Index = 0; ( MaxLen - 2 ) > Index; Index++ ) { | |
| printf ( " 0x%02x: ai_addr->sa_data[%02d]\r\n", (UINT8)pInfo->ai_addr->sa_data [ Index ], Index ); | |
| } | |
| // | |
| // Set the next entry | |
| // | |
| pInfo = pInfo->ai_next; | |
| } | |
| // | |
| // Done with this structures | |
| // | |
| freeaddrinfo ( pAddrInfo ); | |
| } | |
| } | |
| // | |
| // All done | |
| // | |
| return AppStatus; | |
| } |