diff options
Diffstat (limited to 'cpukit/libfs/src/devfs/devfs_mknod.c')
-rw-r--r-- | cpukit/libfs/src/devfs/devfs_mknod.c | 95 |
1 files changed, 36 insertions, 59 deletions
diff --git a/cpukit/libfs/src/devfs/devfs_mknod.c b/cpukit/libfs/src/devfs/devfs_mknod.c index 4a8b8b3523..9760c5e5c7 100644 --- a/cpukit/libfs/src/devfs/devfs_mknod.c +++ b/cpukit/libfs/src/devfs/devfs_mknod.c @@ -7,75 +7,52 @@ */ #if HAVE_CONFIG_H -#include "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 <string.h> -#include <rtems/seterr.h> #include "devfs.h" int devFS_mknod( - const char *path, - mode_t mode, - dev_t dev, - rtems_filesystem_location_info_t *pathloc + const rtems_filesystem_location_info_t *parentloc, + const char *name, + size_t namelen, + mode_t mode, + dev_t dev ) { - int i; - int slot; - rtems_device_name_t *device_name_table; - rtems_device_major_number major; - rtems_device_minor_number minor; - ISR_Level level; - - /* - * This is a special case. In rtems_filesystem_initialize, - * a special device '/dev' will be created. We check this - * condition and do not create the '/dev' and the 'path' - * actually passed in is 'dev', not '/dev'. Just return 0 to - * indicate we are OK. - */ - - if ((path[0] == 'd') && (path[1] == 'e') && - (path[2] == 'v') && (path[3] == '\0')) - return 0; - - /* must be a character device or a block device */ - if (!S_ISBLK(mode) && !S_ISCHR(mode)) - rtems_set_errno_and_return_minus_one( EINVAL ); - else - rtems_filesystem_split_dev_t(dev, major, minor); - - /* Find an empty slot in device name table */ - device_name_table = (rtems_device_name_t *)pathloc->node_access; - if (!device_name_table) - rtems_set_errno_and_return_minus_one( EFAULT ); - - for (slot = -1, i = 0; i < rtems_device_table_size; i++){ - if (device_name_table[i].device_name == NULL) - slot = i; - else - if (strcmp(path, device_name_table[i].device_name) == 0) - rtems_set_errno_and_return_minus_one( EEXIST ); + int rv = 0; + + if (namelen != 3 || name [0] != 'd' || name [1] != 'e' || name [2] != 'v') { + if (S_ISBLK(mode) || S_ISCHR(mode)) { + char *dupname = malloc(namelen); + + if (dupname != NULL) { + devFS_node *node = parentloc->node_access; + + node->name = dupname; + node->namelen = namelen; + node->major = rtems_filesystem_dev_major_t(dev); + node->minor = rtems_filesystem_dev_minor_t(dev); + node->mode = mode; + memcpy(dupname, name, namelen); + } else { + errno = ENOMEM; + rv = -1; + } + } else { + errno = ENOTSUP; + rv = -1; + } + } else { + if (!S_ISDIR(mode)) { + errno = ENOTSUP; + rv = -1; + } } - if (slot == -1) - rtems_set_errno_and_return_minus_one( ENOMEM ); - - _ISR_Disable(level); - device_name_table[slot].device_name = path; - device_name_table[slot].device_name_length = strlen(path); - device_name_table[slot].major = major; - device_name_table[slot].minor = minor; - device_name_table[slot].mode = mode; - _ISR_Enable(level); - - return 0; + return rv; } - |