コード例 #1
0
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;
}
コード例 #2
0
ファイル: filesystem.c プロジェクト: BigEd/pyldin
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;
}
コード例 #3
0
ファイル: sdcard-arch.c プロジェクト: gnkarn/Contiki
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;
}
コード例 #4
0
ファイル: efs.c プロジェクト: samkrew/nxp-lpc
/**
 * 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;
}
コード例 #5
0
ファイル: file.c プロジェクト: ece492-w16-g7/ece492_w16
/* ***************************************************************************\
 * 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);
}