long file_length(filetype *fp) { long cur, length; cur = file_getpos(fp); file_setpos(fp, 0, seek_end); length = file_getpos(fp); file_setpos(fp, cur, seek_set); return length; }
static _off_t wrap_fs_lseek(struct _reent *r, int file, _off_t ptr, int dir) { if (fd_list[file].used) { euint32 offset = 0; switch (dir) { case SEEK_SET: offset = ptr; break; case SEEK_CUR: offset = fd_list[file].file->FilePtr + ptr; break; case SEEK_END: offset = fd_list[file].file->FileSize + ptr; break; default: r->_errno = EINVAL; return -1; } if (file_setpos(fd_list[file].file, offset)) { r->_errno = EINVAL; return -1; } return offset; } r->_errno = EBADF; return -1; }
cfs_offset_t cfs_seek (int fd, cfs_offset_t offset, int whence) { File *file = get_file(fd); if (!file) return 0; /* TODO take whence int account */ if (file_setpos(file, offset) != 0) return -1; return file->FilePtr; }
/** * This function will set a hook function, which will be invoked when a memory * block is allocated from heap memory. * * @param hook the hook function */ int efs_lseek(struct dfs_fd* file, rt_off_t offset) { int result = 0; DirList* efsdir; efsl_fs* efsfs = (efsl_fs *)file->fs->data; /* parameter check */ RT_ASSERT(efsfs != RT_NULL); /* seek directory */ if(file->flags & DFS_O_DIRECTORY) { efsdir = (DirList*)file->data; /* only support offset equels zero */ if(offset == 0) { result = ls_openDir(efsdir, &efsfs->filesystem, file->path); if(result < 0) { dfs_log(DFS_DEBUG_INFO, ("open directory %s failed", file->path)); } } /* should implement in future version */ else { dfs_log(DFS_DEBUG_INFO, ("not implement")); } } /* seek file */ else { File* efsfile = file->data; /* parameter check */ if ( efsfile == RT_NULL) return -DFS_STATUS_EBADF; result = file_setpos(efsfile, offset); } return result; }
/* ***************************************************************************\ * signed eint8 file_fopen(FileSystem *fs,File* file,eint8* filename) * Description: This functions opens a file. * This function is about to be redesigned. No Docs. * Return value: */ esint8 file_fopen(File* file,FileSystem *fs,eint8* filename,eint8 mode) { FileLocation loc; FileRecord wtmp; eint8 fatfilename[LIST_MAXLENFILENAME]; euint32 sec; dir_getFatFileName(filename,fatfilename); switch(mode) { case MODE_READ: if(fs_findFile(fs,filename,&loc,0)==1) { dir_getFileStructure(fs,&(file->DirEntry), &loc); file_initFile(file,fs,&loc); file_setAttr(file,FILE_STATUS_OPEN,1); file_setAttr(file,FILE_STATUS_WRITE,0); return(0); } return(-1); break; case MODE_WRITE: if(fs_findFile(fs,filename,&loc,&sec)) /* File may NOT exist, but parent HAS to exist */ { return(-2); } if(sec==0){ /* Parent dir does not exist */ return(-4); } if(fs_findFreeFile(fs,filename,&loc,0)) { dir_createDefaultEntry(fs,&wtmp,fatfilename); dir_createDirectoryEntry(fs,&wtmp,&loc); memCpy(&wtmp,&(file->DirEntry),sizeof(wtmp)); file_initFile(file,fs,&loc); sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); dir_setFirstCluster(file->fs,&(file->Location),sec); fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); fs_initClusterChain(fs,&(file->Cache),sec); fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); file_setAttr(file,FILE_STATUS_OPEN,1); file_setAttr(file,FILE_STATUS_WRITE,1); return(0); } else { return(-3); } break; case MODE_APPEND: if(fs_findFile(fs,filename,&loc,0)==1) /* File exists */ { dir_getFileStructure(fs,&(file->DirEntry), &loc); file_initFile(file,fs,&loc); if(file->Cache.FirstCluster==0){ sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); dir_setFirstCluster(file->fs,&(file->Location),sec); fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); file_initFile(file,fs,&loc); } file_setpos(file,file->FileSize); file_setAttr(file,FILE_STATUS_OPEN,1); file_setAttr(file,FILE_STATUS_WRITE,1); } else /* File does not excist */ { if(fs_findFreeFile(fs,filename,&loc,0)) { dir_createDefaultEntry(fs,&wtmp,fatfilename); dir_createDirectoryEntry(fs,&wtmp,&loc); memCpy(&wtmp,&(file->DirEntry),sizeof(wtmp)); file_initFile(file,fs,&loc); sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); dir_setFirstCluster(file->fs,&(file->Location),sec); fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); fs_initClusterChain(fs,&(file->Cache),sec); fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); file_setAttr(file,FILE_STATUS_OPEN,1); file_setAttr(file,FILE_STATUS_WRITE,1); } else { return(-3); } } return(0); break; default: return(-4); break; } return(-5); }