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); }
int rtems_rfs_symlink (rtems_rfs_file_system* fs, const char* name, int length, const char* link, int link_length, uid_t uid, gid_t gid, rtems_rfs_ino parent) { rtems_rfs_inode_handle inode; rtems_rfs_ino ino; int rc; if (rtems_rfs_trace (RTEMS_RFS_TRACE_SYMLINK)) { int c; printf ("rtems-rfs: symlink: parent:%" PRIu32 " name:", parent); for (c = 0; c < length; c++) printf ("%c", name[c]); printf (" link:"); for (c = 0; c < link_length; c++) printf ("%c", link[c]); } if (link_length >= rtems_rfs_fs_block_size (fs)) return ENAMETOOLONG; rc = rtems_rfs_inode_create (fs, parent, name, strlen (name), RTEMS_RFS_S_SYMLINK, 1, uid, gid, &ino); if (rc > 0) return rc; rc = rtems_rfs_inode_open (fs, ino, &inode, true); if (rc > 0) return rc; /* * If the link length is less than the length of data union in the inode * place the link into the data area else allocate a block and write the link * to that. */ if (link_length < RTEMS_RFS_INODE_DATA_NAME_SIZE) { memset (inode.node->data.name, 0, RTEMS_RFS_INODE_DATA_NAME_SIZE); memcpy (inode.node->data.name, link, link_length); rtems_rfs_inode_set_block_count (&inode, 0); } else { rtems_rfs_block_map map; rtems_rfs_block_no block; rtems_rfs_buffer_handle buffer; uint8_t* data; rc = rtems_rfs_block_map_open (fs, &inode, &map); if (rc > 0) { rtems_rfs_inode_close (fs, &inode); return rc; } rc = rtems_rfs_block_map_grow (fs, &map, 1, &block); if (rc > 0) { rtems_rfs_block_map_close (fs, &map); rtems_rfs_inode_close (fs, &inode); return rc; } rc = rtems_rfs_buffer_handle_open (fs, &buffer); if (rc > 0) { rtems_rfs_block_map_close (fs, &map); rtems_rfs_inode_close (fs, &inode); return rc; } rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, false); if (rc > 0) { rtems_rfs_block_map_close (fs, &map); rtems_rfs_inode_close (fs, &inode); return rc; } data = rtems_rfs_buffer_data (&buffer); memset (data, 0xff, rtems_rfs_fs_block_size (fs)); memcpy (data, link, link_length); rc = rtems_rfs_buffer_handle_close (fs, &buffer); if (rc > 0) { rtems_rfs_block_map_close (fs, &map); rtems_rfs_inode_close (fs, &inode); return rc; } rc = rtems_rfs_block_map_close (fs, &map); if (rc > 0) { rtems_rfs_inode_close (fs, &inode); return rc; } } rtems_rfs_inode_set_block_offset (&inode, link_length); rc = rtems_rfs_inode_close (fs, &inode); return rc; }