/** * @file * * @brief POSIX API Implementation * * This include file defines the top level interface to the POSIX API * implementation in RTEMS. */ /* * COPYRIGHT (c) 1989-2011. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.org/license/LICENSE. */ #ifndef _RTEMS_POSIX_POSIXAPI_H #define _RTEMS_POSIX_POSIXAPI_H #include #include #include #include #include #include /** * @defgroup POSIXAPI RTEMS POSIX API * * RTEMS POSIX API definitions and modules. * */ /**@{**/ /** * @brief POSIX API Fatal domains. */ typedef enum { POSIX_FD_PTHREAD, /**< A pthread thread error. */ POSIX_FD_PTHREAD_ONCE /**< A pthread once error. */ } POSIX_Fatal_domain; /** * @brief POSIX API Fatal error. * * A common method of rasing a POSIX API fatal error. * * @param[in] domain The POSIX error domain. * @param[in] eno The error number as defined in errno.h. */ void _POSIX_Fatal_error( POSIX_Fatal_domain domain, int eno ); extern const int _POSIX_Get_by_name_error_table[ 3 ]; RTEMS_INLINE_ROUTINE int _POSIX_Get_by_name_error( Objects_Get_by_name_error error ) { _Assert( (size_t) error < RTEMS_ARRAY_SIZE( _POSIX_Get_by_name_error_table ) ); return _POSIX_Get_by_name_error_table[ error ]; } RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status ) { return STATUS_GET_POSIX( status ); } RTEMS_INLINE_ROUTINE int _POSIX_Get_error_after_wait( const Thread_Control *executing ) { return _POSIX_Get_error( _Thread_Wait_get_status( executing ) ); } RTEMS_INLINE_ROUTINE int _POSIX_Zero_or_minus_one_plus_errno( Status_Control status ) { if ( status == STATUS_SUCCESSFUL ) { return 0; } rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) ); } /** * @brief Macro to generate a function body to get a POSIX object by * identifier. * * Generates a function body to get the object for the specified identifier. * Performs automatic initialization if requested and necessary. This is an * ugly macro, since C lacks support for templates. */ #define _POSIX_Get_object_body( \ type, \ id, \ queue_context, \ info, \ initializer, \ init \ ) \ Objects_Control *the_object; \ if ( id == NULL ) { \ return NULL; \ } \ _Thread_queue_Initialize( queue_context ); \ the_object = _Objects_Get( \ (Objects_Id) *id, \ &queue_context->Lock_context.Lock_context, \ info \ ); \ if ( the_object == NULL ) { \ _Once_Lock(); \ if ( *id == initializer ) { \ init( id, NULL ); \ } \ _Once_Unlock(); \ the_object = _Objects_Get( \ (Objects_Id) *id, \ &queue_context->Lock_context.Lock_context, \ info \ ); \ } \ return (type *) the_object /** @} */ #endif /* end of include file */