![]() |
|
|||
File indexing completed on 2025-05-11 08:24:15
0001 /* SPDX-License-Identifier: BSD-2-Clause */ 0002 0003 /** 0004 * @file 0005 * 0006 * @ingroup libcsupport 0007 * 0008 * @brief POSIX 1003.1b 6.3.1 - Close a File 0009 */ 0010 0011 /* 0012 * COPYRIGHT (c) 1989-1999. 0013 * On-Line Applications Research Corporation (OAR). 0014 * 0015 * Redistribution and use in source and binary forms, with or without 0016 * modification, are permitted provided that the following conditions 0017 * are met: 0018 * 1. Redistributions of source code must retain the above copyright 0019 * notice, this list of conditions and the following disclaimer. 0020 * 2. Redistributions in binary form must reproduce the above copyright 0021 * notice, this list of conditions and the following disclaimer in the 0022 * documentation and/or other materials provided with the distribution. 0023 * 0024 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 0025 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 0026 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 0027 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 0028 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 0029 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 0030 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 0031 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 0032 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 0033 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 0034 * POSSIBILITY OF SUCH DAMAGE. 0035 */ 0036 0037 #ifdef HAVE_CONFIG_H 0038 #include "config.h" 0039 #endif 0040 0041 #include <rtems/libio_.h> 0042 0043 int close( 0044 int fd 0045 ) 0046 { 0047 rtems_libio_t *iop; 0048 unsigned int flags; 0049 int rc; 0050 0051 if ( (uint32_t) fd >= rtems_libio_number_iops ) { 0052 rtems_set_errno_and_return_minus_one( EBADF ); 0053 } 0054 0055 iop = rtems_libio_iop( fd ); 0056 flags = rtems_libio_iop_flags( iop ); 0057 0058 while ( true ) { 0059 unsigned int desired; 0060 bool success; 0061 0062 if ( ( flags & LIBIO_FLAGS_OPEN ) == 0 ) { 0063 rtems_set_errno_and_return_minus_one( EBADF ); 0064 } 0065 0066 /* The expected flags */ 0067 flags &= LIBIO_FLAGS_REFERENCE_INC - 1U; 0068 0069 desired = flags & ~LIBIO_FLAGS_OPEN; 0070 success = _Atomic_Compare_exchange_uint( 0071 &iop->flags, 0072 &flags, 0073 desired, 0074 ATOMIC_ORDER_ACQ_REL, 0075 ATOMIC_ORDER_RELAXED 0076 ); 0077 0078 if ( success ) { 0079 break; 0080 } 0081 0082 if ( ( flags & ~( LIBIO_FLAGS_REFERENCE_INC - 1U ) ) != 0 ) { 0083 rtems_set_errno_and_return_minus_one( EBUSY ); 0084 } 0085 } 0086 0087 rc = (*iop->pathinfo.handlers->close_h)( iop ); 0088 0089 rtems_libio_free( iop ); 0090 0091 return rc; 0092 } 0093 0094 /* 0095 * _close_r 0096 * 0097 * This is the Newlib dependent reentrant version of close(). 0098 */ 0099 0100 #if defined(RTEMS_NEWLIB) && !defined(HAVE__CLOSE_R) 0101 0102 #include <reent.h> 0103 0104 int _close_r( 0105 struct _reent *ptr RTEMS_UNUSED, 0106 int fd 0107 ) 0108 { 0109 return close( fd ); 0110 } 0111 #endif
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |