forked from Imagelibrary/rtems
Remove miniIMFS. Statically initialize the root IMFS. Add configuration options to disable individual features of the root IMFS, e.g. o CONFIGURE_IMFS_DISABLE_CHOWN, o CONFIGURE_IMFS_DISABLE_FCHMOD, o CONFIGURE_IMFS_DISABLE_LINK, o CONFIGURE_IMFS_DISABLE_MKNOD, o CONFIGURE_IMFS_DISABLE_MOUNT, o CONFIGURE_IMFS_DISABLE_READLINK, o CONFIGURE_IMFS_DISABLE_RENAME, o CONFIGURE_IMFS_DISABLE_RMNOD, o CONFIGURE_IMFS_DISABLE_SYMLINK, o CONFIGURE_IMFS_DISABLE_UNMOUNT, and o CONFIGURE_IMFS_DISABLE_UTIME.
102 lines
2.0 KiB
C
102 lines
2.0 KiB
C
/**
|
|
* @file
|
|
*
|
|
* @brief IMFS Make a Generic Node
|
|
* @ingroup IMFS
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2012 embedded brains GmbH. All rights reserved.
|
|
*
|
|
* embedded brains GmbH
|
|
* Obere Lagerstr. 30
|
|
* 82178 Puchheim
|
|
* Germany
|
|
* <rtems@embedded-brains.de>
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#if HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "imfs.h"
|
|
|
|
#include <string.h>
|
|
|
|
IMFS_jnode_t *IMFS_node_initialize_generic(
|
|
IMFS_jnode_t *node,
|
|
void *arg
|
|
)
|
|
{
|
|
IMFS_generic_t *generic = (IMFS_generic_t *) node;
|
|
|
|
generic->context = arg;
|
|
|
|
return node;
|
|
}
|
|
|
|
int IMFS_make_generic_node(
|
|
const char *path,
|
|
mode_t mode,
|
|
const IMFS_node_control *node_control,
|
|
void *context
|
|
)
|
|
{
|
|
int rv = 0;
|
|
|
|
mode &= ~rtems_filesystem_umask;
|
|
|
|
switch (mode & S_IFMT) {
|
|
case S_IFBLK:
|
|
case S_IFCHR:
|
|
case S_IFIFO:
|
|
case S_IFREG:
|
|
case S_IFSOCK:
|
|
break;
|
|
default:
|
|
errno = EINVAL;
|
|
rv = -1;
|
|
break;
|
|
}
|
|
|
|
if ( rv == 0 ) {
|
|
rtems_filesystem_eval_path_context_t ctx;
|
|
int eval_flags = RTEMS_FS_FOLLOW_LINK
|
|
| RTEMS_FS_MAKE
|
|
| RTEMS_FS_EXCLUSIVE;
|
|
const rtems_filesystem_location_info_t *currentloc =
|
|
rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
|
|
|
|
if ( IMFS_is_imfs_instance( currentloc ) ) {
|
|
IMFS_jnode_t *new_node = IMFS_create_node(
|
|
currentloc,
|
|
node_control,
|
|
sizeof( IMFS_generic_t ),
|
|
rtems_filesystem_eval_path_get_token( &ctx ),
|
|
rtems_filesystem_eval_path_get_tokenlen( &ctx ),
|
|
mode,
|
|
context
|
|
);
|
|
|
|
if ( new_node != NULL ) {
|
|
IMFS_jnode_t *parent = currentloc->node_access;
|
|
|
|
IMFS_mtime_ctime_update( parent );
|
|
} else {
|
|
rv = -1;
|
|
}
|
|
} else {
|
|
rtems_filesystem_eval_path_error( &ctx, ENOTSUP );
|
|
rv = -1;
|
|
}
|
|
|
|
rtems_filesystem_eval_path_cleanup( &ctx );
|
|
}
|
|
|
|
return rv;
|
|
}
|