diff options
Diffstat (limited to 'cpukit/libcsupport/src/mknod.c')
-rw-r--r-- | cpukit/libcsupport/src/mknod.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/cpukit/libcsupport/src/mknod.c b/cpukit/libcsupport/src/mknod.c new file mode 100644 index 0000000000..4f83321ecd --- /dev/null +++ b/cpukit/libcsupport/src/mknod.c @@ -0,0 +1,60 @@ +/* + * 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-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 "libio_.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; + + if ( !(mode & (S_IFREG|S_IFCHR|S_IFBLK|S_IFIFO) ) ) + set_errno_and_return_minus_one( EINVAL ); + + if ( S_ISFIFO(mode) ) + set_errno_and_return_minus_one( ENOTSUP ); + + rtems_filesystem_get_start_loc( pathname, &i, &temp_loc ); + + result = (*temp_loc.ops->evalformake)( + &pathname[i], + &temp_loc, + &name_start + ); + if ( result != 0 ) + return -1; + + if ( !temp_loc.ops->mknod ) + set_errno_and_return_minus_one( ENOTSUP ); + + return (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc ); +} |