diff options
Diffstat (limited to 'c/src/exec/libfs/src/imfs/imfs_mknod.c')
-rw-r--r-- | c/src/exec/libfs/src/imfs/imfs_mknod.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/c/src/exec/libfs/src/imfs/imfs_mknod.c b/c/src/exec/libfs/src/imfs/imfs_mknod.c new file mode 100644 index 0000000000..d4feef4f36 --- /dev/null +++ b/c/src/exec/libfs/src/imfs/imfs_mknod.c @@ -0,0 +1,76 @@ +/* + * IMFS_mknod + * + * Routine to create a node in the IMFS file system. + * + * 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 <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <stdlib.h> +#include <assert.h> + +#include "imfs.h" +#include "libio_.h" + +int IMFS_mknod( + const char *token, /* IN */ + mode_t mode, /* IN */ + dev_t dev, /* IN */ + rtems_filesystem_location_info_t *pathloc /* IN/OUT */ +) +{ + IMFS_token_types type = 0; + IMFS_jnode_t *new_node; + int result; + char new_name[ NAME_MAX + 1 ]; + IMFS_types_union info; + + IMFS_get_token( token, new_name, &result ); + + /* + * Figure out what type of IMFS node this is. + */ + + if ( S_ISDIR(mode) ) + type = IMFS_DIRECTORY; + else if ( S_ISREG(mode) ) + type = IMFS_MEMORY_FILE; + else if ( S_ISBLK(mode) || S_ISCHR(mode) ) { + type = IMFS_DEVICE; + rtems_filesystem_split_dev_t( dev, info.device.major, info.device.minor ); + } else { + assert( 0 ); + set_errno_and_return_minus_one( EINVAL ); + } + + /* + * Allocate and fill in an IMFS jnode + */ + + new_node = IMFS_create_node( + pathloc, + type, + new_name, + mode, + &info + ); + + if ( !new_node ) + set_errno_and_return_minus_one( ENOMEM ); + + return 0; +} + |