/** @file | |
Implement the close API. | |
Copyright (c) 2011, 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 <SocketInternals.h> | |
/** | |
Worker routine to close the socket. | |
@param[in] pSocketProtocol Socket protocol structure address | |
@param[in] pErrno Address of the ::errno variable | |
@retval EFI_SUCCESS Successfully closed the socket | |
**/ | |
EFI_STATUS | |
BslSocketCloseWork ( | |
IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
IN int * pErrno | |
) | |
{ | |
EFI_STATUS Status; | |
// | |
// Start closing the socket | |
// | |
Status = pSocketProtocol->pfnCloseStart ( pSocketProtocol, | |
FALSE, | |
pErrno ); | |
// | |
// Wait for the socket to close or an error | |
// | |
while ( EFI_NOT_READY == Status ) { | |
Status = pSocketProtocol->pfnClosePoll ( pSocketProtocol, | |
pErrno ); | |
} | |
if ( !EFI_ERROR ( Status )) { | |
// | |
// Release the socket resources | |
// | |
*pErrno = EslServiceFreeProtocol ( pSocketProtocol ); | |
} | |
else { | |
DEBUG (( DEBUG_ERROR, | |
"ERROR - Failed to close the socket: %r\r\n", | |
Status )); | |
*pErrno = EIO; | |
} | |
// | |
// Return the close status | |
// | |
return Status; | |
} | |
/** | |
Close the socket | |
The BslSocketClose routine is called indirectly from the close file | |
system routine. This routine closes the socket and returns the | |
status to the caller. | |
@param[in] pDescriptor Descriptor address for the file | |
@return This routine returns 0 upon success and -1 upon failure. | |
In the case of failure, ::errno contains more information. | |
**/ | |
int | |
EFIAPI | |
BslSocketClose ( | |
struct __filedes * pDescriptor | |
) | |
{ | |
int CloseStatus; | |
EFI_SOCKET_PROTOCOL * pSocketProtocol; | |
// | |
// Locate the socket protocol | |
// | |
pSocketProtocol = BslValidateSocketFd ( pDescriptor, &errno ); | |
if ( NULL != pSocketProtocol ) { | |
// | |
// Close the socket | |
// | |
BslSocketCloseWork ( pSocketProtocol, &errno ); | |
} | |
// | |
// Return the close status | |
// | |
CloseStatus = ( errno == 0 ) ? 0 : -1; | |
return CloseStatus; | |
} |