⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yaffsfs.c

📁 yaffs2 lastest sourcecode~~
💻 C
📖 第 1 页 / 共 3 页
字号:
	{		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;}int yaffs_pread(int fd, void *buf, unsigned int nbyte, unsigned int offset){	yaffsfs_Handle *h = NULL;	yaffs_Object *obj = NULL;	int pos = 0;	int nRead = -1;	unsigned 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= offset;		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);		}		else		{			nRead = 0;		}	}	yaffsfs_Unlock();	return (nRead >= 0) ? nRead : -1;}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;	int writeThrough = 0;	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,writeThrough);		if(nWritten >= 0)		{			h->position = pos + nWritten;		}		else		{			//todo error		}	}	yaffsfs_Unlock();	return (nWritten >= 0) ? nWritten : -1;}int yaffs_pwrite(int fd, const void *buf, unsigned int nbyte, unsigned int offset){	yaffsfs_Handle *h = NULL;	yaffs_Object *obj = NULL;	int pos = 0;	int nWritten = -1;	int writeThrough = 0;	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)	{		pos = offset;                nWritten = yaffs_WriteDataToFile(obj,buf,pos,nbyte,writeThrough);                if(nWritten < 0 || ((unsigned int)nWritten) < nbyte)                        yaffsfs_SetError(-ENOSPC);        }	yaffsfs_Unlock();	return (nWritten >= 0) ? nWritten : -1;}int yaffs_truncate(const YCHAR *path,off_t newSize){	yaffs_Object *obj = NULL;	int result = YAFFS_FAIL;	yaffsfs_Lock();	obj = yaffsfs_FindObject(NULL,path,0);	if(obj)		obj = yaffs_GetEquivalentObject(obj);	if(!obj)	{		yaffsfs_SetError(-ENOENT);	}	else if(obj->variantType != YAFFS_OBJECT_TYPE_FILE)	{		yaffsfs_SetError(-EISDIR);	}	else	{		result = yaffs_ResizeFile(obj,newSize);	}	yaffsfs_Unlock();	return (result) ? 0 : -1;}int yaffs_ftruncate(int fd, off_t newSize){	yaffsfs_Handle *h = NULL;	yaffs_Object *obj = NULL;	int result = 0;	yaffsfs_Lock();	h = yaffsfs_GetHandlePointer(fd);	obj = yaffsfs_GetHandleObject(fd);	if(!h || !obj)	{		// bad handle		yaffsfs_SetError(-EBADF);	}	else	{		// resize the file		result = yaffs_ResizeFile(obj,newSize);	}	yaffsfs_Unlock();	return (result) ? 0 : -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 yaffsfs_DoUnlink(const YCHAR *path,int isDirectory){	yaffs_Object *dir = NULL;	yaffs_Object *obj = NULL;	YCHAR *name;	int result = YAFFS_FAIL;	yaffsfs_Lock();	obj = yaffsfs_FindObject(NULL,path,0);	dir = yaffsfs_FindDirectory(NULL,path,&name,0);	if(!dir)	{		yaffsfs_SetError(-ENOTDIR);	}	else if(!obj)	{		yaffsfs_SetError(-ENOENT);	}	else if(!isDirectory && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)	{		yaffsfs_SetError(-EISDIR);	}	else if(isDirectory && obj->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)	{		yaffsfs_SetError(-ENOTDIR);	}	else	{		result = yaffs_Unlink(dir,name);		if(result == YAFFS_FAIL && isDirectory)		{			yaffsfs_SetError(-ENOTEMPTY);		}	}	yaffsfs_Unlock();	// todo error	return (result == YAFFS_FAIL) ? -1 : 0;}int yaffs_rmdir(const YCHAR *path){	return yaffsfs_DoUnlink(path,1);}int yaffs_unlink(const YCHAR *path){	return yaffsfs_DoUnlink(path,0);}int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath){	yaffs_Object *olddir = NULL;	yaffs_Object *newdir = NULL;	yaffs_Object *obj = NULL;	YCHAR *oldname;	YCHAR *newname;	int result= YAFFS_FAIL;	int renameAllowed = 1;	yaffsfs_Lock();	olddir = yaffsfs_FindDirectory(NULL,oldPath,&oldname,0);	newdir = yaffsfs_FindDirectory(NULL,newPath,&newname,0);	obj = yaffsfs_FindObject(NULL,oldPath,0);	if(!olddir || !newdir || !obj)	{		// bad file		yaffsfs_SetError(-EBADF);		renameAllowed = 0;	}	else if(olddir->myDev != newdir->myDev)	{		// oops must be on same device		// todo error		yaffsfs_SetError(-EXDEV);		renameAllowed = 0;	}	else if(obj && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)	{		// It is a directory, check that it is not being renamed to		// being its own decendent.		// Do this by tracing from the new directory back to the root, checking for obj		yaffs_Object *xx = newdir;		while( renameAllowed && xx)		{			if(xx == obj)			{				renameAllowed = 0;			}			xx = xx->parent;		}		if(!renameAllowed) yaffsfs_SetError(-EACCES);	}	if(renameAllowed)	{		result = yaffs_RenameObject(olddir,oldname,newdir,newname);	}	yaffsfs_Unlock();	return (result == YAFFS_FAIL) ? -1 : 0;}static int yaffsfs_DoStat(yaffs_Object *obj,struct yaffs_stat *buf){	int retVal = -1;	if(obj)	{		obj = yaffs_GetEquivalentObject(obj);	}	if(obj && buf)	{    	buf->st_dev = (int)obj->myDev->genericDevice;    	buf->st_ino = obj->objectId;    	buf->st_mode = obj->yst_mode & ~S_IFMT; // clear out file type bits		if(obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)		{			buf->st_mode |= S_IFDIR;		}		else if(obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)		{			buf->st_mode |= S_IFLNK;		}		else if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)		{			buf->st_mode |= S_IFREG;		}    	buf->st_nlink = yaffs_GetObjectLinkCount(obj);    	buf->st_uid = 0;    	buf->st_gid = 0;;    	buf->st_rdev = obj->yst_rdev;    	buf->st_size = yaffs_GetObjectFileLength(obj);		buf->st_blksize = obj->myDev->nDataBytesPerChunk;    	buf->st_blocks = (buf->st_size + buf->st_blksize -1)/buf->st_blksize;#if CONFIG_YAFFS_WINCE		buf->yst_wince_atime[0] = obj->win_atime[0];		buf->yst_wince_atime[1] = obj->win_atime[1];		buf->yst_wince_ctime[0] = obj->win_ctime[0];		buf->yst_wince_ctime[1] = obj->win_ctime[1];		buf->yst_wince_mtime[0] = obj->win_mtime[0];		buf->yst_wince_mtime[1] = obj->win_mtime[1];#else    	buf->yst_atime = obj->yst_atime;    	buf->yst_ctime = obj->yst_ctime;    	buf->yst_mtime = obj->yst_mtime;#endif		retVal = 0;	}	return retVal;}static int yaffsfs_DoStatOrLStat(const YCHAR *path, struct yaffs_stat *buf,int doLStat){	yaffs_Object *obj;	int retVal = -1;	yaffsfs_Lock();	obj = yaffsfs_FindObject(NULL,path,0);	if(!doLStat && obj)	{		obj = yaffsfs_FollowLink(obj,0);	}	if(obj)	{		retVal = yaffsfs_DoStat(obj,buf);	}	else	{		// todo error not found		yaffsfs_SetError(-ENOENT);	}	yaffsfs_Unlock();	return retVal;}int yaffs_stat(const YCHAR *path, struct yaffs_stat *buf){	return yaffsfs_DoStatOrLStat(path,buf,0);}int yaffs_lstat(const YCHAR *path, struct yaffs_stat *buf){	return yaffsfs_DoStatOrLStat(path,buf,1);}int yaffs_fstat(int fd, struct yaffs_stat *buf){	yaffs_Object *obj;	int retVal = -1;	yaffsfs_Lock();	obj = yaffsfs_GetHandleObject(fd);	if(obj)	{		retVal = yaffsfs_DoStat(obj,buf);	}	else	{		// bad handle		yaffsfs_SetError(-EBADF);	}	yaffsfs_Unlock();	return retVal;}#ifdef CONFIG_YAFFS_WINCEint yaffs_get_wince_times(int fd, unsigned *wctime, unsigned *watime, unsigned *wmtime){	yaffs_Object *obj;	int retVal = -1;	yaffsfs_Lock();	obj = yaffsfs_GetHandleObject(fd);	if(obj)	{		if(wctime){			wctime[0] = obj->win_ctime[0];			wctime[1] = obj->win_ctime[1];		}		if(watime){			watime[0] = obj->win_atime[0];			watime[1] = obj->win_atime[1];		}		if(wmtime){			wmtime[0] = obj->win_mtime[0];			wmtime[1] = obj->win_mtime[1];		}		retVal = 0;	}	else	{		// bad handle		yaffsfs_SetError(-EBADF);			}		yaffsfs_Unlock();		return retVal;}int yaffs_set_wince_times(int fd, 						  const unsigned *wctime, 						  const unsigned *watime,                                                   const unsigned *wmtime){        yaffs_Object *obj;        int result;        int retVal = -1;        yaffsfs_Lock();	obj = yaffsfs_GetHandleObject(fd);	if(obj)	{		if(wctime){			obj->win_ctime[0] = wctime[0];			obj->win_ctime[1] = wctime[1];		}		if(watime){                        obj->win_atime[0] = watime[0];                        obj->win_atime[1] = watime[1];                }                if(wmtime){                        obj->win_mtime[0] = wmtime[0];                        obj->win_mtime[1] = wmtime[1];                }                obj->dirty = 1;                result = yaffs_FlushFile(obj,0);                retVal = 0;        }        else	{		// bad handle		yaffsfs_SetError(-EBADF);	}	yaffsfs_Unlock();	return retVal;}#endifstatic int yaffsfs_DoChMod(yaffs_Object *obj,mode_t mode){	int result = -1;	if(obj)	{		obj = yaffs_GetEquivalentObject(obj);	}	if(obj)	{		obj->yst_mode = mode;		obj->dirty = 1;		result = yaffs_FlushFile(obj,0);	}	return result == YAFFS_OK ? 0 : -1;}int yaffs_access(const YCHAR *path, int amode){	yaffs_Object *obj;	int retval = 0;	yaffsfs_Lock();	obj = yaffsfs_FindObject(NULL,path,0);	if(obj)	{		int access_ok = 1;		if((amode & R_OK) && !(obj->yst_mode & S_IREAD))			access_ok = 0;		if((amode & W_OK) && !(obj->yst_mode & S_IWRITE))			access_ok = 0;		if((amode & X_OK) && !(obj->yst_mode & S_IEXEC))			access_ok = 0;		if(!access_ok) {			yaffsfs_SetError(-EACCES);			retval = -1;		}	}	else	{		// todo error not found		yaffsfs_SetError(-ENOENT);		retval = -1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -