diff options
Diffstat (limited to 'cpukit/libcsupport/include/rtems')
-rw-r--r-- | cpukit/libcsupport/include/rtems/assoc.h | 204 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/deviceio.h | 88 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/error.h | 135 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/gxx_wrappers.h | 80 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/libcsupport.h | 193 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/libio.h | 1967 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/libio_.h | 1049 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/malloc.h | 201 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/termiostypes.h | 602 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/tod.h | 70 |
10 files changed, 0 insertions, 4589 deletions
diff --git a/cpukit/libcsupport/include/rtems/assoc.h b/cpukit/libcsupport/include/rtems/assoc.h deleted file mode 100644 index 345761758a..0000000000 --- a/cpukit/libcsupport/include/rtems/assoc.h +++ /dev/null @@ -1,204 +0,0 @@ -/** - * @file rtems/assoc.h - * - * @brief RTEMS Associativity Routines - * - * RTEMS associativity routines. Mainly used to convert a value from - * one space to another (eg: our errno's to host errno's and vice-versa) - */ - - -#ifndef _RTEMS_RTEMS_ASSOC_H -#define _RTEMS_RTEMS_ASSOC_H - -/** - * @defgroup Associativity Associativity Routines - */ -/**@{*/ - -#include <stddef.h> -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - const char *name; - uint32_t local_value; - uint32_t remote_value; -} rtems_assoc_t; - -/* - * Flag/marker for optional default value in each table - */ - -#define RTEMS_ASSOC_DEFAULT_NAME "(default)" - -/** - * @brief RTEMS Associate Pointer by Name - */ -const rtems_assoc_t *rtems_assoc_ptr_by_name( - const rtems_assoc_t *, - const char * -); - -/** - * @brief RTEMS Associate Pointer by Remote - */ -const rtems_assoc_t *rtems_assoc_ptr_by_remote( - const rtems_assoc_t *, - uint32_t -); - -uint32_t rtems_assoc_remote_by_local( - const rtems_assoc_t *, - uint32_t -); - -/** - * @brief RTEMS Associate Local by Remote - */ -uint32_t rtems_assoc_local_by_remote( - const rtems_assoc_t *, - uint32_t -); - -/** - * @brief RTEMS Associate Remote by Name - */ -uint32_t rtems_assoc_remote_by_name( - const rtems_assoc_t *, - const char * -); - -/** - * @brief RTEMS Associate Local by Name - */ -uint32_t rtems_assoc_local_by_name( - const rtems_assoc_t *, - const char * -); - -/** - * @brief RTEMS Associate Name by Local - */ -const char *rtems_assoc_name_by_local( - const rtems_assoc_t *, - uint32_t -); - -/** - * @brief RTEMS Associate Name by Remote - */ -const char *rtems_assoc_name_by_remote( - const rtems_assoc_t *, - uint32_t -); - -/** - * @brief RTEMS Assoc Routines - */ -uint32_t rtems_assoc_remote_by_local_bitfield( - const rtems_assoc_t *, - uint32_t -); - -/** - * @brief RTEMS Associate Name by Local Bitfield - */ -char *rtems_assoc_name_by_local_bitfield( - const rtems_assoc_t *, - uint32_t , - char * -); - -/** - * @brief RTEMS Associate Name by Remote Bitfield - */ -char *rtems_assoc_name_by_remote_bitfield( - const rtems_assoc_t *, - uint32_t , - char * -); - -uint32_t rtems_assoc_local_by_remote_bitfield( - const rtems_assoc_t *, - uint32_t -); - -/** - * @brief RTEMS Associate Pointer by Local - */ -const rtems_assoc_t *rtems_assoc_ptr_by_local( - const rtems_assoc_t *ap, - uint32_t local_value -); - -#if defined(INSIDE_ASSOC) - -#define rtems_assoc_is_default(_ap) \ - ((_ap)->name && !strcmp((_ap)->name, RTEMS_ASSOC_DEFAULT_NAME)) - -/** - * @brief RTEMS Associate Bad Name - * - * what to return if a value is not found - * this is not reentrant, but it really shouldn't be invoked anyway - */ -const char *rtems_assoc_name_bad( - uint32_t bad_value -); -#endif - -typedef struct { - uint32_t bits; - const char *name; -} rtems_assoc_32_pair; - -/** - * @brief Converts the specified value into a text representation. - * - * @param[in] value The value to convert. - * @param[in] buffer The buffer for the text representation. - * @param[in] buffer_size The buffer size in characters. - * @param[in] pairs Names for particular bits. - * @param[in] pair_count Count of pairs. - * @param[in] separator Separator between individual names. - * @param[in] fallback Fallback value in case no bits contained in the pairs - * are set in the value. - * - * @retval The length of the text representation. May be greater than or equal - * to the buffer size if truncation occurred. - */ -size_t rtems_assoc_32_to_string( - uint32_t value, - char *buffer, - size_t buffer_size, - const rtems_assoc_32_pair *pairs, - size_t pair_count, - const char *separator, - const char *fallback -); - -/** - * @brief Converts the specified thread states into a text representation. - * - * @param[in] states The thread states to convert. - * @param[in] buffer The buffer for the text representation. - * @param[in] buffer_size The buffer size in characters. - * - * @retval The length of the text representation. May be greater than or equal - * to the buffer size if truncation occurred. - */ -size_t rtems_assoc_thread_states_to_string( - uint32_t states, - char *buffer, - size_t buffer_size -); - -#ifdef __cplusplus -} -#endif -/**@}*/ -#endif /* ! _RTEMS_RTEMS_ASSOC_H */ diff --git a/cpukit/libcsupport/include/rtems/deviceio.h b/cpukit/libcsupport/include/rtems/deviceio.h deleted file mode 100644 index a448fc7bb4..0000000000 --- a/cpukit/libcsupport/include/rtems/deviceio.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @file - * - * @brief Operations on IMFS Device Nodes - */ - -/* - * COPYRIGHT (c) 1989-2012. - * 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_DEVICEIO_H -#define _RTEMS_DEVICEIO_H - -#include <rtems/libio.h> - -/** - * @defgroup IMFSDevices IMFS Device IO Handler - * - * @ingroup IMFS - * - * This contains the interface to device drivers using the RTEMS Classic API. - */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * @brief IMFS device node handlers. - * - * IMFS Device Node Handlers - * - * This file contains the set of handlers used to map operations on - * IMFS device nodes onto calls to the RTEMS Classic API IO Manager. - */ -int rtems_deviceio_open( - rtems_libio_t *iop, - const char *path, - int oflag, - mode_t mode, - rtems_device_major_number major, - rtems_device_minor_number minor -); - -int rtems_deviceio_close( - rtems_libio_t *iop, - rtems_device_major_number major, - rtems_device_minor_number minor -); - -ssize_t rtems_deviceio_read( - rtems_libio_t *iop, - void *buf, - size_t nbyte, - rtems_device_major_number major, - rtems_device_minor_number minor -); - -ssize_t rtems_deviceio_write( - rtems_libio_t *iop, - const void *buf, - size_t nbyte, - rtems_device_major_number major, - rtems_device_minor_number minor -); - -int rtems_deviceio_control( - rtems_libio_t *iop, - ioctl_command_t command, - void *buffer, - rtems_device_major_number major, - rtems_device_minor_number minor -); - -#ifdef __cplusplus -} -#endif -/* __cplusplus */ - -/**@}*/ - -#endif /* _RTEMS_DEVICEIO_H */ diff --git a/cpukit/libcsupport/include/rtems/error.h b/cpukit/libcsupport/include/rtems/error.h deleted file mode 100644 index 617f59642b..0000000000 --- a/cpukit/libcsupport/include/rtems/error.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @file rtems/error.h - * - * @brief RTEMS Error Reporting - * - * Defines and externs for rtems error reporting - * - * These routines provide general purpose error reporting. - * rtems_error reports an error to stderr and allows use of - * printf style formatting. A newline is appended to all messages. - * - * error_flag can be specified as any of the following: - * - * RTEMS_ERROR_ERRNO -- include errno text in output - * RTEMS_ERROR_PANIC -- halts local system after output - * RTEMS_ERROR_ABORT -- abort after output - * - * It can also include a rtems_status value which can be OR'd - * with the above flags. * - * - * Example 1: - * @code - * #include <rtems.h> - * #include <rtems/error.h> - * rtems_error(0, "stray interrupt %d", intr); - * @endcode - * - * Example 2: - * @code - * if ((status = rtems_task_create(...)) != RTEMS_SUCCCESSFUL) - * { - * rtems_error(status | RTEMS_ERROR_ABORT, - * "could not create task"); - * } - * @endcode - * - * Example 3: - * @code - * if ((fd = open(pathname, O_RDNLY)) < 0) - * { - * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname); - * goto failed; - * } - * @endcode - */ - -#ifndef _RTEMS_RTEMS_ERROR_H -#define _RTEMS_RTEMS_ERROR_H - -#include <rtems/rtems/status.h> -#include <rtems/fatal.h> - -#include <stdarg.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup ErrorPanicSupport Error And Panic Support - * - * @ingroup libcsupport - * - * @brief Defines and externs for rtems error reporting - * - */ -typedef Internal_errors_t rtems_error_code_t; - -/* - * rtems_error(), rtems_verror() and rtems_panic() support - */ - -#if 0 -/* not 16bit-int host clean */ -#define RTEMS_ERROR_ERRNO (1<<((sizeof(rtems_error_code_t) * CHAR_BIT) - 2)) /* hi bit; use 'errno' */ -#define RTEMS_ERROR_PANIC (RTEMS_ERROR_ERRNO / 2) /* err fatal; no return */ -#define RTEMS_ERROR_ABORT (RTEMS_ERROR_ERRNO / 4) /* err is fatal; panic */ -#else -#define RTEMS_ERROR_ERRNO (0x40000000) /* hi bit; use 'errno' */ -#define RTEMS_ERROR_PANIC (0x20000000) /* err fatal; no return */ -#define RTEMS_ERROR_ABORT (0x10000000) /* err is fatal; panic */ -#endif - -#define RTEMS_ERROR_MASK \ - (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | RTEMS_ERROR_PANIC) /* all */ - -/** - * @brief Report an Error - * - * @param[in] error_code can be specified as any of the following: - * RTEMS_ERROR_ERRNO -- include errno text in output - * RTEMS_ERROR_PANIC -- halts local system after output - * RTEMS_ERROR_ABORT -- abort after output - * - * @param[in] printf_format is a normal printf(3) format string, - * with its concommitant arguments - * - * @return the number of characters written. - */ -int rtems_error( - rtems_error_code_t error_code, - const char *printf_format, - ... -); - -/** - * @brief Report an Error - * - * @param[in] error_code can be specified as any of the following: - * RTEMS_ERROR_ERRNO -- include errno text in output - * RTEMS_ERROR_PANIC -- halts local system after output - * RTEMS_ERROR_ABORT -- abort after output - * - * @param[in] printf_format is a normal printf(3) format string, - * with its concommitant arguments - * @param[in] arglist is a varargs list corresponding to - * printf_format - * - * @return the number of characters written. - */ -int rtems_verror( - rtems_error_code_t error_code, - const char *printf_format, - va_list arglist -); - -extern int rtems_panic_in_progress; - -#ifdef __cplusplus -} -#endif - - -#endif -/* end of include file */ diff --git a/cpukit/libcsupport/include/rtems/gxx_wrappers.h b/cpukit/libcsupport/include/rtems/gxx_wrappers.h deleted file mode 100644 index 94502b937f..0000000000 --- a/cpukit/libcsupport/include/rtems/gxx_wrappers.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file rtems/gxx_wrappers.h - * - * RTEMS threads compatibility routines for libgcc2. - */ - -/* - * by: Rosimildo da Silva (rdasilva@connecttel.com) - * - * Used ideas from: - * W. Eric Norum - * Canadian Light Source - * University of Saskatchewan - * Saskatoon, Saskatchewan, CANADA - * eric@cls.usask.ca - * - * Eric sent some e-mail in the rtems-list as a start point for this - * module implementation. - */ - -#ifndef __GCC_WRAPPERS_h -#define __GCC_WRAPPERS_h - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * @defgroup GxxWrappersSupport Gxx Wrappers Support - * - * @ingroup libcsupport - * - * @brief RTEMS Threads Compatibility Routines for Libgcc2 - */ - -/* - * These typedefs should match with the ones defined in the file - * gcc/gthr-rtems.h in the gcc distribution. - */ -typedef void *__gthread_key_t; -typedef int __gthread_once_t; -typedef void *__gthread_mutex_t; -typedef void *__gthread_recursive_mutex_t; - -int rtems_gxx_once(__gthread_once_t *once, void (*func) (void)); - -int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)); - -int rtems_gxx_key_delete (__gthread_key_t key); - -void *rtems_gxx_getspecific(__gthread_key_t key); - -int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr); - -/* - * MUTEX support - */ -void rtems_gxx_mutex_init (__gthread_mutex_t *mutex); - -int rtems_gxx_mutex_lock (__gthread_mutex_t *mutex); - -int rtems_gxx_mutex_destroy (__gthread_mutex_t *mutex); - -int rtems_gxx_mutex_trylock (__gthread_mutex_t *mutex); - -int rtems_gxx_mutex_unlock (__gthread_mutex_t *mutex); - -void rtems_gxx_recursive_mutex_init(__gthread_recursive_mutex_t *mutex); - -int rtems_gxx_recursive_mutex_lock(__gthread_recursive_mutex_t *mutex); - -int rtems_gxx_recursive_mutex_trylock(__gthread_recursive_mutex_t *mutex); - -int rtems_gxx_recursive_mutex_unlock(__gthread_recursive_mutex_t *mutex); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __GCC_WRAPPERS_h */ diff --git a/cpukit/libcsupport/include/rtems/libcsupport.h b/cpukit/libcsupport/include/rtems/libcsupport.h deleted file mode 100644 index 51607f9ea1..0000000000 --- a/cpukit/libcsupport/include/rtems/libcsupport.h +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @file - * - * @brief Standard C Library Support - * - * This include file contains the information regarding the - * RTEMS specific support for the standard C library. - */ - -/* - * 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_RTEMS_LIBCSUPPORT_H -#define _RTEMS_RTEMS_LIBCSUPPORT_H - -#include <sys/types.h> -#include <stdint.h> - -#include <rtems/score/heap.h> -#include <rtems/rtems/tasks.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup libcsupport Standard C Library Support - * - * @brief RTEMS Specific Support for the Standard C Library - * - */ -/**@{**/ - -extern void malloc_dump(void); - -/** - * @brief Malloc walk. - */ -extern bool malloc_walk(int source, bool printf_enabled); - -/** - * @brief Set malloc heap pointer. - * - * This routine is primarily used for debugging. - */ -void malloc_set_heap_pointer(Heap_Control *new_heap); - -/** - * @brief Get malloc heap pointer. - * - * This routine is primarily used for debugging. - */ -Heap_Control *malloc_get_heap_pointer( void ); - -/** - * @brief Get free malloc information. - * - * Find amount of free heap remaining - */ -extern size_t malloc_free_space(void); - -/** - * @brief Get malloc status information. - * - * Find amount of free heap remaining. - */ -extern int malloc_info(Heap_Information_block *the_info); - -/* - * Prototypes required to install newlib reentrancy user extension - */ -bool newlib_create_hook( - rtems_tcb *current_task, - rtems_tcb *creating_task -); - -void newlib_terminate_hook( - rtems_tcb *current_task -); - -#define RTEMS_NEWLIB_EXTENSION \ -{ \ - newlib_create_hook, /* rtems_task_create */ \ - 0, /* rtems_task_start */ \ - 0, /* rtems_task_restart */ \ - 0, /* rtems_task_delete */ \ - 0, /* task_switch */ \ - 0, /* task_begin */ \ - 0, /* task_exitted */ \ - 0, /* fatal */ \ - newlib_terminate_hook /* thread terminate */ \ -} - -typedef struct { - uint32_t active_barriers; - uint32_t active_extensions; - uint32_t active_message_queues; - uint32_t active_partitions; - uint32_t active_periods; - uint32_t active_ports; - uint32_t active_regions; - uint32_t active_semaphores; - uint32_t active_tasks; - uint32_t active_timers; -} rtems_resource_rtems_api; - -typedef struct { - uint32_t active_message_queues; - uint32_t active_semaphores; - uint32_t active_threads; - uint32_t active_timers; -} rtems_resource_posix_api; - -typedef struct { - Heap_Information_block workspace_info; - Heap_Information_block heap_info; - uint32_t active_posix_key_value_pairs; - uint32_t active_posix_keys; - rtems_resource_rtems_api rtems_api; - rtems_resource_posix_api posix_api; - int open_files; -} rtems_resource_snapshot; - -/** - * @brief Tasks a snapshot of the resource usage of the system. - * - * @param[out] snapshot The snapshot of used resources. - * - * @see rtems_resource_snapshot_equal() and rtems_resource_snapshot_check(). - * - * @code - * #include <assert.h> - * - * #include <rtems/libcsupport.h> - * - * void example(void) - * { - * rtems_resource_snapshot before; - * - * test_setup(); - * rtems_resource_snapshot_take(&before); - * test(); - * assert(rtems_resource_snapshot_check(&before)); - * test_cleanup(); - * } - * @endcode - */ -void rtems_resource_snapshot_take(rtems_resource_snapshot *snapshot); - -/** - * @brief Compares two resource snapshots for equality. - * - * @param[in] a One resource snapshot. - * @param[in] b Another resource snapshot. - * - * @retval true The resource snapshots are equal. - * @retval false Otherwise. - * - * @see rtems_resource_snapshot_take(). - */ -bool rtems_resource_snapshot_equal( - const rtems_resource_snapshot *a, - const rtems_resource_snapshot *b -); - -/** - * @brief Takes a new resource snapshot and checks that it is equal to the - * given resource snapshot. - * - * @param[in] snapshot The resource snapshot used for comparison with the new - * resource snapshot. - * - * @retval true The resource snapshots are equal. - * @retval false Otherwise. - * - * @see rtems_resource_snapshot_take(). - */ -bool rtems_resource_snapshot_check(const rtems_resource_snapshot *snapshot); - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/libcsupport/include/rtems/libio.h b/cpukit/libcsupport/include/rtems/libio.h deleted file mode 100644 index 9d30dafddf..0000000000 --- a/cpukit/libcsupport/include/rtems/libio.h +++ /dev/null @@ -1,1967 +0,0 @@ -/** - * @file - * - * @ingroup LibIO - * - * @brief Basic IO API - * - * This file contains the support infrastructure used to manage the - * table of integer style file descriptors used by the low level - * POSIX system calls like open(), read, fstat(), etc. - */ - -/* - * COPYRIGHT (c) 1989-2008. - * On-Line Applications Research Corporation (OAR). - * - * Modifications to support reference counting in the file system are - * Copyright (c) 2012 embedded brains GmbH. - * - * 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_RTEMS_LIBIO_H -#define _RTEMS_RTEMS_LIBIO_H - -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/ioccom.h> -#include <sys/statvfs.h> -#include <sys/uio.h> - -#include <unistd.h> -#include <termios.h> - -#include <rtems.h> -#include <rtems/fs.h> -#include <rtems/chain.h> -#include <rtems/score/atomic.h> - -#ifdef __cplusplus -extern "C" { -#endif - -struct knote; - -/** - * @defgroup LibIOFSOps File System Operations - * - * @ingroup LibIO - * - * @brief File system operations. - */ -/**@{**/ - -/** - * @brief Locks a file system instance. - * - * This lock must allow nesting. - * - * @param[in, out] mt_entry The mount table entry of the file system instance. - * - * @see rtems_filesystem_default_lock(). - */ -typedef void (*rtems_filesystem_mt_entry_lock_t)( - const rtems_filesystem_mount_table_entry_t *mt_entry -); - -/** - * @brief Unlocks a file system instance. - * - * @param[in, out] mt_entry The mount table entry of the file system instance. - * - * @see rtems_filesystem_default_unlock(). - */ -typedef void (*rtems_filesystem_mt_entry_unlock_t)( - const rtems_filesystem_mount_table_entry_t *mt_entry -); - -/** - * @brief Path evaluation context. - */ -typedef struct { - /** - * The contents of the remaining path to be evaluated. - */ - const char *path; - - /** - * The length of the remaining path to be evaluated. - */ - size_t pathlen; - - /** - * The contents of the token to be evaluated with respect to the current - * location. - */ - const char *token; - - /** - * The length of the token to be evaluated with respect to the current - * location. - */ - size_t tokenlen; - - /** - * The path evaluation is controlled by the following flags - * - RTEMS_FS_PERMS_READ, - * - RTEMS_FS_PERMS_WRITE, - * - RTEMS_FS_PERMS_EXEC, - * - RTEMS_FS_FOLLOW_HARD_LINK, - * - RTEMS_FS_FOLLOW_SYM_LINK, - * - RTEMS_FS_MAKE, - * - RTEMS_FS_EXCLUSIVE, - * - RTEMS_FS_ACCEPT_RESIDUAL_DELIMITERS, and - * - RTEMS_FS_REJECT_TERMINAL_DOT. - */ - int flags; - - /** - * Symbolic link evaluation is a recursive operation. This field helps to - * limit the recursion level and thus prevents a stack overflow. The - * recursion level is limited by RTEMS_FILESYSTEM_SYMLOOP_MAX. - */ - int recursionlevel; - - /** - * This is the current file system location of the evaluation process. - * Tokens are evaluated with respect to the current location. The token - * interpretation may change the current location. The purpose of the path - * evaluation is to change the start location into a final current location - * according to the path. - */ - rtems_filesystem_location_info_t currentloc; - - /** - * The location of the root directory of the user environment during the - * evaluation start. - */ - rtems_filesystem_global_location_t *rootloc; - - /** - * The start location of the evaluation process. The start location my - * change during symbolic link evaluation. - */ - rtems_filesystem_global_location_t *startloc; -} rtems_filesystem_eval_path_context_t; - -/** - * @brief Path evaluation. - * - * @param[in, out] ctx The path evaluation context. - * - * @see rtems_filesystem_default_eval_path(). - */ -typedef void (*rtems_filesystem_eval_path_t)( - rtems_filesystem_eval_path_context_t *ctx -); - -/** - * @brief Creates a new link for the existing file. - * - * @param[in] parentloc The location of the parent of the new link. - * @param[in] targetloc The location of the target file. - * @param[in] name Name for the new link. - * @param[in] namelen Length of the name for the new link in characters. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_link(). - */ -typedef int (*rtems_filesystem_link_t)( - const rtems_filesystem_location_info_t *parentloc, - const rtems_filesystem_location_info_t *targetloc, - const char *name, - size_t namelen -); - -/** - * @brief Changes the mode of a node. - * - * @param[in] loc The location of the node. - * @param[in] mode The new mode of the node - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_fchmod(). - */ -typedef int (*rtems_filesystem_fchmod_t)( - const rtems_filesystem_location_info_t *loc, - mode_t mode -); - -/** - * @brief Changes owner and group of a node. - * - * @param[in] loc The location of the node. - * @param[in] owner User ID for the node. - * @param[in] group Group ID for the node. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_chown(). - */ -typedef int (*rtems_filesystem_chown_t)( - const rtems_filesystem_location_info_t *loc, - uid_t owner, - gid_t group -); - -/** - * @brief Clones a location. - * - * The location is initialized with a bitwise copy of an existing location. - * The caller must ensure that this location is protected from a release during - * the clone operation. After a successful clone operation the clone will be - * added to the location chain of the corresponding mount table entry. - * - * @param[in, out] loc Location to clone. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_clonenode(). - */ -typedef int (*rtems_filesystem_clonenode_t)( - rtems_filesystem_location_info_t *loc -); - -/** - * @brief Frees the location of a node. - * - * @param[in] loc The location of the node. - * - * @see rtems_filesystem_default_freenode(). - */ -typedef void (*rtems_filesystem_freenode_t)( - const rtems_filesystem_location_info_t *loc -); - -/** - * @brief Mounts a file system instance in a mount point (directory). - * - * The mount point belongs to the file system instance of the handler and is - * specified by a field of the mount table entry. The handler must check that - * the mount point is capable of mounting a file system instance. This is the - * last step during the mount process. The file system instance is fully - * initialized at this point. - * - * @param[in] mt_entry The mount table entry. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_mount(). - */ -typedef int (*rtems_filesystem_mount_t) ( - rtems_filesystem_mount_table_entry_t *mt_entry -); - -/** - * @brief Initializes a file system instance. - * - * This function must initialize the file system root node in the mount table - * entry. - * - * @param[in] mt_entry The mount table entry. - * @param[in] data The data provided by the user. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - */ -typedef int (*rtems_filesystem_fsmount_me_t)( - rtems_filesystem_mount_table_entry_t *mt_entry, - const void *data -); - -/** - * @brief Unmounts a file system instance in a mount point (directory). - * - * In case this function is successful the file system instance will be marked - * as unmounted. The file system instance will be destroyed when the last - * reference to it vanishes. - * - * @param[in] mt_entry The mount table entry. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_unmount(). - */ -typedef int (*rtems_filesystem_unmount_t) ( - rtems_filesystem_mount_table_entry_t *mt_entry -); - -/** - * @brief Destroys a file system instance. - * - * The mount point node location of the mount table entry is invalid. This - * handler must free the file system root location and all remaining resources - * of the file system instance. - * - * @param[in] mt_entry The mount table entry. - * - * @see rtems_filesystem_default_fsunmount(). - */ -typedef void (*rtems_filesystem_fsunmount_me_t)( - rtems_filesystem_mount_table_entry_t *mt_entry -); - -/** - * @brief Tests if the node of one location is equal to the node of the other - * location. - * - * The caller ensures that both nodes are within the same file system instance. - * - * @param[in] a The one location. - * @param[in] b The other location. - * - * @retval true The nodes of the locations are equal. - * @retval false Otherwise. - * - * @see rtems_filesystem_default_are_nodes_equal(). - */ -typedef bool (*rtems_filesystem_are_nodes_equal_t)( - const rtems_filesystem_location_info_t *a, - const rtems_filesystem_location_info_t *b -); - -/** - * @brief Creates a new node. - * - * This handler should create a new node according to the parameters. - * - * @param[in] parentloc The location of the parent of the new node. - * @param[in] name Name for the new node. - * @param[in] namelen Length of the name for the new node in characters. - * @param[in] mode Mode for the new node. - * @param[in] dev Optional device identifier for the new node. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_mknod(). - */ -typedef int (*rtems_filesystem_mknod_t)( - const rtems_filesystem_location_info_t *parentloc, - const char *name, - size_t namelen, - mode_t mode, - dev_t dev -); - -/** - * @brief Removes a node. - * - * @param[in] parentloc The location of the parent of the node. - * @param[in] loc The location of the node. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_rmnod(). - */ -typedef int (*rtems_filesystem_rmnod_t)( - const rtems_filesystem_location_info_t *parentloc, - const rtems_filesystem_location_info_t *loc -); - -/** - * @brief Set node access and modification times. - * - * @param[in] loc The location of the node. - * @param[in] actime Access time for the node. - * @param[in] modtime Modification for the node. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_utime(). - */ -typedef int (*rtems_filesystem_utime_t)( - const rtems_filesystem_location_info_t *loc, - time_t actime, - time_t modtime -); - -/** - * @brief Makes a symbolic link to a node. - * - * @param[in] parentloc The location of the parent of the new symbolic link. - * @param[in] name Name for the new symbolic link. - * @param[in] namelen Length of the name for the new symbolic link in - * characters. - * @param[in] target Contents for the symbolic link. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_symlink(). - */ -typedef int (*rtems_filesystem_symlink_t)( - const rtems_filesystem_location_info_t *parentloc, - const char *name, - size_t namelen, - const char *target -); - -/** - * @brief Reads the contents of a symbolic link. - * - * @param[in] loc The location of the symbolic link. - * @param[out] buf The buffer for the contents. - * @param[in] bufsize The size of the buffer in characters. - * - * @retval non-negative Size of the actual contents in characters. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_readlink(). - */ -typedef ssize_t (*rtems_filesystem_readlink_t)( - const rtems_filesystem_location_info_t *loc, - char *buf, - size_t bufsize -); - -/** - * @brief Renames a node. - * - * @param[in] oldparentloc The location of the parent of the old node. - * @param[in] oldloc The location of the old node. - * @param[in] newparentloc The location of the parent of the new node. - * @param[in] name Name for the new node. - * @param[in] namelen Length of the name for the new node in characters. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_rename(). - */ -typedef int (*rtems_filesystem_rename_t)( - const rtems_filesystem_location_info_t *oldparentloc, - const rtems_filesystem_location_info_t *oldloc, - const rtems_filesystem_location_info_t *newparentloc, - const char *name, - size_t namelen -); - -/** - * @brief Gets file system information. - * - * @param[in] loc The location of a node. - * @param[out] buf Buffer for file system information. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_statvfs(). - */ -typedef int (*rtems_filesystem_statvfs_t)( - const rtems_filesystem_location_info_t *loc, - struct statvfs *buf -); - -/** - * @brief File system operations table. - */ -struct _rtems_filesystem_operations_table { - rtems_filesystem_mt_entry_lock_t lock_h; - rtems_filesystem_mt_entry_unlock_t unlock_h; - rtems_filesystem_eval_path_t eval_path_h; - rtems_filesystem_link_t link_h; - rtems_filesystem_are_nodes_equal_t are_nodes_equal_h; - rtems_filesystem_mknod_t mknod_h; - rtems_filesystem_rmnod_t rmnod_h; - rtems_filesystem_fchmod_t fchmod_h; - rtems_filesystem_chown_t chown_h; - rtems_filesystem_clonenode_t clonenod_h; - rtems_filesystem_freenode_t freenod_h; - rtems_filesystem_mount_t mount_h; - rtems_filesystem_unmount_t unmount_h; - rtems_filesystem_fsunmount_me_t fsunmount_me_h; - rtems_filesystem_utime_t utime_h; - rtems_filesystem_symlink_t symlink_h; - rtems_filesystem_readlink_t readlink_h; - rtems_filesystem_rename_t rename_h; - rtems_filesystem_statvfs_t statvfs_h; -}; - -/** - * @brief File system operations table with default operations. - */ -extern const rtems_filesystem_operations_table - rtems_filesystem_operations_default; - -/** - * @brief Obtains the IO library mutex. - * - * @see rtems_filesystem_mt_entry_lock_t. - */ -void rtems_filesystem_default_lock( - const rtems_filesystem_mount_table_entry_t *mt_entry -); - -/** - * @brief Releases the IO library mutex. - * - * @see rtems_filesystem_mt_entry_unlock_t. - */ -void rtems_filesystem_default_unlock( - const rtems_filesystem_mount_table_entry_t *mt_entry -); - -/** - * @brief Terminates the path evaluation and replaces the current location with - * the null location. - * - * @see rtems_filesystem_eval_path_t. - */ -void rtems_filesystem_default_eval_path( - rtems_filesystem_eval_path_context_t *ctx -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_link_t. - */ -int rtems_filesystem_default_link( - const rtems_filesystem_location_info_t *parentloc, - const rtems_filesystem_location_info_t *targetloc, - const char *name, - size_t namelen -); - -/** - * @brief Tests if the node access pointer of one location is equal to - * the node access pointer of the other location. - * - * @param[in] a The one location. - * @param[in] b The other location. - * - * @retval true The node access pointers of the locations are equal. - * @retval false Otherwise. - * - * @see rtems_filesystem_are_nodes_equal_t. - */ -bool rtems_filesystem_default_are_nodes_equal( - const rtems_filesystem_location_info_t *a, - const rtems_filesystem_location_info_t *b -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_mknod_t. - */ -int rtems_filesystem_default_mknod( - const rtems_filesystem_location_info_t *parentloc, - const char *name, - size_t namelen, - mode_t mode, - dev_t dev -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_rmnod_t. - */ -int rtems_filesystem_default_rmnod( - const rtems_filesystem_location_info_t *parentloc, - const rtems_filesystem_location_info_t *loc -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_fchmod_t. - */ -int rtems_filesystem_default_fchmod( - const rtems_filesystem_location_info_t *loc, - mode_t mode -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_chown_t. - */ -int rtems_filesystem_default_chown( - const rtems_filesystem_location_info_t *loc, - uid_t owner, - gid_t group -); - -/** - * @retval 0 Always. - * - * @see rtems_filesystem_clonenode_t. - */ -int rtems_filesystem_default_clonenode( - rtems_filesystem_location_info_t *loc -); - -/** - * @see rtems_filesystem_freenode_t. - */ -void rtems_filesystem_default_freenode( - const rtems_filesystem_location_info_t *loc -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_mount_t. - */ -int rtems_filesystem_default_mount ( - rtems_filesystem_mount_table_entry_t *mt_entry /* IN */ -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_unmount_t. - */ -int rtems_filesystem_default_unmount( - rtems_filesystem_mount_table_entry_t *mt_entry /* IN */ -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_fsunmount_me_t. - */ -void rtems_filesystem_default_fsunmount( - rtems_filesystem_mount_table_entry_t *mt_entry /* IN */ -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_utime_t. - */ -int rtems_filesystem_default_utime( - const rtems_filesystem_location_info_t *loc, - time_t actime, - time_t modtime -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_symlink_t. - */ -int rtems_filesystem_default_symlink( - const rtems_filesystem_location_info_t *parentloc, - const char *name, - size_t namelen, - const char *target -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_readlink_t. - */ -ssize_t rtems_filesystem_default_readlink( - const rtems_filesystem_location_info_t *loc, - char *buf, - size_t bufsize -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_rename_t. - */ -int rtems_filesystem_default_rename( - const rtems_filesystem_location_info_t *oldparentloc, - const rtems_filesystem_location_info_t *oldloc, - const rtems_filesystem_location_info_t *newparentloc, - const char *name, - size_t namelen -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_statvfs_t. - */ -int rtems_filesystem_default_statvfs( - const rtems_filesystem_location_info_t *loc, - struct statvfs *buf -); - -/** @} */ - -/** - * @defgroup LibIOFSHandler File System Node Handler - * - * @ingroup LibIO - * - * @brief File system node handler. - */ -/**@{**/ - -/** - * @brief Opens a node. - * - * @param[in, out] iop The IO pointer. - * @param[in] path The path. - * @param[in] oflag The open flags. - * @param[in] mode Optional mode for node creation. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_open(). - */ -typedef int (*rtems_filesystem_open_t)( - rtems_libio_t *iop, - const char *path, - int oflag, - mode_t mode -); - -/** - * @brief Closes a node. - * - * @param[in, out] iop The IO pointer. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_close(). - */ -typedef int (*rtems_filesystem_close_t)( - rtems_libio_t *iop -); - -/** - * @brief Reads from a node. - * - * This handler is responsible to update the offset field of the IO descriptor. - * - * @param[in, out] iop The IO pointer. - * @param[out] buffer The buffer for read data. - * @param[in] count The size of the buffer in characters. - * - * @retval non-negative Count of read characters. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_read(). - */ -typedef ssize_t (*rtems_filesystem_read_t)( - rtems_libio_t *iop, - void *buffer, - size_t count -); - -/** - * @brief Reads an IO vector from a node. - * - * This handler is responsible to update the offset field of the IO descriptor. - * - * @param[in, out] iop The IO pointer. - * @param[in] iov The IO vector with buffer for read data. The caller must - * ensure that the IO vector values are valid. - * @param[in] iovcnt The count of buffers in the IO vector. - * @param[in] total The total count of bytes in the buffers in the IO vector. - * - * @retval non-negative Count of read characters. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_readv(). - */ -typedef ssize_t (*rtems_filesystem_readv_t)( - rtems_libio_t *iop, - const struct iovec *iov, - int iovcnt, - ssize_t total -); - -/** - * @brief Writes to a node. - * - * This handler is responsible to update the offset field of the IO descriptor. - * - * @param[in, out] iop The IO pointer. - * @param[out] buffer The buffer for write data. - * @param[in] count The size of the buffer in characters. - * - * @retval non-negative Count of written characters. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_write(). - */ -typedef ssize_t (*rtems_filesystem_write_t)( - rtems_libio_t *iop, - const void *buffer, - size_t count -); - -/** - * @brief Writes an IO vector to a node. - * - * This handler is responsible to update the offset field of the IO descriptor. - * - * @param[in, out] iop The IO pointer. - * @param[in] iov The IO vector with buffer for write data. The caller must - * ensure that the IO vector values are valid. - * @param[in] iovcnt The count of buffers in the IO vector. - * @param[in] total The total count of bytes in the buffers in the IO vector. - * - * @retval non-negative Count of written characters. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_writev(). - */ -typedef ssize_t (*rtems_filesystem_writev_t)( - rtems_libio_t *iop, - const struct iovec *iov, - int iovcnt, - ssize_t total -); - -/** - * @brief IO control of a node. - * - * @param[in, out] iop The IO pointer. - * @param[in] request The IO control request. - * @param[in, out] buffer The buffer for IO control request data. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_ioctl(). - */ -typedef int (*rtems_filesystem_ioctl_t)( - rtems_libio_t *iop, - ioctl_command_t request, - void *buffer -); - -/** - * @brief Moves the read/write file offset. - * - * @param[in, out] iop The IO pointer. - * @param[in] offset The offset. - * @param[in] whence The reference position for the offset. - * - * @retval non-negative The new offset from the beginning of the file. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_lseek(), - * rtems_filesystem_default_lseek_file(), and - * rtems_filesystem_default_lseek_directory(). - */ -typedef off_t (*rtems_filesystem_lseek_t)( - rtems_libio_t *iop, - off_t offset, - int whence -); - -/** - * @brief Gets a node status. - * - * @param[in, out] iop The IO pointer. - * @param[out] stat The buffer to status information. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_fstat(). - */ -typedef int (*rtems_filesystem_fstat_t)( - const rtems_filesystem_location_info_t *loc, - struct stat *buf -); - -/** - * @brief Truncates a file to a specified length. - * - * @param[in, out] iop The IO pointer. - * @param[in] length The new length in characters. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_ftruncate() and - * rtems_filesystem_default_ftruncate_directory(). - */ -typedef int (*rtems_filesystem_ftruncate_t)( - rtems_libio_t *iop, - off_t length -); - -/** - * @brief Synchronizes changes to a file. - * - * @param[in, out] iop The IO pointer. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_fsync_or_fdatasync() and - * rtems_filesystem_default_fsync_or_fdatasync_success(). - */ -typedef int (*rtems_filesystem_fsync_t)( - rtems_libio_t *iop -); - -/** - * @brief Synchronizes the data of a file. - * - * @param[in, out] iop The IO pointer. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The errno is set to indicate the error. - * - * @see rtems_filesystem_default_fsync_or_fdatasync() and - * rtems_filesystem_default_fsync_or_fdatasync_success(). - */ -typedef int (*rtems_filesystem_fdatasync_t)( - rtems_libio_t *iop -); - -/** - * @brief File control. - * - * @param[in, out] iop The IO pointer. - * @param[in] cmd Control command. - * - * @retval 0 Successful operation. - * @retval errno An error occurred. This value is assigned to errno. - * - * @see rtems_filesystem_default_fcntl(). - */ -typedef int (*rtems_filesystem_fcntl_t)( - rtems_libio_t *iop, - int cmd -); - -/** - * @brief Poll and select support. - * - * @param[in, out] iop The IO pointer. - * @param[in] events The poll events. - * - * @return The poll return events. - * - * @see rtems_filesystem_default_poll(). - */ -typedef int (*rtems_filesystem_poll_t)( - rtems_libio_t *iop, - int events -); - -/** - * @brief Kernel event filter support. - * - * @param[in, out] iop The IO pointer. - * @param[in] kn The kernel event note. - * - * @retval 0 Successful operation. - * @retval error An error occurred. This is usually EINVAL. - * - * @see rtems_filesystem_default_kqfilter(). - */ -typedef int (*rtems_filesystem_kqfilter_t)( - rtems_libio_t *iop, - struct knote *kn -); - -/** - * @brief MMAP support. - * - * @param[in, out] iop The IO pointer. - * @param[in, out] addr The starting address of the mapped memory. - * @param[in] len The maximum number of bytes to map. - * @param[in] prot The desired memory protection. - * @param[in] off The offset within the file descriptor to map. - * - * @retval 0 Successful operation. - * @retval error An error occurred. This is usually EINVAL. - * - * @see rtems_filesystem_default_mmap(). - */ -typedef int (*rtems_filesystem_mmap_t)( - rtems_libio_t *iop, - void **addr, - size_t len, - int prot, - off_t off -); - -/** - * @brief File system node operations table. - */ -struct _rtems_filesystem_file_handlers_r { - rtems_filesystem_open_t open_h; - rtems_filesystem_close_t close_h; - rtems_filesystem_read_t read_h; - rtems_filesystem_write_t write_h; - rtems_filesystem_ioctl_t ioctl_h; - rtems_filesystem_lseek_t lseek_h; - rtems_filesystem_fstat_t fstat_h; - rtems_filesystem_ftruncate_t ftruncate_h; - rtems_filesystem_fsync_t fsync_h; - rtems_filesystem_fdatasync_t fdatasync_h; - rtems_filesystem_fcntl_t fcntl_h; - rtems_filesystem_poll_t poll_h; - rtems_filesystem_kqfilter_t kqfilter_h; - rtems_filesystem_readv_t readv_h; - rtems_filesystem_writev_t writev_h; - rtems_filesystem_mmap_t mmap_h; -}; - -/** - * @brief File system node handler table with default node handlers. - */ -extern const rtems_filesystem_file_handlers_r - rtems_filesystem_handlers_default; - -/** - * @retval 0 Always. - * - * @see rtems_filesystem_open_t. - */ -int rtems_filesystem_default_open( - rtems_libio_t *iop, - const char *path, - int oflag, - mode_t mode -); - -/** - * @retval 0 Always. - * - * @see rtems_filesystem_close_t. - */ -int rtems_filesystem_default_close( - rtems_libio_t *iop -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_read_t. - */ -ssize_t rtems_filesystem_default_read( - rtems_libio_t *iop, - void *buffer, - size_t count -); - -/** - * @brief Calls the read handler for each IO vector entry. - * - * @see rtems_filesystem_readv_t. - */ -ssize_t rtems_filesystem_default_readv( - rtems_libio_t *iop, - const struct iovec *iov, - int iovcnt, - ssize_t total -); - -/** - * @retval -1 Always. The errno is set to ENOTSUP. - * - * @see rtems_filesystem_write_t. - */ -ssize_t rtems_filesystem_default_write( - rtems_libio_t *iop, - const void *buffer, - size_t count -); - -/** - * @brief Calls the write handler for each IO vector entry. - * - * @see rtems_filesystem_write_t. - */ -ssize_t rtems_filesystem_default_writev( - rtems_libio_t *iop, - const struct iovec *iov, - int iovcnt, - ssize_t total -); - -/** - * @retval -1 Always. The errno is set to ENOTTY. - * - * @see rtems_filesystem_ioctl_t. - */ -int rtems_filesystem_default_ioctl( - rtems_libio_t *iop, - ioctl_command_t request, - void *buffer -); - -/** - * @retval -1 Always. The errno is set to ESPIPE. - * - * @see rtems_filesystem_lseek_t. - */ -off_t rtems_filesystem_default_lseek( - rtems_libio_t *iop, - off_t offset, - int whence -); - -/** - * @brief An offset 0 with a whence of SEEK_SET will perform a directory rewind - * operation. - * - * This function has no protection against concurrent access. - * - * @retval -1 The offset is not zero or the whence is not SEEK_SET. - * @retval 0 Successful rewind operation. - * - * @see rtems_filesystem_lseek_t. - */ -off_t rtems_filesystem_default_lseek_directory( - rtems_libio_t *iop, - off_t offset, - int whence -); - -/** - * @brief Default lseek() handler for files. - * - * The fstat() handler will be used to obtain the file size in case whence is - * SEEK_END. - * - * This function has no protection against concurrent access. - * - * @retval -1 An error occurred. In case an integer overflow occurred, then the - * errno will be set to EOVERFLOW. In case the new offset is negative, then - * the errno will be set to EINVAL. In case the whence is SEEK_END and the - * fstat() handler to obtain the current file size returned an error status, - * then the errno will be set by the fstat() handler. - * @retval offset The new offset. - * - * @see rtems_filesystem_lseek_t. - */ -off_t rtems_filesystem_default_lseek_file( - rtems_libio_t *iop, - off_t offset, - int whence -); - -/** - * @brief Sets the mode to S_IRWXU | S_IRWXG | S_IRWXO. - * - * @retval 0 Always. - * - * @see rtems_filesystem_fstat_t. - */ -int rtems_filesystem_default_fstat( - const rtems_filesystem_location_info_t *loc, - struct stat *buf -); - -/** - * @retval -1 Always. The errno is set to EINVAL. - * - * @see rtems_filesystem_ftruncate_t. - */ -int rtems_filesystem_default_ftruncate( - rtems_libio_t *iop, - off_t length -); - -/** - * @retval -1 Always. The errno is set to EISDIR. - * - * @see rtems_filesystem_ftruncate_t. - */ -int rtems_filesystem_default_ftruncate_directory( - rtems_libio_t *iop, - off_t length -); - -/** - * @retval -1 Always. The errno is set to EINVAL. - * - * @see rtems_filesystem_fsync_t and rtems_filesystem_fdatasync_t. - */ -int rtems_filesystem_default_fsync_or_fdatasync( - rtems_libio_t *iop -); - -/** - * @retval 0 Always. - * - * @see rtems_filesystem_fsync_t and rtems_filesystem_fdatasync_t. - */ -int rtems_filesystem_default_fsync_or_fdatasync_success( - rtems_libio_t *iop -); - -/** - * @retval 0 Always. - * - * @see rtems_filesystem_fcntl_t. - */ -int rtems_filesystem_default_fcntl( - rtems_libio_t *iop, - int cmd -); - -/** - * @brief Default poll handler. - * - * @retval POLLERR Always. - * - * @see rtems_filesystem_poll_t. - */ -int rtems_filesystem_default_poll( - rtems_libio_t *iop, - int events -); - -/** - * @brief Default kernel event filter handler. - * - * @retval EINVAL Always. - * - * @see rtems_filesystem_kqfilter_t. - */ -int rtems_filesystem_default_kqfilter( - rtems_libio_t *iop, - struct knote *kn -); - -/** - * @brief Default MMAP handler. - * - * @retval ENOTSUP Always. - * - * @see rtems_filesystem_mmap_t. - */ -int rtems_filesystem_default_mmap( - rtems_libio_t *iop, - void **addr, - size_t len, - int prot, - off_t off -); - -/** @} */ - -/** - * @defgroup LibIO IO Library - * - * @brief Provides system call and file system interface definitions. - * - * General purpose communication channel for RTEMS to allow UNIX/POSIX - * system call behavior under RTEMS. Initially this supported only - * IO to devices but has since been enhanced to support networking - * and support for mounted file systems. - */ -/**@{**/ - -typedef off_t rtems_off64_t __attribute__((deprecated)); - -/** - * @brief Gets the mount handler for the file system @a type. - * - * @return The file system mount handler associated with the @a type, or - * @c NULL if no such association exists. - */ -rtems_filesystem_fsmount_me_t -rtems_filesystem_get_mount_handler( - const char *type -); - -/** - * @brief Contain file system specific information which is required to support - * fpathconf(). - */ -typedef struct { - int link_max; /* count */ - int max_canon; /* max formatted input line size */ - int max_input; /* max input line size */ - int name_max; /* max name length */ - int path_max; /* max path */ - int pipe_buf; /* pipe buffer size */ - int posix_async_io; /* async IO supported on fs, 0=no, 1=yes */ - int posix_chown_restrictions; /* can chown: 0=no, 1=yes */ - int posix_no_trunc; /* error on names > max name, 0=no, 1=yes */ - int posix_prio_io; /* priority IO, 0=no, 1=yes */ - int posix_sync_io; /* file can be sync'ed, 0=no, 1=yes */ - int posix_vdisable; /* special char processing, 0=no, 1=yes */ -} rtems_filesystem_limits_and_options_t; - -/** - * @brief Default pathconf settings. - * - * Override in a filesystem. - */ -extern const rtems_filesystem_limits_and_options_t - rtems_filesystem_default_pathconf; - -/** - * @brief An open file data structure. - * - * It will be indexed by 'fd'. - * - * @todo Should really have a separate per/file data structure that this points - * to (eg: offset, driver, pathname should be in that) - */ -struct rtems_libio_tt { - off_t offset; /* current offset into file */ - Atomic_Uint flags; - rtems_filesystem_location_info_t pathinfo; - uint32_t data0; /* private to "driver" */ - void *data1; /* ... */ -}; - -/** - * @brief Paramameter block for read/write. - * - * It must include 'offset' instead of using iop's offset since we can have - * multiple outstanding i/o's on a device. - */ -typedef struct { - rtems_libio_t *iop; - off_t offset; - char *buffer; - uint32_t count; - uint32_t flags; - uint32_t bytes_moved; -} rtems_libio_rw_args_t; - -/** - * @brief Parameter block for open/close. - */ -typedef struct { - rtems_libio_t *iop; - uint32_t flags; - uint32_t mode; -} rtems_libio_open_close_args_t; - -/** - * @brief Parameter block for ioctl. - */ -typedef struct { - rtems_libio_t *iop; - ioctl_command_t command; - void *buffer; - int ioctl_return; -} rtems_libio_ioctl_args_t; - -/** - * @name Flag Values - */ -/**@{**/ - -#define LIBIO_FLAGS_NO_DELAY 0x0001U /* return immediately if no data */ -#define LIBIO_FLAGS_READ 0x0002U /* reading */ -#define LIBIO_FLAGS_WRITE 0x0004U /* writing */ -#define LIBIO_FLAGS_OPEN 0x0100U /* device is open */ -#define LIBIO_FLAGS_APPEND 0x0200U /* all writes append */ -#define LIBIO_FLAGS_CLOSE_ON_EXEC 0x0800U /* close on process exec() */ -#define LIBIO_FLAGS_READ_WRITE (LIBIO_FLAGS_READ | LIBIO_FLAGS_WRITE) -#define LIBIO_FLAGS_REFERENCE_INC 0x1000U - -/** @} */ - -static inline unsigned int rtems_libio_iop_flags( const rtems_libio_t *iop ) -{ - return _Atomic_Load_uint( &iop->flags, ATOMIC_ORDER_RELAXED ); -} - -/** - * @brief Returns true if this is a no delay iop, otherwise returns false. - * - * @param[in] iop The iop. - */ -static inline bool rtems_libio_iop_is_no_delay( const rtems_libio_t *iop ) -{ - return ( rtems_libio_iop_flags( iop ) & LIBIO_FLAGS_NO_DELAY ) != 0; -} - -/** - * @brief Returns true if this is a readable iop, otherwise returns false. - * - * @param[in] iop The iop. - */ -static inline bool rtems_libio_iop_is_readable( const rtems_libio_t *iop ) -{ - return ( rtems_libio_iop_flags( iop ) & LIBIO_FLAGS_READ ) != 0; -} - -/** - * @brief Returns true if this is a writeable iop, otherwise returns false. - * - * @param[in] iop The iop. - */ -static inline bool rtems_libio_iop_is_writeable( const rtems_libio_t *iop ) -{ - return ( rtems_libio_iop_flags( iop ) & LIBIO_FLAGS_WRITE ) != 0; -} - -/** - * @brief Returns true if this is an append iop, otherwise returns false. - * - * @param[in] iop The iop. - */ -static inline bool rtems_libio_iop_is_append( const rtems_libio_t *iop ) -{ - return ( rtems_libio_iop_flags( iop ) & LIBIO_FLAGS_APPEND ) != 0; -} - -/** - * @name External I/O Handlers - */ -/**@{**/ - -typedef int (*rtems_libio_open_t)( - const char *pathname, - uint32_t flag, - uint32_t mode -); - -typedef int (*rtems_libio_close_t)( - int fd -); - -typedef ssize_t (*rtems_libio_read_t)( - int fd, - void *buffer, - size_t count -); - -typedef ssize_t (*rtems_libio_write_t)( - int fd, - const void *buffer, - size_t count -); - -typedef int (*rtems_libio_ioctl_t)( - int fd, - uint32_t command, - void *buffer -); - -typedef off_t (*rtems_libio_lseek_t)( - int fd, - off_t offset, - int whence -); - -/** @} */ - -/** - * @name Permission Macros - */ -/**@{**/ - -/* - * The following macros are used to build up the permissions sets - * used to check permissions. These are similar in style to the - * mode_t bits and should stay compatible with them. - */ -#define RTEMS_FS_PERMS_READ 0x4 -#define RTEMS_FS_PERMS_WRITE 0x2 -#define RTEMS_FS_PERMS_EXEC 0x1 -#define RTEMS_FS_PERMS_RWX \ - (RTEMS_FS_PERMS_READ | RTEMS_FS_PERMS_WRITE | RTEMS_FS_PERMS_EXEC) -#define RTEMS_FS_FOLLOW_HARD_LINK 0x8 -#define RTEMS_FS_FOLLOW_SYM_LINK 0x10 -#define RTEMS_FS_FOLLOW_LINK \ - (RTEMS_FS_FOLLOW_HARD_LINK | RTEMS_FS_FOLLOW_SYM_LINK) -#define RTEMS_FS_MAKE 0x20 -#define RTEMS_FS_EXCLUSIVE 0x40 -#define RTEMS_FS_ACCEPT_RESIDUAL_DELIMITERS 0x80 -#define RTEMS_FS_REJECT_TERMINAL_DOT 0x100 - -/** @} */ - -union __rtems_dev_t { - dev_t device; - struct { - rtems_device_major_number major; - rtems_device_minor_number minor; - } __overlay; -}; - -static inline dev_t rtems_filesystem_make_dev_t( - rtems_device_major_number _major, - rtems_device_minor_number _minor -) -{ - union __rtems_dev_t temp; - - temp.__overlay.major = _major; - temp.__overlay.minor = _minor; - return temp.device; -} - -static inline dev_t rtems_filesystem_make_dev_t_from_pointer( - const void *pointer -) -{ - uint64_t temp = (((uint64_t) 1) << 63) | (((uintptr_t) pointer) >> 1); - - return rtems_filesystem_make_dev_t((uint32_t) (temp >> 32), (uint32_t) temp); -} - -static inline rtems_device_major_number rtems_filesystem_dev_major_t( - dev_t device -) -{ - union __rtems_dev_t temp; - - temp.device = device; - return temp.__overlay.major; -} - - -static inline rtems_device_minor_number rtems_filesystem_dev_minor_t( - dev_t device -) -{ - union __rtems_dev_t temp; - - temp.device = device; - return temp.__overlay.minor; -} - -#define rtems_filesystem_split_dev_t( _dev, _major, _minor ) \ - do { \ - (_major) = rtems_filesystem_dev_major_t ( _dev ); \ - (_minor) = rtems_filesystem_dev_minor_t( _dev ); \ - } while(0) - -/* - * Prototypes for filesystem - */ - -/** - * @brief Base File System Initialization - * - * Initialize the foundation of the file system. This is specified - * by the structure rtems_filesystem_mount_table. The usual - * configuration is a single instantiation of the IMFS or miniIMFS with - * a single "/dev" directory in it. - */ -void rtems_filesystem_initialize( void ); - -void rtems_libio_post_driver(void); - -void rtems_libio_exit(void); - -/** - * @brief Creates a directory and all its parent directories according to - * @a path. - * - * The @a mode value selects the access permissions of the directory. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The @c errno indicates the error. - */ -extern int rtems_mkdir(const char *path, mode_t mode); - -/** @} */ - -/** - * @defgroup FileSystemTypesAndMount File System Types and Mount - * - * @ingroup LibIO - * - * @brief File system types and mount. - */ -/**@{**/ - -/** - * @name File System Types - */ -/**@{**/ - -#define RTEMS_FILESYSTEM_TYPE_IMFS "imfs" -#define RTEMS_FILESYSTEM_TYPE_MINIIMFS "mimfs" -#define RTEMS_FILESYSTEM_TYPE_DEVFS "devfs" -#define RTEMS_FILESYSTEM_TYPE_FTPFS "ftpfs" -#define RTEMS_FILESYSTEM_TYPE_TFTPFS "tftpfs" -#define RTEMS_FILESYSTEM_TYPE_NFS "nfs" -#define RTEMS_FILESYSTEM_TYPE_DOSFS "dosfs" -#define RTEMS_FILESYSTEM_TYPE_RFS "rfs" -#define RTEMS_FILESYSTEM_TYPE_JFFS2 "jffs2" - -/** @} */ - -/** - * @brief Mount table entry. - */ -struct rtems_filesystem_mount_table_entry_tt { - rtems_chain_node mt_node; - void *fs_info; - const rtems_filesystem_operations_table *ops; - const void *immutable_fs_info; - rtems_chain_control location_chain; - rtems_filesystem_global_location_t *mt_point_node; - rtems_filesystem_global_location_t *mt_fs_root; - bool mounted; - bool writeable; - const rtems_filesystem_limits_and_options_t *pathconf_limits_and_options; - - /* - * The target or mount point of the file system. - */ - const char *target; - - /* - * The type of filesystem or the name of the filesystem. - */ - const char *type; - - /* - * When someone adds a mounted filesystem on a real device, - * this will need to be used. - * - * The lower layers can manage how this is managed. Leave as a - * string. - */ - char *dev; - - /** - * The task that initiated the unmount process. After unmount process - * completion this task will be notified via the transient event. - * - * @see ClassicEventTransient. - */ - rtems_id unmount_task; -}; - -/** - * @brief File system options. - */ -typedef enum { - RTEMS_FILESYSTEM_READ_ONLY, - RTEMS_FILESYSTEM_READ_WRITE, - RTEMS_FILESYSTEM_BAD_OPTIONS -} rtems_filesystem_options_t; - -/** - * @brief File system table entry. - */ -typedef struct rtems_filesystem_table_t { - const char *type; - rtems_filesystem_fsmount_me_t mount_h; -} rtems_filesystem_table_t; - -/** - * @brief Static table of file systems. - * - * Externally defined by confdefs.h or the user. - */ -extern const rtems_filesystem_table_t rtems_filesystem_table []; - -extern rtems_chain_control rtems_filesystem_mount_table; - -/** - * @brief Registers a file system @a type. - * - * The @a mount_h handler will be used to mount a file system of this @a type. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The @c errno indicates the error. - */ -int rtems_filesystem_register( - const char *type, - rtems_filesystem_fsmount_me_t mount_h -); - -/** - * @brief Unregisters a file system @a type. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The @c errno indicates the error. - */ -int rtems_filesystem_unregister( - const char *type -); - -/** - * @brief Unmounts the file system instance at the specified mount path. - * - * The function waits for the unmount process completion. In case the calling - * thread uses resources of the unmounted file system the function may never - * return. In case the calling thread has its root or current directory in the - * unmounted file system the function returns with an error status and errno is - * set to EBUSY. - * - * The unmount process completion notification uses the transient event. It is - * a fatal error to terminate the calling thread while waiting for this event. - * - * A concurrent unmount request for the same file system instance has - * unpredictable effects. - * - * @param[in] mount_path The path to the file system instance mount point. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The @c errno indicates the error. - * - * @see ClassicEventTransient. - */ -int unmount( - const char *mount_path -); - -/** - * @brief Mounts a file system instance at the specified target path. - * - * To mount a standard file system instance one of the following defines should - * be used to select the file system type - * - RTEMS_FILESYSTEM_TYPE_DEVFS, - * - RTEMS_FILESYSTEM_TYPE_DOSFS, - * - RTEMS_FILESYSTEM_TYPE_FTPFS, - * - RTEMS_FILESYSTEM_TYPE_IMFS, - * - RTEMS_FILESYSTEM_TYPE_JFFS2, - * - RTEMS_FILESYSTEM_TYPE_MINIIMFS, - * - RTEMS_FILESYSTEM_TYPE_NFS, - * - RTEMS_FILESYSTEM_TYPE_RFS, or - * - RTEMS_FILESYSTEM_TYPE_TFTPFS. - * - * Only configured or registered file system types are available. You can add - * file system types to your application configuration with the following - * configuration options - * - CONFIGURE_FILESYSTEM_DEVFS, - * - CONFIGURE_FILESYSTEM_DOSFS, - * - CONFIGURE_FILESYSTEM_FTPFS, - * - CONFIGURE_FILESYSTEM_IMFS, - * - CONFIGURE_FILESYSTEM_JFFS2, - * - CONFIGURE_FILESYSTEM_MINIIMFS, - * - CONFIGURE_FILESYSTEM_NFS, - * - CONFIGURE_FILESYSTEM_RFS, and - * - CONFIGURE_FILESYSTEM_TFTPFS. - * - * In addition to these configuration options file system types can be - * registered with rtems_filesystem_register(). - * - * @param[in] source The source parameter will be forwarded to the file system - * initialization handler. Usually the source is a path to the corresponding - * device file, or @c NULL in case the file system does not use a device file. - * @param[in] target The target path must lead to an existing directory, or - * must be @c NULL. In case the target is @c NULL, the root file system will - * be mounted. - * @param[in] filesystemtype This string selects the file system type. - * @param[in] options The options specify if the file system instance allows - * read-write or read-only access. - * @param[in] data The data parameter will be forwarded to the file system - * initialization handler. It can be used to pass file system specific mount - * options. The data structure for mount options is file system specific. See - * also in the corresponding file system documentation. - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The @c errno indicates the error. - * - * @see rtems_filesystem_register(), mount_and_make_target_path(), @ref DOSFS - * and @ref JFFS2. - */ -int mount( - const char *source, - const char *target, - const char *filesystemtype, - rtems_filesystem_options_t options, - const void *data -); - -/** - * @brief Mounts a file system and makes the @a target path. - * - * The @a target path will be created with rtems_mkdir() and must not be - * @c NULL. - * - * @see mount(). - * - * @retval 0 Successful operation. - * @retval -1 An error occurred. The @c errno indicates the error. - */ -int mount_and_make_target_path( - const char *source, - const char *target, - const char *filesystemtype, - rtems_filesystem_options_t options, - const void *data -); - -/** - * @brief Per file system type routine. - * - * @see rtems_filesystem_iterate(). - * - * @retval true Stop the iteration. - * @retval false Continue the iteration. - */ -typedef bool (*rtems_per_filesystem_routine)( - const rtems_filesystem_table_t *fs_entry, - void *arg -); - -/** - * @brief Iterates over all file system types. - * - * For each file system type the @a routine will be called with the entry and - * the @a routine_arg parameter. - * - * Do not register or unregister file system types in @a routine. - * - * The iteration is protected by the IO library mutex. - * - * @retval true Iteration stopped due to @a routine return status. - * @retval false Iteration through all entries. - */ -bool rtems_filesystem_iterate( - rtems_per_filesystem_routine routine, - void *routine_arg -); - -/** - * @brief Mount table entry visitor. - * - * @retval true Stop the iteration. - * @retval false Continue the iteration. - * - * @see rtems_filesystem_mount_iterate(). - */ -typedef bool (*rtems_filesystem_mt_entry_visitor)( - const rtems_filesystem_mount_table_entry_t *mt_entry, - void *arg -); - -/** - * @brief Iterates over all file system mount entries. - * - * The iteration is protected by the IO library mutex. Do not mount or unmount - * file systems in the visitor function. - * - * @param[in] visitor For each file system mount entry the visitor function - * will be called with the entry and the visitor argument as parameters. - * @param[in] visitor_arg The second parameter for the visitor function. - * - * @retval true Iteration stopped due to visitor function return status. - * @retval false Iteration through all entries. - */ -bool rtems_filesystem_mount_iterate( - rtems_filesystem_mt_entry_visitor visitor, - void *visitor_arg -); - -typedef struct { - const char *source; - const char *target; - const char *filesystemtype; - rtems_filesystem_options_t options; - const void *data; -} rtems_filesystem_mount_configuration; - -extern const rtems_filesystem_mount_configuration - rtems_filesystem_root_configuration; - -/** @} */ - -/** - * @defgroup Termios Termios - * - * @ingroup LibIO - * - * @brief Termios - */ -/**@{**/ - -typedef struct rtems_termios_callbacks { - int (*firstOpen)(int major, int minor, void *arg); - int (*lastClose)(int major, int minor, void *arg); - int (*pollRead)(int minor); - ssize_t (*write)(int minor, const char *buf, size_t len); - int (*setAttributes)(int minor, const struct termios *t); - int (*stopRemoteTx)(int minor); - int (*startRemoteTx)(int minor); - int outputUsesInterrupts; -} rtems_termios_callbacks; - -void rtems_termios_initialize (void); - -/* - * CCJ: Change before opening a tty. Newer code from Eric is coming - * so extra work to handle an open tty is not worth it. If the tty - * is open, close then open it again. - */ -rtems_status_code rtems_termios_bufsize ( - size_t cbufsize, /* cooked buffer size */ - size_t raw_input, /* raw input buffer size */ - size_t raw_output /* raw output buffer size */ -); - -rtems_status_code rtems_termios_open ( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg, - const rtems_termios_callbacks *callbacks -); - -rtems_status_code rtems_termios_close( - void *arg -); - -rtems_status_code rtems_termios_read( - void *arg -); - -rtems_status_code rtems_termios_write( - void *arg -); - -rtems_status_code rtems_termios_ioctl( - void *arg -); - -int rtems_termios_enqueue_raw_characters( - void *ttyp, - const char *buf, - int len -); - -int rtems_termios_dequeue_characters( - void *ttyp, - int len -); - -/** @} */ - -/** - * @brief The pathconf setting for a file system. - */ -#define rtems_filesystem_pathconf(_mte) ((_mte)->pathconf_limits_and_options) - -/** - * @brief The type of file system. Its name. - */ -#define rtems_filesystem_type(_mte) ((_mte)->type) - -/** - * @brief The mount point of a file system. - */ -#define rtems_filesystem_mount_point(_mte) ((_mte)->target) - -/** - * @brief The device entry of a file system. - */ -#define rtems_filesystem_mount_device(_mte) ((_mte)->dev) - -#ifdef __cplusplus -} -#endif - -#endif /* _RTEMS_LIBIO_H */ diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h deleted file mode 100644 index 414e8a20fc..0000000000 --- a/cpukit/libcsupport/include/rtems/libio_.h +++ /dev/null @@ -1,1049 +0,0 @@ -/** - * @file - * - * @brief LibIO Internal Interface - * - * This file is the libio internal interface. - */ - -/* - * COPYRIGHT (c) 1989-2011. - * On-Line Applications Research Corporation (OAR). - * - * Modifications to support reference counting in the file system are - * Copyright (c) 2012 embedded brains GmbH. - * - * 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_RTEMS_LIBIO__H -#define _RTEMS_RTEMS_LIBIO__H - -#include <sys/uio.h> -#include <errno.h> -#include <limits.h> -#include <pthread.h> - -#include <rtems.h> -#include <rtems/libio.h> -#include <rtems/seterr.h> -#include <rtems/score/assert.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup LibIOInternal IO Internal Library - * - * @brief Internal IO library API and implementation. - * - */ -/**@{**/ - -#define RTEMS_FILESYSTEM_SYMLOOP_MAX 32 - -/* - * Not defined in newlib so provide here. Users should use dup2 and - * not this non-portable fcntl command. Provided here to allow the - * RTEMS implementation to work. - */ -#define F_DUP2FD 20 - -/* - * File descriptor Table Information - */ - -extern const uint32_t rtems_libio_number_iops; -extern rtems_libio_t rtems_libio_iops[]; -extern void *rtems_libio_iop_free_head; -extern void **rtems_libio_iop_free_tail; - -extern const rtems_filesystem_file_handlers_r rtems_filesystem_null_handlers; - -extern rtems_filesystem_mount_table_entry_t rtems_filesystem_null_mt_entry; - -/** - * @brief The global null location. - * - * Every operation and the open and fstat handlers of this location returns an - * error status. The errno is not touched by these operations and handlers. - * The purpose of this location is to deliver the error return status for a - * previous error condition which must set the errno accordingly. - * - * The usage of this null location instead of the NULL pointer eliminates - * a lot of branches. - * - * The user environment root and current directory are statically initialized - * with the null location. Due to that all file system services are in a - * defined state even if no root file system was mounted. - */ -extern rtems_filesystem_global_location_t rtems_filesystem_global_location_null; - -/** - * @brief Sets the iop flags to the specified flags together with - * LIBIO_FLAGS_OPEN. - * - * Use this once a file descriptor allocated via rtems_libio_allocate() is - * fully initialized. - * - * @param[in] iop The iop. - * @param[in] flags The flags. - */ -static inline void rtems_libio_iop_flags_initialize( - rtems_libio_t *iop, - uint32_t flags -) -{ - _Atomic_Store_uint( - &iop->flags, - LIBIO_FLAGS_OPEN | flags, - ATOMIC_ORDER_RELEASE - ); -} - -/** - * @brief Sets the specified flags in the iop. - * - * @param[in] iop The iop. - * @param[in] set The flags to set. - * - * @return The previous flags. - */ -static inline unsigned int rtems_libio_iop_flags_set( - rtems_libio_t *iop, - unsigned int set -) -{ - return _Atomic_Fetch_or_uint( &iop->flags, set, ATOMIC_ORDER_RELAXED ); -} - -/** - * @brief Clears the specified flags in the iop. - * - * @param[in] iop The iop. - * @param[in] clear The flags to clear. - * - * @return The previous flags. - */ -static inline unsigned int rtems_libio_iop_flags_clear( - rtems_libio_t *iop, - unsigned int clear -) -{ - return _Atomic_Fetch_and_uint( &iop->flags, ~clear, ATOMIC_ORDER_RELAXED ); -} - -/** - * @brief Maps a file descriptor to the iop. - * - * The file descriptor must be a valid index into the iop table. - * - * @param[in] fd The file descriptor. - * - * @return The iop corresponding to the specified file descriptor. - */ -static inline rtems_libio_t *rtems_libio_iop( int fd ) -{ - return &rtems_libio_iops[ fd ]; -} - -/** - * @brief Holds a refernece to the iop. - * - * @param[in] iop The iop. - * - * @return The flags corresponding to the specified iop. - */ -static inline unsigned int rtems_libio_iop_hold( rtems_libio_t *iop ) -{ - return _Atomic_Fetch_add_uint( - &iop->flags, - LIBIO_FLAGS_REFERENCE_INC, - ATOMIC_ORDER_ACQUIRE - ); -} - -/** - * @brief Drops a refernece to the iop. - * - * @param[in] iop The iop. - */ -static inline void rtems_libio_iop_drop( rtems_libio_t *iop ) -{ -#if defined(RTEMS_DEBUG) - unsigned int flags; - bool success; - - flags = _Atomic_Load_uint( &iop->flags, ATOMIC_ORDER_RELAXED ); - - do { - unsigned int desired; - - _Assert( flags >= LIBIO_FLAGS_REFERENCE_INC ); - - desired = flags - LIBIO_FLAGS_REFERENCE_INC; - success = _Atomic_Compare_exchange_uint( - &iop->flags, - &flags, - desired, - ATOMIC_ORDER_RELEASE, - ATOMIC_ORDER_RELAXED - ); - } while ( !success ); -#else - _Atomic_Fetch_sub_uint( - &iop->flags, - LIBIO_FLAGS_REFERENCE_INC, - ATOMIC_ORDER_RELEASE - ); -#endif -} - -/* - * rtems_libio_iop_to_descriptor - * - * Macro to convert an internal file descriptor pointer (iop) into - * the integer file descriptor used by the "section 2" system calls. - */ - -#define rtems_libio_iop_to_descriptor(_iop) \ - ((_iop) - &rtems_libio_iops[0]) - -/* - * rtems_libio_check_is_open - * - * Macro to check if a file descriptor is actually open. - */ - -#define rtems_libio_check_is_open(_iop) \ - do { \ - if (((_iop)->flags & LIBIO_FLAGS_OPEN) == 0) { \ - errno = EBADF; \ - return -1; \ - } \ - } while (0) - -/** - * @brief Macro to get the iop for the specified file descriptor. - * - * Checks that the file descriptor is in the valid range and open. - */ -#define LIBIO_GET_IOP( _fd, _iop ) \ - do { \ - unsigned int _flags; \ - if ( (uint32_t) ( _fd ) >= rtems_libio_number_iops ) { \ - rtems_set_errno_and_return_minus_one( EBADF ); \ - } \ - _iop = rtems_libio_iop( _fd ); \ - _flags = rtems_libio_iop_hold( _iop ); \ - if ( ( _flags & LIBIO_FLAGS_OPEN ) == 0 ) { \ - rtems_libio_iop_drop( _iop ); \ - rtems_set_errno_and_return_minus_one( EBADF ); \ - } \ - } while ( 0 ) - -/** - * @brief Macro to get the iop for the specified file descriptor with access - * flags and error. - * - * Checks that the file descriptor is in the valid range and open. - */ -#define LIBIO_GET_IOP_WITH_ACCESS( _fd, _iop, _access_flags, _access_error ) \ - do { \ - unsigned int _flags; \ - unsigned int _mandatory; \ - if ( (uint32_t) ( _fd ) >= rtems_libio_number_iops ) { \ - rtems_set_errno_and_return_minus_one( EBADF ); \ - } \ - _iop = rtems_libio_iop( _fd ); \ - _flags = rtems_libio_iop_hold( _iop ); \ - _mandatory = LIBIO_FLAGS_OPEN | ( _access_flags ); \ - if ( ( _flags & _mandatory ) != _mandatory ) { \ - int _error; \ - rtems_libio_iop_drop( _iop ); \ - if ( ( _flags & LIBIO_FLAGS_OPEN ) == 0 ) { \ - _error = EBADF; \ - } else { \ - _error = _access_error; \ - } \ - rtems_set_errno_and_return_minus_one( _error ); \ - } \ - } while ( 0 ) - -/* - * rtems_libio_check_buffer - * - * Macro to check if a buffer pointer is valid. - */ - -#define rtems_libio_check_buffer(_buffer) \ - do { \ - if ((_buffer) == 0) { \ - errno = EINVAL; \ - return -1; \ - } \ - } while (0) - -/* - * rtems_libio_check_count - * - * Macro to check if a count or length is valid. - */ - -#define rtems_libio_check_count(_count) \ - do { \ - if ((_count) == 0) { \ - return 0; \ - } \ - } while (0) - -/** - * @brief Clones a node. - * - * The caller must hold the file system instance lock. - * - * @param[out] clone The cloned location. - * @param[in] master The master location. - * - * @see rtems_filesystem_instance_lock(). - */ -void rtems_filesystem_location_clone( - rtems_filesystem_location_info_t *clone, - const rtems_filesystem_location_info_t *master -); - -/** - * @brief Releases all resources of a location. - * - * This function may block on a mutex and may complete an unmount process. - * - * @param[in] loc The location to free. - * - * @note The file system root location is released by the file system - * instance destruction handler (see @ref rtems_filesystem_fsunmount_me_t). - * - * @see rtems_filesystem_freenode_t. - */ -void rtems_filesystem_location_free( rtems_filesystem_location_info_t *loc ); - -/* - * External structures - */ -#include <rtems/userenv.h> - -void rtems_libio_free_user_env( void *env ); - -extern pthread_key_t rtems_current_user_env_key; - -void rtems_libio_lock( void ); - -void rtems_libio_unlock( void ); - -static inline void rtems_filesystem_mt_lock( void ) -{ - rtems_libio_lock(); -} - -static inline void rtems_filesystem_mt_unlock( void ) -{ - rtems_libio_unlock(); -} - -extern rtems_interrupt_lock rtems_filesystem_mt_entry_lock_control; - -#define rtems_filesystem_mt_entry_declare_lock_context( ctx ) \ - rtems_interrupt_lock_context ctx - -#define rtems_filesystem_mt_entry_lock( ctx ) \ - rtems_interrupt_lock_acquire( &rtems_filesystem_mt_entry_lock_control, &ctx ) - -#define rtems_filesystem_mt_entry_unlock( ctx ) \ - rtems_interrupt_lock_release( &rtems_filesystem_mt_entry_lock_control, &ctx ) - -static inline void rtems_filesystem_instance_lock( - const rtems_filesystem_location_info_t *loc -) -{ - const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry; - - (*mt_entry->ops->lock_h)( mt_entry ); -} - -static inline void rtems_filesystem_instance_unlock( - const rtems_filesystem_location_info_t *loc -) -{ - const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry; - - (*mt_entry->ops->unlock_h)( mt_entry ); -} - -/* - * File Descriptor Routine Prototypes - */ - -/** - * This routine searches the IOP Table for an unused entry. If it - * finds one, it returns it. Otherwise, it returns NULL. - */ -rtems_libio_t *rtems_libio_allocate(void); - -/** - * Convert UNIX fnctl(2) flags to ones that RTEMS drivers understand - */ -unsigned int rtems_libio_fcntl_flags( int fcntl_flags ); - -/** - * Convert RTEMS internal flags to UNIX fnctl(2) flags - */ -int rtems_libio_to_fcntl_flags( unsigned int flags ); - -/** - * This routine frees the resources associated with an IOP (file descriptor) - * and clears the slot in the IOP Table. - */ -void rtems_libio_free( - rtems_libio_t *iop -); - -/* - * File System Routine Prototypes - */ - -rtems_filesystem_location_info_t * -rtems_filesystem_eval_path_start( - rtems_filesystem_eval_path_context_t *ctx, - const char *path, - int eval_flags -); - -rtems_filesystem_location_info_t * -rtems_filesystem_eval_path_start_with_parent( - rtems_filesystem_eval_path_context_t *ctx, - const char *path, - int eval_flags, - rtems_filesystem_location_info_t *parentloc, - int parent_eval_flags -); - -rtems_filesystem_location_info_t * -rtems_filesystem_eval_path_start_with_root_and_current( - rtems_filesystem_eval_path_context_t *ctx, - const char *path, - size_t pathlen, - int eval_flags, - rtems_filesystem_global_location_t *const *global_root_ptr, - rtems_filesystem_global_location_t *const *global_current_ptr -); - -void rtems_filesystem_eval_path_continue( - rtems_filesystem_eval_path_context_t *ctx -); - -void rtems_filesystem_eval_path_cleanup( - rtems_filesystem_eval_path_context_t *ctx -); - -void rtems_filesystem_eval_path_recursive( - rtems_filesystem_eval_path_context_t *ctx, - const char *path, - size_t pathlen -); - -void rtems_filesystem_eval_path_cleanup_with_parent( - rtems_filesystem_eval_path_context_t *ctx, - rtems_filesystem_location_info_t *parentloc -); - -/** - * @brief Requests a path evaluation restart. - * - * Sets the start and current location to the new start location. The caller - * must terminate its current evaluation process. The path evaluation - * continues in the next loop iteration within - * rtems_filesystem_eval_path_continue(). This avoids recursive invocations. - * The function obtains the new start location and clones it to set the new - * current location. The previous start and current locations are released. - * - * @param[in, out] ctx The path evaluation context. - * @param[in, out] newstartloc_ptr Pointer to the new start location. - */ -void rtems_filesystem_eval_path_restart( - rtems_filesystem_eval_path_context_t *ctx, - rtems_filesystem_global_location_t **newstartloc_ptr -); - -typedef enum { - RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE, - RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_DONE, - RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY -} rtems_filesystem_eval_path_generic_status; - -/** - * @brief Tests if the current location is a directory. - * - * @param[in, out] ctx The path evaluation context. - * @param[in, out] arg The handler argument. - * - * @retval true The current location is a directory. - * @retval false Otherwise. - * - * @see rtems_filesystem_eval_path_generic(). - */ -typedef bool (*rtems_filesystem_eval_path_is_directory)( - rtems_filesystem_eval_path_context_t *ctx, - void *arg -); - -/** - * @brief Evaluates a token. - * - * @param[in, out] ctx The path evaluation context. - * @param[in, out] arg The handler argument. - * @param[in] token The token contents. - * @param[in] tokenlen The token length in characters. - * - * @retval status The generic path evaluation status. - * - * @see rtems_filesystem_eval_path_generic(). - */ -typedef rtems_filesystem_eval_path_generic_status -(*rtems_filesystem_eval_path_eval_token)( - rtems_filesystem_eval_path_context_t *ctx, - void *arg, - const char *token, - size_t tokenlen -); - -typedef struct { - rtems_filesystem_eval_path_is_directory is_directory; - rtems_filesystem_eval_path_eval_token eval_token; -} rtems_filesystem_eval_path_generic_config; - -void rtems_filesystem_eval_path_generic( - rtems_filesystem_eval_path_context_t *ctx, - void *arg, - const rtems_filesystem_eval_path_generic_config *config -); - -void rtems_filesystem_initialize(void); - -/** - * @brief Copies a location. - * - * A bitwise copy is performed. The destination location will be added to the - * corresponding mount entry. - * - * @param[out] dst The destination location. - * @param[in] src The source location. - * - * @retval dst The destination location. - * - * @see rtems_filesystem_location_clone(). - */ -rtems_filesystem_location_info_t *rtems_filesystem_location_copy( - rtems_filesystem_location_info_t *dst, - const rtems_filesystem_location_info_t *src -); - -static inline rtems_filesystem_location_info_t * -rtems_filesystem_location_initialize_to_null( - rtems_filesystem_location_info_t *loc -) -{ - return rtems_filesystem_location_copy( - loc, - &rtems_filesystem_global_location_null.location - ); -} - -rtems_filesystem_global_location_t * -rtems_filesystem_location_transform_to_global( - rtems_filesystem_location_info_t *loc -); - -/** - * @brief Assigns a global file system location. - * - * @param[in, out] lhs_global_loc_ptr Pointer to the global left hand side file - * system location. The current left hand side location will be released. - * @param[in] rhs_global_loc The global right hand side file system location. - */ -void rtems_filesystem_global_location_assign( - rtems_filesystem_global_location_t **lhs_global_loc_ptr, - rtems_filesystem_global_location_t *rhs_global_loc -); - -/** - * @brief Obtains a global file system location. - * - * Deferred releases will be processed in this function. - * - * This function must be called from normal thread context and may block on a - * mutex. Thread dispatching is disabled to protect some critical sections. - * - * @param[in] global_loc_ptr Pointer to the global file system location. - * - * @return A global file system location. It returns always a valid object. - * In case of an error, the global null location will be returned. Each - * operation or handler of the null location returns an error status. The - * errno indicates the error. The NULL pointer is never returned. - * - * @see rtems_filesystem_location_transform_to_global(), - * rtems_filesystem_global_location_obtain_null(), and - * rtems_filesystem_global_location_release(). - */ -rtems_filesystem_global_location_t *rtems_filesystem_global_location_obtain( - rtems_filesystem_global_location_t *const *global_loc_ptr -); - -/** - * @brief Releases a global file system location. - * - * In case the reference count reaches zero, all associated resources will be - * released. This may include the complete unmount of the corresponding file - * system instance. - * - * This function may block on a mutex. It may be called within critical - * sections of the operating system. In this case the release will be - * deferred. The next obtain call will do the actual release. - * - * @param[in] global_loc The global file system location. It must not be NULL. - * @param[in] deferred If true, then do a deferred release, otherwise release - * it immediately. - * - * @see rtems_filesystem_global_location_obtain(). - */ -void rtems_filesystem_global_location_release( - rtems_filesystem_global_location_t *global_loc, - bool deferred -); - -void rtems_filesystem_location_detach( - rtems_filesystem_location_info_t *detach -); - -void rtems_filesystem_location_copy_and_detach( - rtems_filesystem_location_info_t *copy, - rtems_filesystem_location_info_t *detach -); - -static inline rtems_filesystem_global_location_t * -rtems_filesystem_global_location_obtain_null(void) -{ - rtems_filesystem_global_location_t *global_loc = NULL; - - return rtems_filesystem_global_location_obtain( &global_loc ); -} - -static inline bool rtems_filesystem_location_is_null( - const rtems_filesystem_location_info_t *loc -) -{ - return loc->handlers == &rtems_filesystem_null_handlers; -} - -static inline bool rtems_filesystem_global_location_is_null( - const rtems_filesystem_global_location_t *global_loc -) -{ - return rtems_filesystem_location_is_null( &global_loc->location ); -} - -static inline void rtems_filesystem_location_error( - const rtems_filesystem_location_info_t *loc, - int eno -) -{ - if ( !rtems_filesystem_location_is_null( loc ) ) { - errno = eno; - } -} - -int rtems_filesystem_mknod( - const rtems_filesystem_location_info_t *parentloc, - const char *name, - size_t namelen, - mode_t mode, - dev_t dev -); - -int rtems_filesystem_chdir( rtems_filesystem_location_info_t *loc ); - -int rtems_filesystem_chmod( - const rtems_filesystem_location_info_t *loc, - mode_t mode -); - -int rtems_filesystem_chown( - const rtems_filesystem_location_info_t *loc, - uid_t owner, - gid_t group -); - -static inline bool rtems_filesystem_is_ready_for_unmount( - rtems_filesystem_mount_table_entry_t *mt_entry -) -{ - bool ready = !mt_entry->mounted - && rtems_chain_has_only_one_node( &mt_entry->location_chain ) - && mt_entry->mt_fs_root->reference_count == 1; - - if ( ready ) { - rtems_chain_initialize_empty( &mt_entry->location_chain ); - } - - return ready; -} - -static inline void rtems_filesystem_location_add_to_mt_entry( - rtems_filesystem_location_info_t *loc -) -{ - rtems_filesystem_mt_entry_declare_lock_context( lock_context ); - - rtems_filesystem_mt_entry_lock( lock_context ); - rtems_chain_append_unprotected( - &loc->mt_entry->location_chain, - &loc->mt_entry_node - ); - rtems_filesystem_mt_entry_unlock( lock_context ); -} - -void rtems_filesystem_location_remove_from_mt_entry( - rtems_filesystem_location_info_t *loc -); - -void rtems_filesystem_do_unmount( - rtems_filesystem_mount_table_entry_t *mt_entry -); - -static inline bool rtems_filesystem_location_is_instance_root( - const rtems_filesystem_location_info_t *loc -) -{ - const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry; - - return (*mt_entry->ops->are_nodes_equal_h)( - loc, - &mt_entry->mt_fs_root->location - ); -} - -static inline const char *rtems_filesystem_eval_path_get_path( - rtems_filesystem_eval_path_context_t *ctx -) -{ - return ctx->path; -} - -static inline size_t rtems_filesystem_eval_path_get_pathlen( - rtems_filesystem_eval_path_context_t *ctx -) -{ - return ctx->pathlen; -} - -static inline void rtems_filesystem_eval_path_set_path( - rtems_filesystem_eval_path_context_t *ctx, - const char *path, - size_t pathlen -) -{ - ctx->path = path; - ctx->pathlen = pathlen; -} - -static inline void rtems_filesystem_eval_path_clear_path( - rtems_filesystem_eval_path_context_t *ctx -) -{ - ctx->pathlen = 0; -} - -static inline const char *rtems_filesystem_eval_path_get_token( - rtems_filesystem_eval_path_context_t *ctx -) -{ - return ctx->token; -} - -static inline size_t rtems_filesystem_eval_path_get_tokenlen( - rtems_filesystem_eval_path_context_t *ctx -) -{ - return ctx->tokenlen; -} - -static inline void rtems_filesystem_eval_path_set_token( - rtems_filesystem_eval_path_context_t *ctx, - const char *token, - size_t tokenlen -) -{ - ctx->token = token; - ctx->tokenlen = tokenlen; -} - -static inline void rtems_filesystem_eval_path_clear_token( - rtems_filesystem_eval_path_context_t *ctx -) -{ - ctx->tokenlen = 0; -} - -static inline void rtems_filesystem_eval_path_put_back_token( - rtems_filesystem_eval_path_context_t *ctx -) -{ - size_t tokenlen = ctx->tokenlen; - - ctx->path -= tokenlen; - ctx->pathlen += tokenlen; - ctx->tokenlen = 0; -} - -void rtems_filesystem_eval_path_eat_delimiter( - rtems_filesystem_eval_path_context_t *ctx -); - -void rtems_filesystem_eval_path_next_token( - rtems_filesystem_eval_path_context_t *ctx -); - -static inline void rtems_filesystem_eval_path_get_next_token( - rtems_filesystem_eval_path_context_t *ctx, - const char **token, - size_t *tokenlen -) -{ - rtems_filesystem_eval_path_next_token(ctx); - *token = ctx->token; - *tokenlen = ctx->tokenlen; -} - -static inline rtems_filesystem_location_info_t * -rtems_filesystem_eval_path_get_currentloc( - rtems_filesystem_eval_path_context_t *ctx -) -{ - return &ctx->currentloc; -} - -static inline bool rtems_filesystem_eval_path_has_path( - const rtems_filesystem_eval_path_context_t *ctx -) -{ - return ctx->pathlen > 0; -} - -static inline bool rtems_filesystem_eval_path_has_token( - const rtems_filesystem_eval_path_context_t *ctx -) -{ - return ctx->tokenlen > 0; -} - -static inline int rtems_filesystem_eval_path_get_flags( - const rtems_filesystem_eval_path_context_t *ctx -) -{ - return ctx->flags; -} - -static inline void rtems_filesystem_eval_path_set_flags( - rtems_filesystem_eval_path_context_t *ctx, - int flags -) -{ - ctx->flags = flags; -} - -static inline void rtems_filesystem_eval_path_clear_and_set_flags( - rtems_filesystem_eval_path_context_t *ctx, - int clear, - int set -) -{ - int flags = ctx->flags; - - flags &= ~clear; - flags |= set; - - ctx->flags = flags; -} - -static inline void rtems_filesystem_eval_path_extract_currentloc( - rtems_filesystem_eval_path_context_t *ctx, - rtems_filesystem_location_info_t *get -) -{ - rtems_filesystem_location_copy_and_detach( - get, - &ctx->currentloc - ); -} - -void rtems_filesystem_eval_path_error( - rtems_filesystem_eval_path_context_t *ctx, - int eno -); - -/** - * @brief Checks that the locations exist in the same file system instance. - * - * @retval 0 The locations exist and are in the same file system instance. - * @retval -1 An error occurred. The @c errno indicates the error. - */ -int rtems_filesystem_location_exists_in_same_instance_as( - const rtems_filesystem_location_info_t *a, - const rtems_filesystem_location_info_t *b -); - -/** - * @brief Checks if access to an object is allowed for the current user. - * - * If the effective UID is zero or equals the UID of the object, then the user - * permission flags of the object will be used. Otherwise if the effective GID - * is zero or equals the GID of the object or one of the supplementary group - * IDs is equal to the GID of the object, then the group permission flags of - * the object will be used. Otherwise the other permission flags of the object - * will be used. - * - * @param[in] flags The flags determining the access type. It can be - * RTEMS_FS_PERMS_READ, RTEMS_FS_PERMS_WRITE or RTEMS_FS_PERMS_EXEC. - * @param[in] object_mode The mode of the object specifying the permission flags. - * @param[in] object_uid The UID of the object. - * @param[in] object_gid The GID of the object. - * - * @retval true Access is allowed. - * @retval false Otherwise. - */ -bool rtems_filesystem_check_access( - int flags, - mode_t object_mode, - uid_t object_uid, - gid_t object_gid -); - -bool rtems_filesystem_eval_path_check_access( - rtems_filesystem_eval_path_context_t *ctx, - int eval_flags, - mode_t node_mode, - uid_t node_uid, - gid_t node_gid -); - -static inline bool rtems_filesystem_is_delimiter(char c) -{ - return c == '/' || c == '\\'; -} - -static inline bool rtems_filesystem_is_current_directory( - const char *token, - size_t tokenlen -) -{ - return tokenlen == 1 && token [0] == '.'; -} - -static inline bool rtems_filesystem_is_parent_directory( - const char *token, - size_t tokenlen -) -{ - return tokenlen == 2 && token [0] == '.' && token [1] == '.'; -} - -typedef ssize_t ( *rtems_libio_iovec_adapter )( - rtems_libio_t *iop, - const struct iovec *iov, - int iovcnt, - ssize_t total -); - -static inline ssize_t rtems_libio_iovec_eval( - int fd, - const struct iovec *iov, - int iovcnt, - unsigned int flags, - rtems_libio_iovec_adapter adapter -) -{ - ssize_t total; - int v; - rtems_libio_t *iop; - - /* - * Argument validation on IO vector - */ - if ( iov == NULL ) - rtems_set_errno_and_return_minus_one( EINVAL ); - - if ( iovcnt <= 0 ) - rtems_set_errno_and_return_minus_one( EINVAL ); - - if ( iovcnt > IOV_MAX ) - rtems_set_errno_and_return_minus_one( EINVAL ); - - /* - * OpenGroup says that you are supposed to return EINVAL if the - * sum of the iov_len values in the iov array would overflow a - * ssize_t. - */ - total = 0; - for ( v = 0 ; v < iovcnt ; ++v ) { - size_t len = iov[ v ].iov_len; - - if ( len > ( size_t ) ( SSIZE_MAX - total ) ) { - rtems_set_errno_and_return_minus_one( EINVAL ); - } - - total += ( ssize_t ) len; - - if ( iov[ v ].iov_base == NULL && len != 0 ) { - rtems_set_errno_and_return_minus_one( EINVAL ); - } - } - - LIBIO_GET_IOP_WITH_ACCESS( fd, iop, flags, EBADF ); - - if ( total > 0 ) { - total = ( *adapter )( iop, iov, iovcnt, total ); - } - - rtems_libio_iop_drop( iop ); - return total; -} - -/** - * @brief Returns the file type of the file referenced by the filesystem - * location. - * - * @brief[in] loc The filesystem location. - * - * @return The type of the file or an invalid file type in case of an error. - */ -static inline mode_t rtems_filesystem_location_type( - const rtems_filesystem_location_info_t *loc -) -{ - struct stat st; - - st.st_mode = 0; - (void) ( *loc->handlers->fstat_h )( loc, &st ); - - return st.st_mode; -} - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/libcsupport/include/rtems/malloc.h b/cpukit/libcsupport/include/rtems/malloc.h deleted file mode 100644 index 7c00f21e77..0000000000 --- a/cpukit/libcsupport/include/rtems/malloc.h +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @file rtems/malloc.h - * - * This file defines the interface to RTEMS extensions to the Malloc Family. - */ - -/* - * COPYRIGHT (c) 1989-2011. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may in - * the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifndef _RTEMS_MALLOC_H -#define _RTEMS_MALLOC_H - -#include <rtems.h> -#include <rtems/bspIo.h> -#include <rtems/libcsupport.h> /* for malloc_walk() */ - -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup MallocSupport Malloc Support - * - * @ingroup libcsupport - * - * @brief RTEMS extensions to the Malloc Family - */ - -/** - * @brief C program heap control. - * - * This is the pointer to the heap control structure used to manage the C - * program heap. - */ -extern Heap_Control *RTEMS_Malloc_Heap; - -void RTEMS_Malloc_Initialize( - const Heap_Area *areas, - size_t area_count, - Heap_Initialization_or_extend_handler extend -); - -extern ptrdiff_t RTEMS_Malloc_Sbrk_amount; - -static inline void rtems_heap_set_sbrk_amount( ptrdiff_t sbrk_amount ) -{ - RTEMS_Malloc_Sbrk_amount = sbrk_amount; -} - -typedef void *(*rtems_heap_extend_handler)( - Heap_Control *heap, - size_t alloc_size -); - -/** - * @brief RTEMS Extend Heap via Sbrk - */ -void *rtems_heap_extend_via_sbrk( - Heap_Control *heap, - size_t alloc_size -); - -void *rtems_heap_null_extend( - Heap_Control *heap, - size_t alloc_size -); - -extern const rtems_heap_extend_handler rtems_malloc_extend_handler; - -/* - * Malloc Plugin to Dirty Memory at Allocation Time - */ -typedef void (*rtems_malloc_dirtier_t)(void *, size_t); -extern rtems_malloc_dirtier_t rtems_malloc_dirty_helper; - -/** - * @brief Dirty Memory Function - * - * This method fills the specified area with a non-zero pattern - * to aid in debugging programs which do not initialize their - * memory allocated from the heap. - */ -void rtems_malloc_dirty_memory( - void *start, - size_t size -); - -/** - * @brief RTEMS Variation on Aligned Memory Allocation - * - * This method is a help memalign implementation which does all - * error checking done by posix_memalign() EXCEPT it does NOT - * place numeric restrictions on the alignment value. - * - * @param[in] pointer points to the user pointer - * @param[in] alignment is the desired alignment - * @param[in] size is the allocation request size in bytes - * - * @return This methods returns zero on success and a POSIX errno - * value to indicate the failure condition. On success - * *pointer will contain the address of the allocated memory. - */ -int rtems_memalign( - void **pointer, - size_t alignment, - size_t size -); - -/** - * @brief Allocates a memory area of size @a size bytes from the heap. - * - * If the alignment parameter @a alignment is not equal to zero, the allocated - * memory area will begin at an address aligned by this value. - * - * If the boundary parameter @a boundary is not equal to zero, the allocated - * memory area will comply with a boundary constraint. The boundary value - * specifies the set of addresses which are aligned by the boundary value. The - * interior of the allocated memory area will not contain an element of this - * set. The begin or end address of the area may be a member of the set. - * - * A size value of zero will return a unique address which may be freed with - * free(). - * - * The memory allocated by this function can be released with a call to free(). - * - * @return A pointer to the begin of the allocated memory area, or @c NULL if - * no memory is available or the parameters are inconsistent. - */ -void *rtems_heap_allocate_aligned_with_boundary( - size_t size, - uintptr_t alignment, - uintptr_t boundary -); - -/** - * @brief Extends the memory available for the heap using the memory area - * starting at @a area_begin of size @a area_size bytes. - * - * There are no alignment requirements. The memory area must be big enough to - * contain some maintenance blocks. It must not overlap parts of the current - * heap areas. Disconnected subordinate heap areas will lead to used blocks - * which cover the gaps. Extending with an inappropriate memory area will - * corrupt the heap. - * - * @retval RTEMS_SUCCESSFUL Successful operation. - * @retval RTEMS_INVALID_ADDRESS Invalid memory area. - */ -rtems_status_code rtems_heap_extend( - void *area_begin, - uintptr_t area_size -); - -/** - * @brief Greedy allocate that empties the heap. - * - * Afterwards the heap has at most @a block_count allocatable blocks of sizes - * specified by @a block_sizes. The @a block_sizes must point to an array with - * @a block_count members. All other blocks are used. - * - * @see rtems_heap_greedy_free(). - */ -void *rtems_heap_greedy_allocate( - const uintptr_t *block_sizes, - size_t block_count -); - -/** - * @brief Greedy allocate all blocks except the largest free block. - * - * Afterwards the heap has at most one allocatable block. This block is the - * largest free block if it exists. The allocatable size of this block is - * stored in @a allocatable_size. All other blocks are used. - * - * @see rtems_heap_greedy_free(). - */ -void *rtems_heap_greedy_allocate_all_except_largest( - uintptr_t *allocatable_size -); - -/** - * @brief Frees space of a greedy allocation. - * - * The @a opaque argument must be the return value of - * rtems_heap_greedy_allocate() or - * rtems_heap_greedy_allocate_all_except_largest(). - */ -void rtems_heap_greedy_free( void *opaque ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/cpukit/libcsupport/include/rtems/termiostypes.h b/cpukit/libcsupport/include/rtems/termiostypes.h deleted file mode 100644 index b3cac66e92..0000000000 --- a/cpukit/libcsupport/include/rtems/termiostypes.h +++ /dev/null @@ -1,602 +0,0 @@ -/** - * @file rtems/termiostypes.h - * - * RTEMS termios device support internal data structures - */ - -/* - * 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 __TERMIOSTYPES_H -#define __TERMIOSTYPES_H - -#include <rtems.h> -#include <rtems/libio.h> -#include <rtems/assoc.h> -#include <rtems/chain.h> -#include <sys/ioccom.h> -#include <stdint.h> -#include <termios.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup TermiostypesSupport RTEMS Termios Device Support - * - * @ingroup libcsupport - * - * @brief RTEMS Termios Device Support Internal Data Structures - */ - -/* - * Wakeup callback data structure - */ -struct ttywakeup { - void (*sw_pfn)(struct termios *tty, void *arg); - void *sw_arg; -}; - -/* - * Variables associated with the character buffer - */ -struct rtems_termios_rawbuf { - char *theBuf; - volatile unsigned int Head; - volatile unsigned int Tail; - volatile unsigned int Size; - rtems_id Semaphore; -}; - -typedef enum { - TERMIOS_POLLED, - TERMIOS_IRQ_DRIVEN, - TERMIOS_TASK_DRIVEN, - TERMIOS_IRQ_SERVER_DRIVEN -} rtems_termios_device_mode; - -struct rtems_termios_tty; - -/** - * @brief Termios device context. - * - * @see RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER(), - * rtems_termios_device_context_initialize() and - * rtems_termios_device_install(). - */ -typedef struct rtems_termios_device_context { - union { - /* Used for TERMIOS_POLLED and TERMIOS_IRQ_DRIVEN */ - rtems_interrupt_lock interrupt; - - /* Used for TERMIOS_IRQ_SERVER_DRIVEN or TERMIOS_TASK_DRIVEN */ - rtems_id mutex; - } lock; - - void ( *lock_acquire )( - struct rtems_termios_device_context *, - rtems_interrupt_lock_context * - ); - - void ( *lock_release )( - struct rtems_termios_device_context *, - rtems_interrupt_lock_context * - ); -} rtems_termios_device_context; - -void rtems_termios_device_lock_acquire_default( - rtems_termios_device_context *ctx, - rtems_interrupt_lock_context *lock_context -); - -void rtems_termios_device_lock_release_default( - rtems_termios_device_context *ctx, - rtems_interrupt_lock_context *lock_context -); - -/** - * @brief Initializes a device context. - * - * @param[in] context The Termios device context. - * @param[in] name The name for the interrupt lock. This name must be a - * string persistent throughout the life time of this lock. The name is only - * used if profiling is enabled. - */ -RTEMS_INLINE_ROUTINE void rtems_termios_device_context_initialize( - rtems_termios_device_context *context, - const char *name -) -{ - rtems_interrupt_lock_initialize( &context->lock.interrupt, name ); - context->lock_acquire = rtems_termios_device_lock_acquire_default; - context->lock_release = rtems_termios_device_lock_release_default; -} - -/** - * @brief Initializer for static initialization of Termios device contexts. - * - * @param name The name for the interrupt lock. It must be a string. The name - * is only used if profiling is enabled. - */ -#define RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER( name ) \ - { \ - { RTEMS_INTERRUPT_LOCK_INITIALIZER( name ) }, \ - rtems_termios_device_lock_acquire_default, \ - rtems_termios_device_lock_release_default \ - } - -/** - * @brief Termios device handler. - * - * @see rtems_termios_device_install(). - */ -typedef struct { - /** - * @brief First open of this device. - * - * @param[in] tty The Termios control. This parameter may be passed to - * interrupt service routines since it must be provided for the - * rtems_termios_enqueue_raw_characters() and - * rtems_termios_dequeue_characters() functions. - * @param[in] context The Termios device context. - * @param[in] term The current Termios attributes. - * @param[in] args The open/close arguments. This is parameter provided to - * support legacy drivers. It must not be used by new drivers. - * - * @retval true Successful operation. - * @retval false Cannot open device. - * - * @see rtems_termios_get_device_context() and rtems_termios_set_best_baud(). - */ - bool (*first_open)( - struct rtems_termios_tty *tty, - rtems_termios_device_context *context, - struct termios *term, - rtems_libio_open_close_args_t *args - ); - - /** - * @brief Last close of this device. - * - * @param[in] tty The Termios control. - * @param[in] context The Termios device context. - * @param[in] args The open/close arguments. This is parameter provided to - * support legacy drivers. It must not be used by new drivers. - */ - void (*last_close)( - struct rtems_termios_tty *tty, - rtems_termios_device_context *context, - rtems_libio_open_close_args_t *args - ); - - /** - * @brief Polled read. - * - * In case mode is TERMIOS_IRQ_DRIVEN, TERMIOS_IRQ_SERVER_DRIVEN or - * TERMIOS_TASK_DRIVEN, then data is received via - * rtems_termios_enqueue_raw_characters(). - * - * @param[in] context The Termios device context. - * - * @retval char The received data encoded as unsigned char. - * @retval -1 No data currently available. - */ - int (*poll_read)(rtems_termios_device_context *context); - - /** - * @brief Polled write in case mode is TERMIOS_POLLED or write support - * otherwise. - * - * @param[in] context The Termios device context. - * @param[in] buf The output buffer. - * @param[in] len The output buffer length in characters. - */ - void (*write)( - rtems_termios_device_context *context, - const char *buf, - size_t len - ); - - /** - * @brief Set attributes after a Termios settings change. - * - * @param[in] context The Termios device context. - * @param[in] term The new Termios attributes. - * - * @retval true Successful operation. - * @retval false Invalid attributes. - */ - bool (*set_attributes)( - rtems_termios_device_context *context, - const struct termios *term - ); - - /** - * @brief IO control handler. - * - * Invoked in case the Termios layer cannot deal with the IO request. - * - * @param[in] context The Termios device context. - * @param[in] request The IO control request. - * @param[in] buffer The IO control buffer. - */ - int (*ioctl)( - rtems_termios_device_context *context, - ioctl_command_t request, - void *buffer - ); - - /** - * @brief Termios device mode. - */ - rtems_termios_device_mode mode; -} rtems_termios_device_handler; - -/** - * @brief Termios device flow control handler. - * - * @see rtems_termios_device_install(). - */ -typedef struct { - /** - * @brief Indicate to stop remote transmitter. - * - * @param[in] context The Termios device context. - */ - void (*stop_remote_tx)(rtems_termios_device_context *context); - - /** - * @brief Indicate to start remote transmitter. - * - * @param[in] context The Termios device context. - */ - void (*start_remote_tx)(rtems_termios_device_context *context); -} rtems_termios_device_flow; - -/** - * @brief Termios device node for installed devices. - * - * @see rtems_termios_device_install(). - */ -typedef struct rtems_termios_device_node { - rtems_chain_node node; - rtems_device_major_number major; - rtems_device_minor_number minor; - const rtems_termios_device_handler *handler; - const rtems_termios_device_flow *flow; - rtems_termios_device_context *context; - struct rtems_termios_tty *tty; -} rtems_termios_device_node; - -/* - * Variables associated with each termios instance. - * One structure for each hardware I/O device. - */ -typedef struct rtems_termios_tty { - /* - * Linked-list of active TERMIOS devices - */ - struct rtems_termios_tty *forw; - struct rtems_termios_tty *back; - - /* - * How many times has this device been opened - */ - int refcount; - - /* - * This device - */ - rtems_device_major_number major; - rtems_device_minor_number minor; - - /* - * Mutual-exclusion semaphores - */ - rtems_id isem; - rtems_id osem; - - /* - * The canonical (cooked) character buffer - */ - char *cbuf; - int ccount; - int cindex; - - /* - * Keep track of cursor (printhead) position - */ - int column; - int read_start_column; - - /* - * The ioctl settings - */ - struct termios termios; - rtems_interval vtimeTicks; - - /* - * Raw input character buffer - */ - struct rtems_termios_rawbuf rawInBuf; - uint32_t rawInBufSemaphoreOptions; - rtems_interval rawInBufSemaphoreTimeout; - rtems_interval rawInBufSemaphoreFirstTimeout; - unsigned int rawInBufDropped; /* Statistics */ - - /* - * Raw output character buffer - */ - struct rtems_termios_rawbuf rawOutBuf; - int t_dqlen; /* count of characters dequeued from device */ - enum {rob_idle, rob_busy, rob_wait } rawOutBufState; - - /* - * Callbacks to device-specific routines - */ - rtems_termios_callbacks device; - - /** - * @brief Context for legacy devices using the callbacks. - */ - rtems_termios_device_context legacy_device_context; - - /** - * @brief The device handler. - */ - rtems_termios_device_handler handler; - - /** - * @brief The device flow control handler. - */ - rtems_termios_device_flow flow; - - volatile unsigned int flow_ctrl; - unsigned int lowwater,highwater; - - /* - * I/O task IDs (for task-driven drivers) - */ - rtems_id rxTaskId; - rtems_id txTaskId; - - /* - * line discipline related stuff - */ - int t_line; /* id of line discipline */ - void *t_sc; /* hook for discipline-specific data structure */ - - /* - * Wakeup callback variables - */ - struct ttywakeup tty_snd; - struct ttywakeup tty_rcv; - bool tty_rcvwakeup; - - /** - * @brief Corresponding device node. - */ - rtems_termios_device_node *device_node; - - /** - * @brief Context for device driver. - */ - rtems_termios_device_context *device_context; -} rtems_termios_tty; - -/** - * @brief Installs a Termios device. - * - * The installed Termios device may be removed via unlink(). - * - * @param[in] device_file The device file path. - * @param[in] handler The device handler. It must be persistent throughout the - * installed time of the device. - * @param[in] flow The device flow control handler. The device flow control - * handler are optional and may be @c NULL. If present must be persistent - * throughout the installed time of the device. - * @param[in] context The device context. It must be persistent throughout the - * installed time of the device. - * - * @retval RTEMS_SUCCESSFUL Successful operation. - * @retval RTEMS_NO_MEMORY Not enough memory to create a device node. - * @retval RTEMS_UNSATISFIED Creation of the device file failed. - * @retval RTEMS_INCORRECT_STATE Termios is not initialized. - * - * @see rtems_termios_get_device_context(). - */ -rtems_status_code rtems_termios_device_install( - const char *device_file, - const rtems_termios_device_handler *handler, - const rtems_termios_device_flow *flow, - rtems_termios_device_context *context -); - -/** - * @brief Returns the device context of an installed Termios device. - * - * @param[in] tty The Termios control. - */ -RTEMS_INLINE_ROUTINE void *rtems_termios_get_device_context( - const rtems_termios_tty *tty -) -{ - return tty->device_context; -} - -/** - * @brief Acquires the device lock. - * - * @param[in] context The device context. - * @param[in] lock_context The local interrupt lock context for an acquire and - * release pair. - */ -RTEMS_INLINE_ROUTINE void rtems_termios_device_lock_acquire( - rtems_termios_device_context *context, - rtems_interrupt_lock_context *lock_context -) -{ - ( *context->lock_acquire )( context, lock_context ); -} - -/** - * @brief Releases the device lock. - * - * @param[in] context The device context. - * @param[in] lock_context The local interrupt lock context for an acquire and - * release pair. - */ -RTEMS_INLINE_ROUTINE void rtems_termios_device_lock_release( - rtems_termios_device_context *context, - rtems_interrupt_lock_context *lock_context -) -{ - ( *context->lock_release )( context, lock_context ); -} - -/** - * @brief Sets the best baud value in the Termios control. - * - * The valid Termios baud values are between 0 and 460800. The Termios baud - * value is chosen which minimizes the difference to the value specified. - * - * @param[in] term The Termios attributes. - * @param[in] baud The current baud setting of the device. - */ -void rtems_termios_set_best_baud( - struct termios *term, - uint32_t baud -); - -struct rtems_termios_linesw { - int (*l_open) (struct rtems_termios_tty *tp); - int (*l_close)(struct rtems_termios_tty *tp); - int (*l_read )(struct rtems_termios_tty *tp,rtems_libio_rw_args_t *args); - int (*l_write)(struct rtems_termios_tty *tp,rtems_libio_rw_args_t *args); - int (*l_rint )(int c,struct rtems_termios_tty *tp); - int (*l_start)(struct rtems_termios_tty *tp); - int (*l_ioctl)(struct rtems_termios_tty *tp,rtems_libio_ioctl_args_t *args); - int (*l_modem)(struct rtems_termios_tty *tp,int flags); -}; - -/* - * FIXME: this should move to termios.h! - */ -void rtems_termios_rxirq_occured(struct rtems_termios_tty *tty); - -/* - * FIXME: this should move to termios.h! - * put a string to output ring buffer - */ -void rtems_termios_puts ( - const void *buf, - size_t len, - struct rtems_termios_tty *tty -); - -/* - * global hooks for line disciplines - */ -extern struct rtems_termios_linesw rtems_termios_linesw[]; -extern int rtems_termios_nlinesw; - -#define TTYDISC 0 /* termios tty line discipline */ -#define TABLDISC 3 /* tablet discipline */ -#define SLIPDISC 4 /* serial IP discipline */ -#define PPPDISC 5 /* PPP discipline */ -#define MAXLDISC 8 - -/* baudrate xxx integer type */ -typedef uint32_t rtems_termios_baud_t; - -/** - * @brief RTEMS Termios Baud Table - */ -extern const rtems_assoc_t rtems_termios_baud_table []; - -/** - * @brief Converts the Integral Baud value @a baud to the Termios Control Flag - * Representation - * - * @retval B0 Invalid baud value or a baud value of 0. - * @retval other Baud constant according to @a baud. - */ -speed_t rtems_termios_number_to_baud(rtems_termios_baud_t baud); - -/** - * @brief Converts the baud flags to an integral baud value. - * - * @retval 0 Invalid baud value or a baud value of @c B0. - * @retval other Integral baud value. - */ -rtems_termios_baud_t rtems_termios_baud_to_number(speed_t baud); - -/** - * @brief Convert Bxxx Constant to Index - */ -int rtems_termios_baud_to_index(rtems_termios_baud_t termios_baud); - -/** - * @brief Sets the initial @a baud in the Termios context @a tty. - * - * @retval 0 Successful operation. - * @retval -1 Invalid baud value. - */ -int rtems_termios_set_initial_baud( - struct rtems_termios_tty *tty, - rtems_termios_baud_t baud -); - -/** - * @brief Termios kqueue() filter filesystem node handler - * - * Real implementation is provided by libbsd. - */ -int rtems_termios_kqfilter( - rtems_libio_t *iop, - struct knote *kn -); - -/** - * @brief Termios mmap() filter filesystem node handler - * - * Real implementation is provided by libbsd. - */ -int rtems_termios_mmap( - rtems_libio_t *iop, - void **addr, - size_t len, - int prot, - off_t off -); - -/** - * @brief Termios poll() filesystem node handler. - * - * Real implementation is provided by libbsd. - */ -int rtems_termios_poll( - rtems_libio_t *iop, - int events -); - -#define RTEMS_IO_SNDWAKEUP _IOW('t', 11, struct ttywakeup ) /* send tty wakeup */ -#define RTEMS_IO_RCVWAKEUP _IOW('t', 12, struct ttywakeup ) /* recv tty wakeup */ - -#define OLCUC 0x00000100 /* map lower case to upper case on output */ -#define IUCLC 0x00004000 /* map upper case to lower case on input */ - -#define RTEMS_TERMIOS_NUMBER_BAUD_RATES 25 - -#ifdef __cplusplus -} -#endif - -#endif /* TERMIOSTYPES_H */ diff --git a/cpukit/libcsupport/include/rtems/tod.h b/cpukit/libcsupport/include/rtems/tod.h deleted file mode 100644 index 971e8548e8..0000000000 --- a/cpukit/libcsupport/include/rtems/tod.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file - * - * @ingroup shared_tod - * - * @brief Real Time Clock Time of Day API Definition - */ - -/* - * - * Based on MVME162 TOD by: - * COPYRIGHT (C) 1997 - * by Katsutoshi Shibuya - BU Denken Co.,Ltd. - Sapporo - JAPAN - * ALL RIGHTS RESERVED - * - * 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 TOD_H -#define TOD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup shared_tod RTC - * - * @ingroup bsp_shared - * - * @brief Set the RTC - */ -int setRealTime( - const rtems_time_of_day *tod -); - -/* - * Get the time from the RTC. - */ - -void getRealTime( - rtems_time_of_day *tod -); - -/* - * Read real time from RTC and set it to RTEMS' clock manager - */ - -void setRealTimeToRTEMS(void); - -/* - * Read time from RTEMS' clock manager and set it to RTC - */ - -void setRealTimeFromRTEMS(void); - -/* - * Return the difference between RTC and RTEMS' clock manager time in minutes. - * If the difference is greater than 1 day, this returns 9999. - */ - -int checkRealTime(void); - -#ifdef __cplusplus -} -#endif - -#endif |