From 2369fadda0bee21c2ddb7a7596be7a5df578757e Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Mon, 13 Feb 2012 17:40:39 +1300 Subject: [PATCH 1/1] Set up new version of case insensitive code using sed This version uses sed to change strncmp->yaffs_strncmp etc. This emnables us to keep the core code free of yaffs_strxxx macros. Signed-off-by: Charles Manning --- direct/basic-test/Makefile | 22 +++++++++++----- direct/basic-test/dtest.c | 53 ++++++++++++++++++++++++++++++++++++++ direct/tests/Makefile | 18 ++++++++----- direct/yaffs_attribs.c | 2 +- direct/yaffsfs.c | 42 ++++++++++++++++++++---------- direct/ydirectenv.h | 12 +++++++++ 6 files changed, 122 insertions(+), 27 deletions(-) diff --git a/direct/basic-test/Makefile b/direct/basic-test/Makefile index afe0ef0..1761ac4 100644 --- a/direct/basic-test/Makefile +++ b/direct/basic-test/Makefile @@ -24,6 +24,7 @@ CFLAGS += -Wall -g $(EXTRA_COMPILE_FLAGS) -Werror=strict-aliasing #CFLAGS += -fno-strict-aliasing CFLAGS += -O0 #CFLAGS += -DVALGRIND_TEST +#CFLAGS += -DCONFIG_YAFFS_CASE_INSENSITIVE CFLAGS+= -Wshadow -Werror=pointer-arith -Werror=write-strings CFLAGS+= -Werror=strict-prototypes -Werror=missing-parameter-type @@ -50,7 +51,7 @@ COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ # yaffs_checkptrwtest.o\ -YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ +YAFFS_SOURCES = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ yaffs_checkptrw.h yaffs_checkptrw.c \ @@ -72,7 +73,7 @@ YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ -SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS) +COPIED_SOURCES = $(YAFFS_SOURCES) $(YAFFSDIRECTSYMLINKS) DIRECTTESTOBJS = $(COMMONTESTOBJS) dtest.o @@ -89,6 +90,15 @@ $(ALLOBJS): %.o: %.c gcc -c $(CFLAGS) -o $@ $< +$(YAFFS_SOURCES): + sed ../../$@ \ + -e "s/strcat/yaffs_strcat/g" \ + -e "s/strcpy/yaffs_strcpy/g" \ + -e "s/strncpy/yaffs_strncpy/g" \ + -e "s/strnlen/yaffs_strnlen/g" \ + -e "s/strcmp/yaffs_strcmp/g" \ + -e "s/strncmp/yaffs_strncmp/g" >$@ + $(YAFFSSYMLINKS): ln -s ../../$@ $@ @@ -96,16 +106,16 @@ $(YAFFSDIRECTSYMLINKS): ln -s ../$@ $@ -directtest2k: $(SYMLINKS) $(DIRECTTESTOBJS) +directtest2k: $(COPIED_SOURCES) $(DIRECTTESTOBJS) gcc -o $@ $(DIRECTTESTOBJS) -yaffs_test: $(SYMLINKS) $(YAFFSTESTOBJS) +yaffs_test: $(COPIED_SOURCES) $(YAFFSTESTOBJS) gcc -o $@ $(YAFFSTESTOBJS) -boottest: $(SYMLINKS) $(BOOTTESTOBJS) +boottest: $(COPIED_SOURCES) $(BOOTTESTOBJS) gcc -o $@ $(BOOTTESTOBJS) clean: - rm -f $(TARGETS) $(ALLOBJS) core core $(SYMLINKS) + rm -f $(TARGETS) $(ALLOBJS) core core $(COPIED_SOURCES) diff --git a/direct/basic-test/dtest.c b/direct/basic-test/dtest.c index 4953830..e576919 100644 --- a/direct/basic-test/dtest.c +++ b/direct/basic-test/dtest.c @@ -2796,6 +2796,58 @@ void max_files_test(const char *mountpt) h =yaffs_open(hn,O_RDWR,0); +} +void case_insensitive_test(const char *mountpt) +{ + char fn[100]; + char fn2[100]; + char buffer[100]; + int ret; + struct yaffs_stat s; + int h; + char *x; + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + dump_directory_tree(mountpt); + + sprintf(fn,"%s/Abc.Txt",mountpt); + yaffs_unlink(fn); + h = yaffs_open(fn, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); + + ret = yaffs_write(h,fn, strlen(fn) + 1); + + ret = yaffs_close(h); + + dump_directory_tree(mountpt); + + + strcpy(fn2, fn); + x = fn2; + while(*x) { + *x = toupper(*x); + x++; + } + + h = yaffs_open(fn2, O_RDONLY, 0); + ret = yaffs_read(h, buffer, 100); + + if (ret != strlen(fn) + 1 || memcmp(buffer, fn, ret)){ + printf("wrong file read\n"); + } else { + printf("File %s is the same as file %s\n", fn, fn2); + } + + ret = yaffs_stat(fn2, &s); + + printf("renaming\n"); + + ret = yaffs_rename(fn, fn2); + dump_directory_tree(mountpt); + } void start_twice(const char *mountpt) @@ -3047,6 +3099,7 @@ int main(int argc, char *argv[]) //large_file_test("/yaffs2"); //basic_utime_test("/yaffs2"); + //case_insensitive_test("/yaffs2"); return 0; diff --git a/direct/tests/Makefile b/direct/tests/Makefile index 1389552..495473b 100644 --- a/direct/tests/Makefile +++ b/direct/tests/Makefile @@ -51,7 +51,7 @@ YAFFSTESTOBJS = $(COMMONTESTOBJS) yaffs_test.o ALLOBJS = $(sort $(YAFFSTESTOBJS)) -YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ +YAFFSSOURCEFILES = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ yaffs_checkptrw.h yaffs_checkptrw.c \ @@ -78,7 +78,7 @@ DIRECTEXTRASYMLINKS = yaffscfg2k.c yaffs_fileem2k.c yaffs_fileem2k.h\ yaffs_ramdisk.c yaffs_ramdisk.h yaffs_ramem2k.c \ ynorsim.h ynorsim.c yaffs_osglue.c -SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS) $(DIRECTEXTRASYMLINKS) +COPIED_SOURCES = $(YAFFSSOURCEFILES) $(YAFFSDIRECTSYMLINKS) $(DIRECTEXTRASYMLINKS) #all: directtest2k boottest all: yaffs_test fuzzer @@ -87,8 +87,14 @@ $(ALLOBJS): %.o: %.c gcc -c $(CFLAGS) -o $@ $< -$(YAFFSSYMLINKS): - ln -s ../../$@ $@ +$(YAFFSSOURCEFILES): + sed ../../$@ \ + -e "s/strcat/yaffs_strcat/g" \ + -e "s/strcpy/yaffs_strcpy/g" \ + -e "s/strncpy/yaffs_strncpy/g" \ + -e "s/strnlen/yaffs_strnlen/g" \ + -e "s/strcmp/yaffs_strcmp/g" \ + -e "s/strncmp/yaffs_strncmp/g" >$@ $(YAFFSDIRECTSYMLINKS): ln -s ../$@ $@ @@ -97,7 +103,7 @@ $(DIRECTEXTRASYMLINKS): ln -s ../basic-test/$@ $@ -yaffs_test: $(SYMLINKS) $(YAFFSTESTOBJS) +yaffs_test: $(COPIED_SOURCES) $(YAFFSTESTOBJS) gcc $(CFLLAG) -o $@ $(YAFFSTESTOBJS) fuzzer: fuzzer.c @@ -108,4 +114,4 @@ fuzzer: fuzzer.c clean: - rm -f yaffs_test fuzzer fuzzer.o $(ALLOBJS) core $(SYMLINKS) + rm -f yaffs_test fuzzer fuzzer.o $(ALLOBJS) core $(COPIED_SOURCES) diff --git a/direct/yaffs_attribs.c b/direct/yaffs_attribs.c index 416341a..82111c2 100644 --- a/direct/yaffs_attribs.c +++ b/direct/yaffs_attribs.c @@ -92,7 +92,7 @@ loff_t yaffs_get_file_size(struct yaffs_obj *obj) alias = obj->variant.symlink_variant.alias; if(!alias) return 0; - return strnlen(alias,YAFFS_MAX_ALIAS_LENGTH); + return yaffs_strnlen(alias,YAFFS_MAX_ALIAS_LENGTH); default: return 0; } diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index b57084c..9ef19bf 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -380,13 +380,27 @@ static void yaffsfs_BreakDeviceHandles(struct yaffs_dev *dev) /* * Stuff to handle names. */ - +#ifdef CONFIG_YAFFS_CASE_INSENSITIVE + +static int yaffs_toupper(YCHAR a) +{ + if(a >= 'a' && a <= 'z') + return (a - 'a') + 'A'; + else + return a; +} +int yaffsfs_Match(YCHAR a, YCHAR b) +{ + return (yaffs_toupper(a) == yaffs_toupper(b)); +} +#else int yaffsfs_Match(YCHAR a, YCHAR b) { /* case sensitive */ return (a == b); } +#endif int yaffsfs_IsPathDivider(YCHAR ch) { @@ -405,7 +419,7 @@ int yaffsfs_CheckNameLength(const char *name) { int retVal = 0; - int nameLength = strnlen(name,YAFFS_MAX_NAME_LENGTH+1); + int nameLength = yaffs_strnlen(name,YAFFS_MAX_NAME_LENGTH+1); if(nameLength == 0){ yaffsfs_SetError(-ENOENT); @@ -430,7 +444,7 @@ static int yaffsfs_alt_dir_path(const YCHAR *path, YCHAR **ret_path) * We will use 3 * max name length instead. */ *ret_path = NULL; - path_length = strnlen(path,(YAFFS_MAX_NAME_LENGTH+1)*3 +1); + path_length = yaffs_strnlen(path,(YAFFS_MAX_NAME_LENGTH+1)*3 +1); /* If the last character is a path divider, then we need to * trim it back so that the name look-up works properly. @@ -443,7 +457,7 @@ static int yaffsfs_alt_dir_path(const YCHAR *path, YCHAR **ret_path) alt_path = kmalloc(path_length + 1, 0); if(!alt_path) return -1; - strcpy(alt_path, path); + yaffs_strcpy(alt_path, path); for(i = path_length-1; i >= 0 && yaffsfs_IsPathDivider(alt_path[i]); i--) @@ -650,9 +664,9 @@ static struct yaffs_obj *yaffsfs_DoFindDirectory(struct yaffs_obj *startDir, /* got to the end of the string */ return dir; else{ - if(strcmp(str,_Y(".")) == 0){ + if(yaffs_strcmp(str,_Y(".")) == 0){ /* Do nothing */ - } else if(strcmp(str,_Y("..")) == 0) { + } else if(yaffs_strcmp(str,_Y("..")) == 0) { dir = dir->parent; } else{ dir = yaffs_find_by_name(dir,str); @@ -1430,7 +1444,7 @@ int yaffsfs_DoUnlink(const YCHAR *path,int isDirectory) yaffsfs_SetError(-ELOOP); else if(!dir) yaffsfs_SetError(-ENOENT); - else if(strncmp(name,_Y("."),2) == 0) + else if(yaffs_strncmp(name,_Y("."),2) == 0) yaffsfs_SetError(-EINVAL); else if(!obj) yaffsfs_SetError(-ENOENT); @@ -1518,7 +1532,7 @@ int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath) } else if(oldLoop || newLoop) { yaffsfs_SetError(-ELOOP); rename_allowed = 0; - } else if (olddir && oldname && strncmp(oldname, _Y("."),2) == 0){ + } else if (olddir && oldname && yaffs_strncmp(oldname, _Y("."),2) == 0){ yaffsfs_SetError(-EINVAL); rename_allowed = 0; }else if(!olddir || !newdir || !obj) { @@ -2379,7 +2393,7 @@ int yaffs_mkdir(const YCHAR *path, mode_t mode) yaffsfs_SetError(-ENOENT); else if(yaffsfs_TooManyObjects(parent->my_dev)) yaffsfs_SetError(-ENFILE); - else if(strnlen(name,5) == 0){ + else if(yaffs_strnlen(name,5) == 0){ /* Trying to make the root itself */ yaffsfs_SetError(-EEXIST); } else if(parent->my_dev->read_only) @@ -2885,7 +2899,7 @@ yaffs_DIR *yaffs_opendir(const YCHAR *dirname) memset(dsc,0,sizeof(yaffsfs_DirectorySearchContext)); dsc->magic = YAFFS_MAGIC; dsc->dirObj = obj; - strncpy(dsc->name,dirname,NAME_MAX); + yaffs_strncpy(dsc->name,dirname,NAME_MAX); INIT_LIST_HEAD(&dsc->others); if(!search_contexts.next) @@ -2916,10 +2930,10 @@ struct yaffs_dirent *yaffs_readdir(yaffs_DIR *dirp) dsc->de.d_dont_use = (unsigned)dsc->nextReturn; dsc->de.d_off = dsc->offset++; yaffs_get_obj_name(dsc->nextReturn,dsc->de.d_name,NAME_MAX); - if(strnlen(dsc->de.d_name,NAME_MAX+1) == 0) + if(yaffs_strnlen(dsc->de.d_name,NAME_MAX+1) == 0) { /* this should not happen! */ - strcpy(dsc->de.d_name,_Y("zz")); + yaffs_strcpy(dsc->de.d_name,_Y("zz")); } dsc->de.d_reclen = sizeof(struct yaffs_dirent); retVal = &dsc->de; @@ -2995,7 +3009,7 @@ int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath) yaffsfs_SetError(-ENOTDIR); else if(loop) yaffsfs_SetError(-ELOOP); - else if( !parent || strnlen(name,5) < 1) + else if( !parent || yaffs_strnlen(name,5) < 1) yaffsfs_SetError(-ENOENT); else if(yaffsfs_TooManyObjects(parent->my_dev)) yaffsfs_SetError(-ENFILE); @@ -3045,7 +3059,7 @@ int yaffs_readlink(const YCHAR *path, YCHAR *buf, int bufsiz) else { YCHAR *alias = obj->variant.symlink_variant.alias; memset(buf,0,bufsiz); - strncpy(buf,alias,bufsiz - 1); + yaffs_strncpy(buf,alias,bufsiz - 1); retVal = 0; } yaffsfs_Unlock(); diff --git a/direct/ydirectenv.h b/direct/ydirectenv.h index 7860b84..fbf4606 100644 --- a/direct/ydirectenv.h +++ b/direct/ydirectenv.h @@ -37,6 +37,18 @@ #define YUCHAR unsigned char #define _Y(x) x +#define yaffs_strcat(a,b) strcat(a,b) +#define yaffs_strcpy(a,b) strcpy(a,b) +#define yaffs_strncpy(a,b,c) strncpy(a,b,c) +#define yaffs_strnlen(s,m) strnlen(s,m) +#ifdef CONFIG_YAFFS_CASE_INSENSITIVE +#define yaffs_strcmp(a,b) strcasecmp(a,b) +#define yaffs_strncmp(a,b,c) strncasecmp(a,b,c) +#else +#define yaffs_strcmp(a,b) strcmp(a,b) +#define yaffs_strncmp(a,b,c) strncmp(a,b,c) +#endif + #define hweight8(x) yaffs_hweight8(x) #define hweight32(x) yaffs_hweight32(x) -- 2.30.2