int yaffs_read(int fd, void *buf, unsigned int nbyte) { yaffsfs_Handle *h = NULL; yaffs_Object *obj = NULL; int pos = 0; int nRead = -1; int maxRead; yaffsfs_Lock(); h = yaffsfs_GetHandlePointer(fd); obj = yaffsfs_GetHandleObject(fd); if(!h || !obj) { // bad handle yaffsfs_SetError(-EBADF); } else if( h && obj) { pos= h->position; if(yaffs_GetObjectFileLength(obj) > pos) { maxRead = yaffs_GetObjectFileLength(obj) - pos; } else { maxRead = 0; } if(nbyte > maxRead) { nbyte = maxRead; } if(nbyte > 0) { nRead = yaffs_ReadDataFromFile(obj,buf,pos,nbyte); if(nRead >= 0) { h->position = pos + nRead; } else { //todo error } } else { nRead = 0; } } yaffsfs_Unlock(); return (nRead >= 0) ? nRead : -1; }
off_t yaffs_lseek(int fd, off_t offset, int whence) { yaffsfs_Handle *h = NULL; yaffs_Object *obj = NULL; int pos = -1; int fSize = -1; yaffsfs_Lock(); h = yaffsfs_GetHandlePointer(fd); obj = yaffsfs_GetHandleObject(fd); if(!h || !obj) { // bad handle yaffsfs_SetError(-EBADF); } else if(whence == SEEK_SET) { if(offset >= 0) { pos = offset; } } else if(whence == SEEK_CUR) { if( (h->position + offset) >= 0) { pos = (h->position + offset); } } else if(whence == SEEK_END) { fSize = yaffs_GetObjectFileLength(obj); if(fSize >= 0 && (fSize + offset) >= 0) { pos = fSize + offset; } } if(pos >= 0) { h->position = pos; } else { // todo error } yaffsfs_Unlock(); return pos; }
int yaffs_write(int fd, const void *buf, unsigned int nbyte) { yaffsfs_Handle *h = NULL; yaffs_Object *obj = NULL; int pos = 0; int nWritten = -1; yaffsfs_Lock(); h = yaffsfs_GetHandlePointer(fd); obj = yaffsfs_GetHandleObject(fd); if(!h || !obj) { // bad handle yaffsfs_SetError(-EBADF); } else if( h && obj && h->readOnly) { // todo error } else if( h && obj) { if(h->append) { pos = yaffs_GetObjectFileLength(obj); } else { pos = h->position; } nWritten = yaffs_WriteDataToFile(obj,buf,pos,nbyte); if(nWritten >= 0) { h->position = pos + nWritten; } else { //todo error } } yaffsfs_Unlock(); return (nWritten >= 0) ? nWritten : -1; }
static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object * obj) { if (inode && obj) { __u32 mode = obj->yst_mode; switch( obj->variantType ){ case YAFFS_OBJECT_TYPE_FILE : if( ! S_ISREG(mode) ){ obj->yst_mode &= ~S_IFMT; obj->yst_mode |= S_IFREG; } break; case YAFFS_OBJECT_TYPE_SYMLINK : if( ! S_ISLNK(mode) ){ obj->yst_mode &= ~S_IFMT; obj->yst_mode |= S_IFLNK; } break; case YAFFS_OBJECT_TYPE_DIRECTORY : if( ! S_ISDIR(mode) ){ obj->yst_mode &= ~S_IFMT; obj->yst_mode |= S_IFDIR; } break; case YAFFS_OBJECT_TYPE_UNKNOWN : case YAFFS_OBJECT_TYPE_HARDLINK : case YAFFS_OBJECT_TYPE_SPECIAL : default: break; } inode->i_ino = obj->objectId; inode->i_mode = obj->yst_mode; inode->i_uid = obj->yst_uid; inode->i_gid = obj->yst_gid; inode->i_blksize = inode->i_sb->s_blocksize; #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) inode->i_rdev = old_decode_dev(obj->yst_rdev); inode->i_atime.tv_sec = (time_t) (obj->yst_atime); inode->i_atime.tv_nsec = 0; inode->i_mtime.tv_sec = (time_t) obj->yst_mtime; inode->i_mtime.tv_nsec = 0; inode->i_ctime.tv_sec = (time_t) obj->yst_ctime; inode->i_ctime.tv_nsec = 0; #else inode->i_rdev = obj->yst_rdev; inode->i_atime = obj->yst_atime; inode->i_mtime = obj->yst_mtime; inode->i_ctime = obj->yst_ctime; #endif inode->i_size = yaffs_GetObjectFileLength(obj); inode->i_blocks = (inode->i_size + 511) >> 9; inode->i_nlink = yaffs_GetObjectLinkCount(obj); T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_FillInode mode %x uid %d gid %d size %d count %d\n", inode->i_mode, inode->i_uid, inode->i_gid, (int)inode->i_size, atomic_read(&inode->i_count))); switch (obj->yst_mode & S_IFMT) { default: #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) init_special_inode(inode, obj->yst_mode, old_decode_dev(obj->yst_rdev)); #else init_special_inode(inode, obj->yst_mode, (dev_t) (obj->yst_rdev)); #endif break; case S_IFREG: inode->i_op = &yaffs_file_inode_operations; inode->i_fop = &yaffs_file_operations; inode->i_mapping->a_ops = &yaffs_file_address_operations; break; case S_IFDIR: inode->i_op = &yaffs_dir_inode_operations; inode->i_fop = &yaffs_dir_operations; break; case S_IFLNK: inode->i_op = &yaffs_symlink_inode_operations; break; } inode->u.generic_ip = obj; obj->myInode = inode; } else {