*** empty log message ***
[yaffs/.git] / direct / yaffsfs.c
index f4dfdcb6055a305890b4a201a78dbbcb2668fb57..207c06930f24226bbb99e925b72919849ea1e58d 100644 (file)
@@ -25,7 +25,7 @@
 #endif
 
 
-const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.5 2003-03-11 05:16:53 charles Exp $";
+const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.6 2003-03-11 09:54:40 charles Exp $";
 
 // configurationList is the list of devices that are supported
 static yaffsfs_DeviceConfiguration *yaffsfs_configurationList;
@@ -739,27 +739,51 @@ int yaffs_rename(const char *oldPath, const char *newPath)
 {
        yaffs_Object *olddir = NULL;
        yaffs_Object *newdir = NULL;
+       yaffs_Object *obj = NULL;
        char *oldname;
        char *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)
+       if(!olddir || !newdir || !obj)
        {
-               // bad handle
-               yaffsfs_SetError(-EBADF);               
+               // 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
+       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(-EACCESS);
+       }
+       
+       if(renameAllowed)
        {
                result = yaffs_RenameObject(olddir,oldname,newdir,newname);
        }