static int rtems_rfs_rtems_utime(const rtems_filesystem_location_info_t* pathloc, time_t atime, time_t mtime) { rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc); rtems_rfs_ino ino = rtems_rfs_rtems_get_pathloc_ino (pathloc); rtems_rfs_inode_handle inode; int rc; rc = rtems_rfs_inode_open (fs, ino, &inode, true); if (rc) { return rtems_rfs_rtems_error ("utime: read inode", rc); } rtems_rfs_inode_set_atime (&inode, atime); rtems_rfs_inode_set_mtime (&inode, mtime); rc = rtems_rfs_inode_close (fs, &inode); if (rc) { return rtems_rfs_rtems_error ("utime: closing inode", rc); } return 0; }
int rtems_rfs_inode_time_stamp_now (rtems_rfs_inode_handle* handle, bool atime, bool mtime) { time_t now; if (!rtems_rfs_inode_is_loaded (handle)) return ENXIO; now = time (NULL); if (atime) rtems_rfs_inode_set_atime (handle, now); if (mtime) rtems_rfs_inode_set_mtime (handle, now); return 0; }
int rtems_rfs_file_close (rtems_rfs_file_system* fs, rtems_rfs_file_handle* handle) { int rrc; int rc; rrc = 0; if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE)) printf ("rtems-rfs: file-close: entry: ino=%" PRId32 "\n", handle->shared->inode.ino); if (handle->shared->references > 0) handle->shared->references--; if (handle->shared->references == 0) { if (!rtems_rfs_inode_is_loaded (&handle->shared->inode)) rrc = rtems_rfs_inode_load (fs, &handle->shared->inode); if (rrc == 0) { /* * @todo This could be clever and only update if different. */ rtems_rfs_inode_set_atime (&handle->shared->inode, handle->shared->atime); rtems_rfs_inode_set_mtime (&handle->shared->inode, handle->shared->mtime); rtems_rfs_inode_set_ctime (&handle->shared->inode, handle->shared->ctime); if (!rtems_rfs_block_size_equal (&handle->shared->size, &handle->shared->map.size)) rtems_rfs_block_map_set_size (&handle->shared->map, &handle->shared->size); } rc = rtems_rfs_block_map_close (fs, &handle->shared->map); if (rc > 0) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE)) printf ("rtems-rfs: file-close: map close error: ino=%" PRId32 ": %d: %s\n", handle->shared->inode.ino, rc, strerror (rc)); if (rrc == 0) rrc = rc; } rc = rtems_rfs_inode_close (fs, &handle->shared->inode); if (rc > 0) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE)) printf ("rtems-rfs: file-close: inode close error: ino=%" PRId32 ": %d: %s\n", handle->shared->inode.ino, rc, strerror (rc)); if (rrc == 0) rrc = rc; } rtems_chain_extract (&handle->shared->link); free (handle->shared); } rc = rtems_rfs_buffer_handle_close (fs, &handle->buffer); if ((rrc == 0) && (rc > 0)) rrc = rc; if (rrc > 0) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE)) printf ("rtems-rfs: file-close: result: %d: %s\n", rrc, strerror (rrc)); } free (handle); return rrc; }