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
getsockname(int s,struct sockaddr * address,socklen_t * address_len)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