-
void fill_disk(char *path,int nfiles)
{
int h;
}
-int main(int argc, char *argv[])
+int long_test(int argc, char *argv[])
{
int f;
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();
+
+}
#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;
{
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);
}