- if(!olddir || !newdir || !obj) {
- /* bad file */
- yaffsfs_SetError(-EBADF);
- renameAllowed = 0;
- } else if(obj->myDev->readOnly){
- yaffsfs_SetError(-EINVAL);
- 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) {
+ if(yaffsfs_CheckPath(oldPath) < 0 ||
+ yaffsfs_CheckPath(newPath) < 0){
+ yaffsfs_SetError(-ENAMETOOLONG);
+ return -1;
+ }
+
+ if(yaffsfs_alt_dir_path(newPath, &alt_newpath) < 0){
+ yaffsfs_SetError(-ENOMEM);
+ return -1;
+ }
+ if(alt_newpath)
+ newPath = alt_newpath;
+
+ yaffsfs_Lock();
+
+
+ olddir = yaffsfs_FindDirectory(NULL,oldPath,&oldname,0,¬OldDir,&oldLoop);
+ newdir = yaffsfs_FindDirectory(NULL,newPath,&newname,0,¬NewDir,&newLoop);
+ obj = yaffsfs_FindObject(NULL,oldPath,0,0,NULL,NULL,NULL);
+ newobj = yaffsfs_FindObject(NULL,newPath,0,0,NULL,NULL,NULL);
+
+ /* If the object being renamed is a directory and the
+ * path ended with a "/" then the olddir == obj.
+ * We pass through NULL for the old name to tell the lower layers
+ * to use olddir as the object.
+ */
+
+ if(olddir == obj)
+ oldname = NULL;
+
+ if((!olddir && notOldDir) || (!newdir && notNewDir)) {
+ yaffsfs_SetError(-ENOTDIR);
+ rename_allowed = 0;
+ } else if(oldLoop || newLoop) {
+ yaffsfs_SetError(-ELOOP);
+ rename_allowed = 0;
+ } else if (olddir && oldname && strncmp(oldname, _Y("."),2) == 0){
+ yaffsfs_SetError(-EINVAL);
+ rename_allowed = 0;
+ }else if(!olddir || !newdir || !obj) {
+ yaffsfs_SetError(-ENOENT);
+ rename_allowed = 0;
+ } else if(obj->my_dev->read_only){
+ yaffsfs_SetError(-EROFS);
+ rename_allowed = 0;
+ } else if(yaffs_is_non_empty_dir(newobj)){
+ yaffsfs_SetError(-ENOTEMPTY);
+ rename_allowed = 0;
+ } else if(olddir->my_dev != newdir->my_dev) {
+ /* Rename must be on same device */
+ yaffsfs_SetError(-EXDEV);
+ rename_allowed = 0;
+ } else if(obj && obj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY) {