diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/libcsupport/src/eval.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/cpukit/libcsupport/src/eval.c b/cpukit/libcsupport/src/eval.c new file mode 100644 index 0000000000..bf7dd1c126 --- /dev/null +++ b/cpukit/libcsupport/src/eval.c @@ -0,0 +1,74 @@ +/* + * rtems_filesystem_evaluate_path() + * + * Routine to seed the evaluate path routine. + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include <rtems.h> +#include "libio_.h" + +int rtems_filesystem_evaluate_path( + const char *pathname, + int flags, + rtems_filesystem_location_info_t *pathloc, + int follow_link +) +{ + int i; + int result; + rtems_filesystem_node_types_t type; + + /* + * Verify Input parameters. + */ + + if ( !pathname ) + set_errno_and_return_minus_one( EFAULT ); + + if ( !pathloc ) + set_errno_and_return_minus_one( EIO ); /* should never happen */ + + /* + * Evaluate the path using the optable evalpath. + */ + + rtems_filesystem_get_start_loc( pathname, &i, pathloc ); + + result = (*pathloc->ops->evalpath)( &pathname[i], flags, pathloc ); + + /* + * Get the Node type and determine if you need to follow the link or + * not. + */ + + if ( follow_link ) { + + if ( !pathloc->ops->node_type ) + set_errno_and_return_minus_one( ENOTSUP ); + + type = (*pathloc->ops->node_type)( pathloc ); + + if ( ( type == RTEMS_FILESYSTEM_HARD_LINK ) || + ( type == RTEMS_FILESYSTEM_SYM_LINK ) ) { + + if ( !pathloc->ops->eval_link ) + set_errno_and_return_minus_one( ENOTSUP ); + + result = (*pathloc->ops->eval_link)( pathloc, flags ); + + } + } + + return result; +} + |