X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=b6b5e444fbe0aebf67d2a9b293c1dd3498ede740;hp=e3f6fb04d03ff15da2777fdeb08d58021761f506;hb=256ce201932cb4fb035c9996c7ae700b24818c17;hpb=43dffe06bde0c8c1e6c6a76fe140bc287f2acad4 diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index e3f6fb0..b6b5e44 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -881,19 +881,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(); @@ -1183,6 +1187,7 @@ int yaffs_truncate(const YCHAR *path,off_t new_size) yaffsfs_Lock(); obj = yaffsfs_FindObject(NULL,path,0,1,&dir,¬Dir,&loop); + obj = yaffsfs_FollowLink(obj,0,&loop); if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); @@ -1190,6 +1195,8 @@ 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) @@ -1218,7 +1225,7 @@ int yaffs_ftruncate(int fd, off_t new_size) /* bad handle */ yaffsfs_SetError(-EBADF); 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 @@ -1962,7 +1969,9 @@ int yaffs_access(const YCHAR *path, int amode) yaffsfs_SetError(-ELOOP); else if(!dir || !obj) yaffsfs_SetError(-ENOENT); - else { + else if((amode & W_OK) && obj->my_dev->read_only) + yaffsfs_SetError(-EROFS); + else{ int access_ok = 1; if((amode & R_OK) && !(obj->yst_mode & S_IREAD)) @@ -2006,6 +2015,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); @@ -2190,15 +2200,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);