Home | History | Annotate | Download | only in BsdSocketLib
      1 /** @file
      2   Implement the getsockname API.
      3 
      4   Copyright (c) 2011, Intel Corporation
      5   All rights reserved. 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 **/
     14 
     15 #include <SocketInternals.h>
     16 
     17 
     18 /**
     19   Get the local socket address.
     20 
     21   The getsockname routine retrieves the local system address from the socket.
     22 
     23   The
     24   <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockname.html#">POSIX</a>
     25   documentation is available online.
     26 
     27   @param [in] s         Socket file descriptor returned from ::socket.
     28 
     29   @param [out] address  Network address to receive the local system address
     30 
     31   @param [in] address_len Length of the local network address structure
     32 
     33   @return     This routine returns zero (0) if successful or -1 when an error occurs.
     34               In the case of an error, ::errno contains more details.
     35 
     36  **/
     37 int
     38 getsockname (
     39   int s,
     40   struct sockaddr * address,
     41   socklen_t * address_len
     42   )
     43 {
     44   int RetVal;
     45   EFI_SOCKET_PROTOCOL * pSocketProtocol;
     46   EFI_STATUS Status;
     47 
     48   //
     49   //  Assume failure
     50   //
     51   RetVal = -1;
     52 
     53   //
     54   //  Locate the context for this socket
     55   //
     56   pSocketProtocol = BslFdToSocketProtocol ( s, NULL, &errno );
     57   if ( NULL != pSocketProtocol ) {
     58     //
     59     //  Get the local socket address
     60     //
     61     Status = pSocketProtocol->pfnGetLocal ( pSocketProtocol,
     62                                             address,
     63                                             address_len,
     64                                             &errno );
     65     if ( !EFI_ERROR ( Status )) {
     66       RetVal = 0;
     67     }
     68   }
     69 
     70   //
     71   //  Return the operation status
     72   //
     73   return RetVal;
     74 }
     75