📄 yaffsfs.c
字号:
{ 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 + -