diff options
Diffstat (limited to 'cpukit/libcsupport/src/mknod.c')
-rw-r--r-- | cpukit/libcsupport/src/mknod.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/cpukit/libcsupport/src/mknod.c b/cpukit/libcsupport/src/mknod.c new file mode 100644 index 0000000000..29aff43c31 --- /dev/null +++ b/cpukit/libcsupport/src/mknod.c @@ -0,0 +1,73 @@ +/* + * mknod() + * + * This routine is not defined in the POSIX 1003.1b standard but is + * commonly supported on most UNIX and POSIX systems. It is the + * foundation for creating file system objects. + * + * COPYRIGHT (c) 1989-1999. + * 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.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <stdlib.h> + +#include <rtems/libio_.h> +#include <rtems/seterr.h> + +int mknod( + const char *pathname, + mode_t mode, + dev_t dev +) +{ + rtems_filesystem_location_info_t temp_loc; + int i; + const char *name_start; + int result; + + /* + * The file type is field within the mode. Check we have a sane mode set. + */ + switch (mode & S_IFMT) + { + case S_IFDIR: + case S_IFCHR: + case S_IFBLK: + case S_IFREG: + case S_IFIFO: + break; + default: + rtems_set_errno_and_return_minus_one( EINVAL ); + } + + rtems_filesystem_get_start_loc( pathname, &i, &temp_loc ); + + result = (*temp_loc.ops->evalformake_h)( + &pathname[i], + &temp_loc, + &name_start + ); + if ( result != 0 ) + return -1; + + result = (*temp_loc.ops->mknod_h)( name_start, mode, dev, &temp_loc ); + + rtems_filesystem_freenode( &temp_loc ); + + return result; +} |