printf("mount should return -1 returned %d\n", ret);
}
+void dir_rename_test(const char *mountpt)
+{
+ char fname[100];
+ char dname[100];
+ int h;
+ int ret;
+
+ yaffs_start_up();
+ yaffs_mount(mountpt);
+
+ sprintf(fname,"%s/file",mountpt);
+ sprintf(dname,"%s/directory",mountpt);
+
+ h = yaffs_open(fname,O_CREAT | O_RDWR | O_TRUNC, 0666);
+ yaffs_close(h);
+
+ yaffs_mkdir(dname, 0666);
+
+ dump_directory_tree(mountpt);
+
+ printf("Try to rename %s to %s\n", fname, dname);
+ ret = yaffs_rename(fname, dname);
+ printf("result %d, %d\n", ret, yaffs_get_error());
+
+ printf("Try to rename %s to %s\n", dname, fname);
+ ret = yaffs_rename(dname, fname);
+ printf("result %d, %d\n", ret, yaffs_get_error());
+
+
+}
+
int random_seed;
int simulate_power_failure;
//basic_utime_test("/yaffs2");
//case_insensitive_test("/yaffs2");
- yy_test("/yaffs2");
-
+ //yy_test("/yaffs2");
+ dir_rename_test("/yaffs2");
return 0;
return yaffsfs_DoUnlink(path, 0);
}
+static int rename_file_over_dir(struct yaffs_obj *obj, struct yaffs_obj *newobj)
+{
+ if (obj && obj->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY &&
+ newobj && newobj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY)
+ return 1;
+ else
+ return 0;
+}
+
+static int rename_dir_over_file(struct yaffs_obj *obj, struct yaffs_obj *newobj)
+{
+ if (obj && obj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY &&
+ newobj && newobj->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY)
+ return 1;
+ else
+ return 0;
+}
+
int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath)
{
struct yaffs_obj *olddir = NULL;
} else if (obj->my_dev->read_only) {
yaffsfs_SetError(-EROFS);
rename_allowed = 0;
+ } else if (rename_file_over_dir(obj, newobj)) {
+ yaffsfs_SetError(-EISDIR);
+ rename_allowed = 0;
+ } else if (rename_dir_over_file(obj, newobj)) {
+ yaffsfs_SetError(-ENOTDIR);
+ rename_allowed = 0;
} else if (yaffs_is_non_empty_dir(newobj)) {
yaffsfs_SetError(-ENOTEMPTY);
rename_allowed = 0;