亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? yaffsfs.c

?? USBONs3c2410.rar
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * YAFFS: Yet another FFS. A NAND-flash specific file system. * yaffsfs.c  The interface functions for using YAFFS via a "direct" interface. * * Copyright (C) 2002 Aleph One Ltd. * * Created by Charles Manning <charles@aleph1.co.uk> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */ #include "yaffsfs.h"#include "yaffs_guts.h"#include "yaffscfg.h"#include <string.h> // for memset#include "yportenv.h"#define YAFFSFS_MAX_SYMLINK_DEREFERENCES 5#ifndef NULL#define NULL ((void *)0)#endifconst char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.7 2004/11/21 23:33:30 charles Exp $";// configurationList is the list of devices that are supportedstatic yaffsfs_DeviceConfiguration *yaffsfs_configurationList;//// Directory search context//// NB this is an opaque structure.struct yaffsfs_ObjectListEntry{	int objectId;	struct yaffsfs_ObjectListEntry *next;};typedef struct{	__u32 magic;	yaffs_dirent de;	struct yaffsfs_ObjectListEntry *list;	char name[NAME_MAX+1];	} yaffsfs_DirectorySearchContext;// Handle management.// typedef struct{	__u8  inUse:1;		// this handle is in use	__u8  readOnly:1;	// this handle is read only	__u8  append:1;		// append only	__u8  exclusive:1;	// exclusive	__u32 position;		// current position in file	yaffs_Object *obj;	// the object}yaffsfs_Handle;static yaffs_Object *yaffsfs_FindObject(yaffs_Object *relativeDirectory, const char *path, int symDepth);static yaffsfs_Handle yaffsfs_handle[YAFFSFS_N_HANDLES];// yaffsfs_InitHandle/// Inilitalise handles on start-up.//static int yaffsfs_InitHandles(void){	int i;	for(i = 0; i < YAFFSFS_N_HANDLES; i++)	{		yaffsfs_handle[i].inUse = 0;		yaffsfs_handle[i].obj = NULL;	}	return 0;}yaffsfs_Handle *yaffsfs_GetHandlePointer(int h){	if(h < 0 || h >= YAFFSFS_N_HANDLES)	{		return NULL;	}		return &yaffsfs_handle[h];}yaffs_Object *yaffsfs_GetHandleObject(int handle){	yaffsfs_Handle *h = yaffsfs_GetHandlePointer(handle);	if(h && h->inUse)	{		return h->obj;	}		return NULL;}//yaffsfs_GetHandle// Grab a handle (when opening a file)//static int yaffsfs_GetHandle(void){	int i;	yaffsfs_Handle *h;		for(i = 0; i < YAFFSFS_N_HANDLES; i++)	{		h = yaffsfs_GetHandlePointer(i);		if(!h)		{			// todo bug: should never happen		}		if(!h->inUse)		{			memset(h,0,sizeof(yaffsfs_Handle));			h->inUse=1;			return i;		}	}	return -1;}// yaffs_PutHandle// Let go of a handle (when closing a file)//static int yaffsfs_PutHandle(int handle){	yaffsfs_Handle *h = yaffsfs_GetHandlePointer(handle);		if(h)	{		h->inUse = 0;		h->obj = NULL;	}	return 0;}// Stuff to search for a directory from a pathint yaffsfs_Match(char a, char b){	// case sensitive	return (a == b);}// yaffsfs_FindDevice// yaffsfs_FindRoot// Scan the configuration list to find the root.static yaffs_Device *yaffsfs_FindDevice(const char *path, char **restOfPath){	yaffsfs_DeviceConfiguration *cfg = yaffsfs_configurationList;	const char *leftOver;	const char *p;		while(cfg && cfg->prefix && cfg->dev)	{		leftOver = path;		p = cfg->prefix;		while(*p && *leftOver && yaffsfs_Match(*p,*leftOver))		{			p++;			leftOver++;		}		if(!*p && (!*leftOver || *leftOver == '/'))		{			// Matched prefix			*restOfPath = (char *)leftOver;			return cfg->dev;		}		cfg++;	}	return NULL;}static yaffs_Object *yaffsfs_FindRoot(const char *path, char **restOfPath){	yaffs_Device *dev;		dev= yaffsfs_FindDevice(path,restOfPath);	if(dev && dev->isMounted)	{		return dev->rootDir;	}	return NULL;}static yaffs_Object *yaffsfs_FollowLink(yaffs_Object *obj,int symDepth){	while(obj && obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)	{		char *alias = obj->variant.symLinkVariant.alias;								if(*alias == '/')		{			// Starts with a /, need to scan from root up			obj = yaffsfs_FindObject(NULL,alias,symDepth++);		}		else		{			// Relative to here, so use the parent of the symlink as a start			obj = yaffsfs_FindObject(obj->parent,alias,symDepth++);		}	}	return obj;}// yaffsfs_FindDirectory// Parse a path to determine the directory and the name within the directory.//// eg. "/data/xx/ff" --> puts name="ff" and returns the directory "/data/xx"static yaffs_Object *yaffsfs_DoFindDirectory(yaffs_Object *startDir,const char *path,char **name,int symDepth){	yaffs_Object *dir;	char *restOfPath;	char str[YAFFS_MAX_NAME_LENGTH+1];	int i;		if(symDepth > YAFFSFS_MAX_SYMLINK_DEREFERENCES)	{		return NULL;	}		if(startDir)	{		dir = startDir;		restOfPath = (char *)path;	}	else	{		dir = yaffsfs_FindRoot(path,&restOfPath);	}		while(dir)	{			// parse off /.		// curve ball: also throw away surplus '/' 		// eg. "/ram/x////ff" gets treated the same as "/ram/x/ff"		while(*restOfPath == '/')		{			restOfPath++; // get rid of '/'		}				*name = restOfPath;		i = 0;				while(*restOfPath && *restOfPath != '/')		{			if (i < YAFFS_MAX_NAME_LENGTH)			{				str[i] = *restOfPath;				str[i+1] = '\0';				i++;			}			restOfPath++;		}				if(!*restOfPath)		{			// got to the end of the string			return dir;		}		else		{			if(strcmp(str,".") == 0)			{				// Do nothing			}			else if(strcmp(str,"..") == 0)			{				dir = dir->parent;			}			else			{				dir = yaffs_FindObjectByName(dir,str);								while(dir && dir->variantType == YAFFS_OBJECT_TYPE_SYMLINK)				{									dir = yaffsfs_FollowLink(dir,symDepth);						}								if(dir && dir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)				{					dir = NULL;				}			}		}	}	// directory did not exist.	return NULL;}static yaffs_Object *yaffsfs_FindDirectory(yaffs_Object *relativeDirectory,const char *path,char **name,int symDepth){	return yaffsfs_DoFindDirectory(relativeDirectory,path,name,symDepth);}// yaffsfs_FindObject turns a path for an existing object into the object// static yaffs_Object *yaffsfs_FindObject(yaffs_Object *relativeDirectory, const char *path,int symDepth){	yaffs_Object *dir;	char *name;		dir = yaffsfs_FindDirectory(relativeDirectory,path,&name,symDepth);		if(dir && *name)	{		return yaffs_FindObjectByName(dir,name);	}		return dir;}int yaffs_open(const char *path, int oflag, int mode){	yaffs_Object *obj = NULL;	yaffs_Object *dir = NULL;	char *name;	int handle = -1;	yaffsfs_Handle *h = NULL;	int alreadyOpen = 0;	int alreadyExclusive = 0;	int openDenied = 0;	int symDepth = 0;	int errorReported = 0;		int i;			// todo sanity check oflag (eg. can't have O_TRUNC without WRONLY or RDWR			yaffsfs_Lock();		handle = yaffsfs_GetHandle();		if(handle >= 0)	{		h = yaffsfs_GetHandlePointer(handle);				// try to find the exisiting object		obj = yaffsfs_FindObject(NULL,path,0);				if(obj && obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)		{					obj = yaffsfs_FollowLink(obj,symDepth++);		}		if(obj)		{			// Check if the object is already in use			alreadyOpen = alreadyExclusive = 0;						for(i = 0; i <= YAFFSFS_N_HANDLES; i++)			{								if(i != handle &&				   yaffsfs_handle[i].inUse &&				    obj == yaffsfs_handle[i].obj)				 {				 	alreadyOpen = 1;					if(yaffsfs_handle[i].exclusive)					{						alreadyExclusive = 1;					}				 }			}			if(((oflag & O_EXCL) && alreadyOpen) || alreadyExclusive)			{				openDenied = 1;			}						// Open should fail if O_CREAT and O_EXCL are specified			if((oflag & O_EXCL) && (oflag & O_CREAT))			{				openDenied = 1;				yaffsfs_SetError(-EEXIST);				errorReported = 1;			}						// Check file permissions			if( (oflag & (O_RDWR | O_WRONLY)) == 0 &&     // ie O_RDONLY			   !(obj->st_mode & S_IREAD))			{				openDenied = 1;			}			if( (oflag & O_RDWR) && 			   !(obj->st_mode & S_IREAD))			{				openDenied = 1;			}			if( (oflag & (O_RDWR | O_WRONLY)) && 			   !(obj->st_mode & S_IWRITE))			{				openDenied = 1;			}					}				else if((oflag & O_CREAT))		{			// Let's see if we can create this file			dir = yaffsfs_FindDirectory(NULL,path,&name,0);			if(dir)			{				obj = yaffs_MknodFile(dir,name,mode,0,0);				}			else			{				yaffsfs_SetError(-ENOTDIR);			}		}				if(obj && !openDenied)		{			h->obj = obj;			h->inUse = 1;	    	h->readOnly = (oflag & (O_WRONLY | O_RDWR)) ? 0 : 1;			h->append =  (oflag & O_APPEND) ? 1 : 0;			h->exclusive = (oflag & O_EXCL) ? 1 : 0;			h->position = 0;						obj->inUse++;			if((oflag & O_TRUNC) && !h->readOnly)			{				//todo truncate				yaffs_ResizeFile(obj,0);			}					}		else		{			yaffsfs_PutHandle(handle);#ifndef ADSARM			if(!errorReported)			{				yaffsfs_SetError(-EACCESS);				errorReported = 1;			}#else			if(!obj)			{				yaffsfs_SetError(-EDISKFULL);			}			if(!errorReported)errorReported=1;			handle = -1;#endif		}			}		yaffsfs_Unlock();		return handle;		}int yaffs_close(int fd){	yaffsfs_Handle *h = NULL;	int retVal = 0;		yaffsfs_Lock();	h = yaffsfs_GetHandlePointer(fd);		if(h && h->inUse)	{		// clean up		yaffs_FlushFile(h->obj,1);		h->obj->inUse--;		if(h->obj->inUse <= 0 && h->obj->unlinked)		{			yaffs_DeleteFile(h->obj);		}		yaffsfs_PutHandle(fd);		retVal = 0;	}	else	{		// bad handle		yaffsfs_SetError(-EBADF);				retVal = -1;	}		yaffsfs_Unlock();		return retVal;}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);    //將讀取的字節(jié)數(shù)返回給nRead			if(nRead >= 0)			{				h->position = pos + nRead;			}			else			{				//todo error			}		}		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;		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;}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 char *path,int isDirectory) {	yaffs_Object *dir = NULL;	yaffs_Object *obj = NULL;	char *name;	int result = YAFFS_FAIL;		yaffsfs_Lock();	Uart_Printf("10 \r\n");	obj = yaffsfs_FindObject(NULL,path,0);	dir = yaffsfs_FindDirectory(NULL,path,&name,0);	if(!dir)	{		yaffsfs_SetError(-ENOTDIR);		Uart_Printf("1 \r\n");	}	else if(!obj)	{		yaffsfs_SetError(-ENOENT);		Uart_Printf("2 \r\n");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本伊人精品一区二区三区观看方式| 日韩精品福利网| 3d成人动漫网站| 成人avav影音| 麻豆成人久久精品二区三区小说| 国产欧美日韩精品在线| 欧美午夜精品一区二区三区| 福利一区二区在线观看| 日韩电影在线一区| 亚洲精品日日夜夜| 精品88久久久久88久久久| 在线精品视频免费观看| 国产激情视频一区二区在线观看 | 91蜜桃网址入口| 精品在线一区二区| 日韩高清欧美激情| 亚洲精品日韩综合观看成人91| 精品久久久久久久久久久院品网| 欧美日韩视频不卡| 色中色一区二区| 国产精品456露脸| 精品一区二区久久久| 婷婷综合久久一区二区三区| 中文字幕一区二区三区色视频| 欧美mv日韩mv| 日韩免费性生活视频播放| 欧美日韩精品三区| 欧美男生操女生| 欧美日韩一区不卡| 日本高清不卡一区| 色婷婷综合久色| 99视频一区二区| a级精品国产片在线观看| 国产乱国产乱300精品| 美国av一区二区| 蜜臀av在线播放一区二区三区| 亚洲gay无套男同| 天堂蜜桃一区二区三区| 丝袜a∨在线一区二区三区不卡| 亚洲制服丝袜av| 亚洲制服欧美中文字幕中文字幕| 一级中文字幕一区二区| 一区二区三区在线观看欧美| 亚洲精品高清在线观看| 国产精品久久久久影院| 亚洲国产精品ⅴa在线观看| 日本一区二区三区国色天香 | 最好看的中文字幕久久| 中文字幕亚洲不卡| 亚洲激情男女视频| 图片区小说区区亚洲影院| 日韩精品国产欧美| 精品中文av资源站在线观看| 国产乱码精品一区二区三区忘忧草| 国产精品99久久久久久宅男| 懂色av中文一区二区三区 | 成人免费黄色在线| 99久久免费精品| 欧美三级在线视频| 日韩一级大片在线观看| 久久综合久久鬼色| 最新国产の精品合集bt伙计| 亚洲情趣在线观看| 舔着乳尖日韩一区| 国产一区高清在线| 99久久综合狠狠综合久久| 欧美色精品在线视频| 日韩欧美久久久| 国产精品久久久一区麻豆最新章节| 日韩一区中文字幕| 日本中文字幕一区| 成人永久免费视频| 欧美日韩不卡一区| 国产蜜臀av在线一区二区三区| 国产精品传媒入口麻豆| 日韩精品电影在线| 风间由美性色一区二区三区| 91视频在线观看免费| 欧美一区二区美女| 中文字幕在线播放不卡一区| 图片区小说区区亚洲影院| 国产成人在线影院| 欧美日韩成人综合在线一区二区| 久久女同互慰一区二区三区| 一区二区三区高清在线| 国产在线精品不卡| 欧美三级资源在线| 国产精品久久久久永久免费观看| 婷婷久久综合九色综合伊人色| 欧美日韩一区 二区 三区 久久精品| 亚洲精品在线观看视频| 一区2区3区在线看| 国产精品1区2区3区在线观看| 欧美日韩一二三| 国产精品久久免费看| 久久99国产精品尤物| 色视频一区二区| 久久精品夜色噜噜亚洲aⅴ| 亚洲精品国产品国语在线app| 韩国成人福利片在线播放| 欧美午夜电影一区| 中文字幕乱码久久午夜不卡| 日本一区中文字幕| 在线亚洲免费视频| 国产色91在线| 久久狠狠亚洲综合| 欧美日韩精品一区二区三区| 国产精品国产馆在线真实露脸| 麻豆精品在线播放| 337p亚洲精品色噜噜| 亚洲欧美日韩在线| 成人三级伦理片| 久久久久久久精| 久久成人免费电影| 91精品国产综合久久久蜜臀图片 | 六月丁香婷婷色狠狠久久| 精品视频免费在线| 一区二区三区在线影院| 92精品国产成人观看免费 | 天天影视涩香欲综合网| 99国产欧美另类久久久精品| 国产亚洲一二三区| 国产综合久久久久久久久久久久 | 中文字幕欧美一| 东方aⅴ免费观看久久av| 欧美一级艳片视频免费观看| 亚洲激情欧美激情| 欧美激情自拍偷拍| 国产毛片一区二区| 久久蜜臀中文字幕| 国内精品久久久久影院色| 91麻豆精品国产91久久久使用方法| 亚洲另类中文字| 欧美在线|欧美| 亚洲第一成年网| 欧美日韩性生活| 三级久久三级久久久| 5月丁香婷婷综合| 欧美a一区二区| 欧美tickling网站挠脚心| 久久超碰97中文字幕| 精品日产卡一卡二卡麻豆| 麻豆精品国产91久久久久久| 日韩精品中文字幕一区二区三区| 美国一区二区三区在线播放| 日韩美女一区二区三区| 国产一区二区三区av电影| 国产清纯白嫩初高生在线观看91| 高清日韩电视剧大全免费| 国产精品污网站| 99精品一区二区三区| 伊人开心综合网| 欧美二区三区的天堂| 奇米777欧美一区二区| 久久中文字幕电影| 成av人片一区二区| 亚洲欧美视频在线观看视频| 欧美视频自拍偷拍| 久久国产精品色| 欧美国产精品久久| 日本道免费精品一区二区三区| 午夜亚洲国产au精品一区二区| 日韩一本二本av| 成人永久aaa| 亚洲国产美国国产综合一区二区 | 久久久国产精华| 91丨porny丨首页| 视频一区视频二区中文| 久久久久99精品一区| 99视频一区二区| 日韩电影免费一区| 国产精品女人毛片| 欧美日韩日日夜夜| 国产精品影视天天线| 亚洲日本韩国一区| 日韩视频在线永久播放| 成人小视频免费观看| 亚洲成人av在线电影| 久久久影院官网| 精品视频资源站| 国产一本一道久久香蕉| 亚洲自拍偷拍综合| 2014亚洲片线观看视频免费| 91麻豆免费看片| 狠狠色狠狠色综合系列| 亚洲综合一区二区三区| 精品国产a毛片| 欧洲一区在线观看| 国产成人综合在线播放| 亚洲国产精品久久不卡毛片 | 成人免费视频app| 人人超碰91尤物精品国产| 中文字幕在线观看一区| 欧美成人官网二区| 在线免费观看视频一区| 成人激情动漫在线观看| 日本在线观看不卡视频| 亚洲精品乱码久久久久久久久 | 免费美女久久99| 亚洲免费观看高清完整版在线观看|