X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=5194dd483f0c25e9568ce1913da20c9af1e86164;hp=f6654cf8e79981bda0526ef43bbd88613a65f85d;hb=26d3321e95784921c9fd24d80c9f738c57ef3aa1;hpb=c2c3fedf8a75ce6b2e747fa4604a240077cd8be4 diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index f6654cf..5194dd4 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -756,6 +756,13 @@ int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int sharing) if( writeRequested && !(obj->yst_mode & S_IWRITE)) openDenied = 1; + if( !errorReported && writeRequested && + obj->my_dev->read_only){ + openDenied = 1; + yaffsfs_SetError(-EROFS); + errorReported = 1; + } + if(openDenied && !errorReported ) { /* Error if the file exists but permissions are refused. */ yaffsfs_SetError(-EACCES); @@ -820,7 +827,7 @@ int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int sharing) if(!obj && dir && !errorReported && (oflag & O_CREAT)) { /* Let's see if we can create this file if it does not exist. */ if(dir->my_dev->read_only){ - yaffsfs_SetError(-EINVAL); + yaffsfs_SetError(-EROFS); errorReported = 1; } else obj = yaffs_create_file(dir,name,mode,0,0); @@ -881,19 +888,23 @@ int yaffs_open(const YCHAR *path, int oflag, int mode) int yaffs_Dofsync(int fd,int datasync) { yaffsfs_Handle *h = NULL; - int retVal = 0; + int retVal = -1; yaffsfs_Lock(); h = yaffsfs_GetHandlePointer(fd); - if(h && h->useCount > 0) - /* flush the file */ - yaffs_flush_file(yaffsfs_inode[h->inodeId].iObj,1,datasync); - else { - /* bad handle */ + if(!h || h->useCount < 1) yaffsfs_SetError(-EBADF); - retVal = -1; + else { + struct yaffs_obj * obj; + obj = yaffsfs_inode[h->inodeId].iObj; + if(obj->my_dev->read_only) + yaffsfs_SetError(-EROFS); + else { + yaffs_flush_file(yaffsfs_inode[h->inodeId].iObj,1,datasync); + retVal = 0; + } } yaffsfs_Unlock(); @@ -1081,9 +1092,12 @@ int yaffsfs_do_write(int fd, const void *vbuf, unsigned int nbyte, int isPwrite, /* bad handle */ yaffsfs_SetError(-EBADF); totalWritten = -1; - } else if( h && obj && (!h->writing || obj->my_dev->read_only)){ + } else if(!h->writing){ yaffsfs_SetError(-EINVAL); totalWritten=-1; + } else if(obj->my_dev->read_only){ + yaffsfs_SetError(-EROFS); + totalWritten=-1; } else { if(h->append) startPos = yaffs_get_obj_length(obj); @@ -1191,10 +1205,12 @@ int yaffs_truncate(const YCHAR *path,off_t new_size) yaffsfs_SetError(-ELOOP); else if(!dir || !obj) yaffsfs_SetError(-ENOENT); + else if(obj->my_dev->read_only) + yaffsfs_SetError(-EROFS); else if(obj->variant_type != YAFFS_OBJECT_TYPE_FILE) yaffsfs_SetError(-EISDIR); else if(obj->my_dev->read_only) - yaffsfs_SetError(-EACCES); + yaffsfs_SetError(-EROFS); else if(new_size < 0 || new_size > YAFFS_MAX_FILE_SIZE) yaffsfs_SetError(-EINVAL); else @@ -1218,8 +1234,10 @@ int yaffs_ftruncate(int fd, off_t new_size) if(!h || !obj) /* bad handle */ yaffsfs_SetError(-EBADF); + else if(!h->writing) + yaffsfs_SetError(-EINVAL); else if(obj->my_dev->read_only) - yaffsfs_SetError(-EACCES); + yaffsfs_SetError(-EROFS); else if( new_size < 0 || new_size > YAFFS_MAX_FILE_SIZE) yaffsfs_SetError(-EINVAL); else @@ -1303,7 +1321,7 @@ int yaffsfs_DoUnlink(const YCHAR *path,int isDirectory) else if(!obj) yaffsfs_SetError(-ENOENT); else if(obj->my_dev->read_only) - yaffsfs_SetError(-EINVAL); + yaffsfs_SetError(-EROFS); else if(!isDirectory && obj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY) yaffsfs_SetError(-EISDIR); else if(isDirectory && obj->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) @@ -2009,6 +2027,7 @@ int yaffs_chmod(const YCHAR *path, mode_t mode) yaffsfs_Lock(); obj = yaffsfs_FindObject(NULL,path,0,1, &dir, ¬Dir,&loop); + obj = yaffsfs_FollowLink(obj,0,&loop); if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); @@ -2193,15 +2212,17 @@ int yaffs_sync(const YCHAR *path) yaffsfs_Lock(); dev = yaffsfs_FindDevice(path,&dummy); if(dev){ - if(dev->is_mounted){ + if(!dev->is_mounted) + yaffsfs_SetError(-EINVAL); + else if(dev->read_only) + yaffsfs_SetError(-EROFS); + else { yaffs_flush_whole_cache(dev); yaffs_checkpoint_save(dev); retVal = 0; - } else - yaffsfs_SetError(-EINVAL); - + } }else yaffsfs_SetError(-ENODEV); @@ -2707,7 +2728,7 @@ int yaffs_link(const YCHAR *oldpath, const YCHAR *linkpath) else if(!obj_dir || !lnk_dir || !obj) yaffsfs_SetError(-ENOENT); else if(obj->my_dev->read_only) - yaffsfs_SetError(-EINVAL); + yaffsfs_SetError(-EROFS); else if(lnk) yaffsfs_SetError(-EEXIST); else if(lnk_dir->my_dev != obj->my_dev)