*** empty log message ***
authorcharles <charles>
Tue, 11 Mar 2003 09:54:38 +0000 (09:54 +0000)
committercharles <charles>
Tue, 11 Mar 2003 09:54:38 +0000 (09:54 +0000)
direct/dtest.c
direct/yaffsfs.c

index 965d808e113b8b1425ca2e6cd89a36133d07e05b..de1eaa2d66fb7776ca60bcf2e1220b6c799b0a38 100644 (file)
@@ -35,7 +35,6 @@ void copy_in_a_file(char *yaffsName,char *inName)
 
 
 
-
 void fill_disk(char *path,int nfiles)
 {
        int h;
@@ -268,7 +267,7 @@ static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expe
        
 }
 
-int main(int argc, char *argv[])
+int long_test(int argc, char *argv[])
 {
 
        int f;
@@ -517,3 +516,49 @@ int main(int argc, char *argv[])
        return 0;
 
 }
+
+
+
+int directory_rename_test(void)
+{
+       int r;
+       yaffs_StartUp();
+       
+       yaffs_mount("/ram");
+       yaffs_mkdir("/ram/a",0);
+       yaffs_mkdir("/ram/a/b",0);
+       yaffs_mkdir("/ram/c",0);
+       
+       printf("\nDirectory look-up of /ram\n");
+       dumpDir("/ram");
+       dumpDir("/ram/a");
+       dumpDir("/ram/a/b");
+
+       printf("Do rename (should fail)\n");
+               
+       r = yaffs_rename("/ram/a","/ram/a/b/d");
+       printf("\nDirectory look-up of /ram\n");
+       dumpDir("/ram");
+       dumpDir("/ram/a");
+       dumpDir("/ram/a/b");
+
+       printf("Do rename (should not fail)\n");
+               
+       r = yaffs_rename("/ram/c","/ram/a/b/d");
+       printf("\nDirectory look-up of /ram\n");
+       dumpDir("/ram");
+       dumpDir("/ram/a");
+       dumpDir("/ram/a/b");
+       
+       
+       return 1;
+       
+}
+
+int main(int argc, char *argv[])
+{
+       //return long_test(argc,argv);
+       
+       return directory_rename_test();
+       
+}
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);
        }