static int rtems_rfs_rtems_mknod (const rtems_filesystem_location_info_t *parentloc, const char *name, size_t namelen, mode_t mode, dev_t dev) { rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (parentloc); rtems_rfs_ino parent = rtems_rfs_rtems_get_pathloc_ino (parentloc); rtems_rfs_ino ino; rtems_rfs_inode_handle inode; uid_t uid; gid_t gid; int rc; uid = geteuid (); gid = getegid (); rc = rtems_rfs_inode_create (fs, parent, name, namelen, rtems_rfs_rtems_imode (mode), 1, uid, gid, &ino); if (rc > 0) { return rtems_rfs_rtems_error ("mknod: inode create", rc); } rc = rtems_rfs_inode_open (fs, ino, &inode, true); if (rc > 0) { return rtems_rfs_rtems_error ("mknod: inode open", rc); } if (S_ISDIR(mode) || S_ISREG(mode)) { } else if (S_ISCHR (mode) || S_ISBLK (mode)) { int major; int minor; rtems_filesystem_split_dev_t (dev, major, minor); rtems_rfs_inode_set_block (&inode, 0, major); rtems_rfs_inode_set_block (&inode, 1, minor); } else { rtems_rfs_inode_close (fs, &inode); return rtems_rfs_rtems_error ("mknod: bad mode", EINVAL); } rc = rtems_rfs_inode_close (fs, &inode); if (rc > 0) { return rtems_rfs_rtems_error ("mknod: closing inode", rc); } return 0; }
int rtems_rfs_block_map_close (rtems_rfs_file_system* fs, rtems_rfs_block_map* map) { int rc = 0; int brc; if (map->dirty && map->inode) { brc = rtems_rfs_inode_load (fs, map->inode); if (brc > 0) rc = brc; if (rc == 0) { int b; for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++) rtems_rfs_inode_set_block (map->inode, b, map->blocks[b]); rtems_rfs_inode_set_block_count (map->inode, map->size.count); rtems_rfs_inode_set_block_offset (map->inode, map->size.offset); rtems_rfs_inode_set_last_map_block (map->inode, map->last_map_block); rtems_rfs_inode_set_last_data_block (map->inode, map->last_data_block); brc = rtems_rfs_inode_unload (fs, map->inode, true); if (brc > 0) rc = brc; map->dirty = false; } } map->inode = NULL; brc = rtems_rfs_buffer_handle_close (fs, &map->singly_buffer); if ((brc > 0) && (rc == 0)) rc = brc; brc = rtems_rfs_buffer_handle_close (fs, &map->doubly_buffer); if ((brc > 0) && (rc == 0)) rc = brc; return rc; }
int rtems_rfs_inode_initialise (rtems_rfs_inode_handle* handle, uint16_t links, uint16_t mode, uid_t uid, gid_t gid) { int b; rtems_rfs_inode_set_links (handle, links); rtems_rfs_inode_set_flags (handle, 0); rtems_rfs_inode_set_mode (handle, mode); rtems_rfs_inode_set_uid_gid (handle, uid, gid); rtems_rfs_inode_set_block_offset (handle, 0); rtems_rfs_inode_set_block_count (handle, 0); for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++) rtems_rfs_inode_set_block (handle, b, 0); rtems_rfs_inode_set_last_map_block (handle, 0); rtems_rfs_inode_set_last_data_block (handle, 0); return rtems_rfs_inode_time_stamp_now (handle, true, true); }