X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=27bc572b41fd2d62733968c46ae9c2bd86abe64c;hp=a26998439ccefd2f0d4fe6b2119c15e65dee3cf1;hb=cabb7b51f48a784fbd8bd04ea8878abe2196167a;hpb=93e9fdf712264bc18bad8b249e8e908494b0f774 diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index a269984..27bc572 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -1482,6 +1482,24 @@ int yaffs_unlink(const YCHAR *path) 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; @@ -1551,6 +1569,12 @@ int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath) } 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;