X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=27bc572b41fd2d62733968c46ae9c2bd86abe64c;hb=17c2897913447766bfd88fd49ca897821a3d2205;hp=7ee486a8d0d95cb2afa2dcd2eb69dd368db441de;hpb=54721f22512e7c859c4c4a4ae7e5374ecf7fb570;p=yaffs2.git diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index 7ee486a..27bc572 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -122,6 +122,8 @@ static void yaffsfs_InitHandles(void) if (yaffsfs_handlesInitialised) return; + yaffsfs_handlesInitialised = 1; + memset(yaffsfs_inode, 0, sizeof(yaffsfs_inode)); memset(yaffsfs_fd, 0, sizeof(yaffsfs_fd)); memset(yaffsfs_handle, 0, sizeof(yaffsfs_handle)); @@ -1480,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; @@ -1549,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;