void rename_over_test(const char *mountpt) { int i; char a[100]; char b[100]; char c[100]; sprintf(a,"%s/a",mountpt); sprintf(b,"%s/b",mountpt); sprintf(c,"%s/c",mountpt); yaffs_StartUp(); yaffs_mount(mountpt); printf("Existing files\n"); dumpDirFollow(mountpt); i = yaffs_open(c,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); printf("File c handle is %d\n",i); yaffs_close(i); i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); yaffs_close(i); i = yaffs_open(b,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); yaffs_close(i); yaffs_rename(a,b); // rename over yaffs_rename(b,a); // rename back again (not renaimng over) yaffs_rename(a,b); // rename back again (not renaimng over) yaffs_unmount(mountpt); }
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 test_yaffs_rename_ENOTEMPTY(void) { int output=0; int error_code =0; if (yaffs_mkdir(DIR_PATH,O_CREAT | O_RDWR)==-1){ print_message("failed to create dir\n",1); return -1; } if (yaffs_mkdir(DIR_PATH2,O_CREAT | O_RDWR)==-1){ print_message("failed to create dir2\n",1); return -1; } if (yaffs_close(yaffs_open(DIR_PATH2_FILE,O_CREAT | O_RDWR, FILE_MODE))==-1){ print_message("failed to create file\n",1); return -1; } output = yaffs_rename( DIR_PATH,DIR_PATH2 ); if (output<0){ error_code=yaffs_get_error(); if (abs(error_code)==ENOTEMPTY){ return 1; } else { print_message("different error than expected\n",2); return -1; } print_message("could not rename a directory over a nonempty directory (which is a bad thing)\n",2); return -1; } return 1; }
int test_yaffs_rename_full_dir_over_dir(void) { int output=0; int error_code =0; if (yaffs_mkdir(DIR_PATH,O_CREAT | O_RDWR)==-1){ print_message("failed to create dir\n",1); return -1; } if (yaffs_mkdir(DIR_PATH2,O_CREAT | O_RDWR)==-1){ print_message("failed to create dir2\n",1); return -1; } if (yaffs_close(yaffs_open(DIR_PATH2_FILE,O_CREAT | O_RDWR, FILE_MODE))==-1){ print_message("failed to create file\n",1); return -1; } output = yaffs_rename( DIR_PATH2,DIR_PATH ); if (output<0){ print_message("could not rename a directory over a empty directory (which is a bad thing)\n",2); return -1; } return 1; }
int test_yaffs_rename_ELOOP_dir(void) { int output=0; int error_code =0; if (set_up_ELOOP()<0){ print_message("failed to setup symlinks\n",2); return -1; } output = yaffs_rename(ELOOP_PATH "/file" , RENAME_PATH); if (output<0){ error_code=yaffs_get_error(); if (abs(error_code)==ELOOP){ return 1; } else { print_message("returned error does not match the the expected error\n",2); return -1; } } else{ print_message("renamed a ELOOP (which is a bad thing)\n",2); return -1; } }
int test_yaffs_rename_file_to_dir(void) { int output=0; if (0 != yaffs_access(FILE_PATH,0)) { output = test_yaffs_open(); if (output < 0) { print_message("failed to create file\n",2); return -1; } else { output = yaffs_close(output); if (output < 0) { print_message("failed to close file\n",2); return -1; } } } output = yaffs_rename( "/yaffs2/foo" , RENAME_DIR_PATH); if (output<0) { print_message("failed to rename a file over an empty directory\n",2); return -1; } else { return 1; } }
int test_yaffs_rename_ENAMETOOLONG2(void) { int output=0; int error_code =0; int file_name_length=1000000; char file_name[file_name_length]; int x=0; for (x=0; x<file_name_length -1; x++){ file_name[x]='a'; } file_name[file_name_length-2]='\0'; output = yaffs_rename(FILE_PATH, file_name); if (output<0){ error_code=yaffs_get_error(); if (abs(error_code)==ENAMETOOLONG){ return 1; } else { print_message("returned error does not match the the expected error\n",2); return -1; } } else{ print_message("renamed a ELOOP (which is a bad thing)\n",2); return -1; } }
void cmd_yaffs_mv(const char *oldPath, const char *newPath) { int retval = yaffs_rename(newPath, oldPath); if (retval < 0) printf("yaffs_unlink returning error: %d, %s\n", retval, yaffs_error_str()); }
void cmd_yaffs_mv(const char *oldPath, const char *newPath) { checkMount(); int retval = yaffs_rename(newPath, oldPath); if ( retval < 0) printf("yaffs_unlink returning error: %d\n", retval); }
static void DoUpdateMainFile(void) { int result; int sz32; sz32 = (myrand() % 1000) + 20; result = yWriteFile(fullTempMainName,sz32); if(result) FatalError(); yaffs_rename(fullTempMainName,fullMainName); }
int test_yaffs_rename_dir_clean(void) { int output = 0; if (0 == yaffs_access(RENAME_DIR_PATH,0)) { output = yaffs_rename(RENAME_DIR_PATH,DIR_PATH); if (output < 0) { print_message("failed to rename the file\n",2); return -1; } } return 1; }
static void UpdateCounter(const char *name, unsigned *val, int initialise) { int inh=-1; int outh=-1; unsigned x[2]; int nread = 0; int nwritten = 0; x[0] = x[1] = 0; if(initialise){ x[0] = 0; x[1] = 1; } else { inh = yaffs_open(name,O_RDONLY, S_IREAD | S_IWRITE); if(inh >= 0){ nread = yaffs_read(inh,x,sizeof(x)); yaffs_close(inh); } if(nread != sizeof(x) || x[0] + 1 != x[1]){ printf("Error reading counter %s handle %d, x[0] %u x[1] %u last error %d\n", name, inh, x[0], x[1],yaffsfs_GetLastError()); FatalError(); } x[0]++; x[1]++; } outh = yaffs_open(fullTempCounterName, O_RDWR | O_TRUNC | O_CREAT, S_IREAD | S_IWRITE); if(outh >= 0){ nwritten = yaffs_write(outh,x,sizeof(x)); yaffs_close(outh); yaffs_rename(fullTempCounterName,name); } if(nwritten != sizeof(x)){ printf("Error writing counter %s handle %d, x[0] %u x[1] %u\n", name, inh, x[0], x[1]); FatalError(); } *val = x[0]; printf("##\n" "## Set counter %s to %u\n" "##\n", name,x[0]); }
int test_yaffs_rename_dir(void) { int output=0; if (0 != yaffs_access(DIR_PATH,0)) { output = yaffs_mkdir(DIR_PATH,S_IREAD|S_IWRITE); if (output < 0) { print_message("failed to create file\n",2); return -1; } } output = yaffs_rename( DIR_PATH , RENAME_DIR_PATH); return output; }
void rename_over_test(const char *mountpt) { int i; char a[100]; char b[100]; sprintf(a,"%s/a",mountpt); sprintf(b,"%s/b",mountpt); yaffs_StartUp(); yaffs_mount(mountpt); i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, 0); yaffs_close(i); i = yaffs_open(b,O_CREAT | O_TRUNC | O_RDWR, 0); yaffs_close(i); yaffs_rename(a,b); // rename over yaffs_rename(b,a); // rename back again (not renaimng over) yaffs_rename(a,b); // rename back again (not renaimng over) yaffs_unmount(mountpt); }
/*tests renaming a non empty file */ int test_yaffs_rename_dir(void) { int output=0; int error_code =0; output = yaffs_open("/yaffs2/new_directory/file",O_CREAT | O_RDWR, S_IREAD | S_IWRITE); if (output < 0 ) if (0 != yaffs_access(FILE_PATH,0)) { output = test_yaffs_open(); if (output < 0) { print_message("failed to create file\n",2); return -1; } } output = yaffs_rename( DIR_PATH , RENAME_DIR_PATH); return output; }
/*============================================================================== * - mv() * * - move one file from some loacte to another */ int mv(int argc, char *argv[]) { int yaffs_retval; char old_path_name[PATH_LEN_MAX]; char new_path_name[PATH_LEN_MAX]; CHECK_ARG_NUM(3, "too few argument"); _make_abs_path(old_path_name, argv[1]); _make_abs_path(new_path_name, argv[2]); yaffs_retval = yaffs_rename(old_path_name, new_path_name); CHECK_YAFFS_RETVAL(yaffs_retval, "can't move '%s' to '%s'\n", old_path_name, new_path_name); return CMD_OK; }
int test_yaffs_rename_EEXISTS(void) { int output=0; int error_code =0; if (0 != yaffs_access(DIR_PATH,0)) { output = yaffs_mkdir(DIR_PATH,S_IWRITE | S_IREAD); if (output < 0) { print_message("failed to create directory\n",2); return -1; } } if (0 != yaffs_access(RENAME_DIR_PATH,0)) { output = yaffs_mkdir(RENAME_DIR_PATH,S_IWRITE | S_IREAD); if (output < 0) { error_code=yaffs_get_error(); if (abs(error_code)!=EEXIST){ print_message("failed to create second directory\n",2); return -1; } } } output= yaffs_open("/yaffs2/dir2/file",O_CREAT | O_RDWR, FILE_MODE); if (output<0){ print_message("failed to open file in the second directory\n",2); return -1; } output = yaffs_rename(DIR_PATH , RENAME_DIR_PATH); if (output<0){ error_code=yaffs_get_error(); if (abs(error_code)==ENOTEMPTY){ return 1; } else { print_message("returned error does not match the the expected error\n",2); return -1; } } else{ print_message("removed /yaffs2/ directory (which is a bad thing)\n",2); return -1; } }
int test_yaffs_rename_EEXISTS_clean(void) { int output = 0; if (0 == yaffs_access("/yaffs2/dir2/file",0) ) { output = yaffs_unlink("/yaffs2/dir2/file"); if (output < 0) { print_message("failed to remove the file\n",2); return -1; } } if (0 == yaffs_access(RENAME_PATH,0) && 0 != yaffs_access(DIR_PATH,0)) { output = yaffs_rename(RENAME_PATH,FILE_PATH); if (output < 0) { print_message("failed to remove the directory\n",2); return -1; } } return 1; }
int test_yaffs_rename_dir_clean(void) { int output = 0; if (0 == yaffs_access("/yaffs2/new_directory/file",0)) { output = yaffs_unlink("/yaffs2/new_directory/file"); if (output < 0) { print_message("failed to remove file\n",2); return -1; } } if (0 == yaffs_access(RENAME_DIR_PATH,0)) { output = yaffs_rename(RENAME_DIR_PATH,DIR_PATH); if (output < 0) { print_message("failed to rename the dir\n",2); return -1; } } return 1; }
int test_yaffs_rename_file_over_file(void) { int output=0; int error_code =0; if (yaffs_close(yaffs_open(FILE_PATH,O_CREAT | O_RDWR, FILE_MODE))==-1) { print_message("failed to create file\n",1); return -1; } if (yaffs_close(yaffs_open(FILE_PATH2,O_CREAT | O_RDWR, FILE_MODE))==-1) { print_message("failed to create file\n",1); return -1; } output = yaffs_rename(FILE_PATH ,FILE_PATH2 ); if (output<0) { print_message("could not rename a file over a file (which is a bad thing)\n",2); return -1; } return 1; }
void yaffs_bash_around(const char *mountpt, int n_cycles) { char name[200]; char name1[200]; int h[BASH_HANDLES]; int i; int op; int pos; int n; int n1; int start_op; int op_max = 99; int cycle = 0; sprintf(name,"%s/bashdir",mountpt); yaffs_mkdir(name,0666); for(i = 0; i < BASH_HANDLES; i++) h[i] = -1; while(n_cycles){ if(cycle % 100 == 0){ printf("CYCLE %8d mo %2d inodes %d space %d ",cycle,op_max, yaffs_inodecount(mountpt),(int)yaffs_freespace(mountpt)); for(i = 0; i < BASH_HANDLES; i++) printf("%2d ",h[i]); printf("\n"); } cycle++; if(n_cycles > 0) n_cycles--; i = rand() % BASH_HANDLES; op = rand() % op_max; pos = rand() & 20000000; n = rand() % 100; n1 = rand() % 100; sprintf(name,"%s/bashdir/xx%d",mountpt,n); sprintf(name1,"%s/bashdir/xx%d",mountpt,n1); start_op = op; op-=1; if(op < 0){ if(h[i]>= 0){ yaffs_close(h[i]); h[i] = -1; } continue; } op-=1; if(op < 0){ if(h[i] < 0) h[i] = yaffs_open(name,O_CREAT| O_RDWR, 0666); continue; } op-=5; if(op< 0){ yaffs_lseek(h[i],pos,SEEK_SET); yaffs_write(h[i],name,n); continue; } op-=1; if(op < 0){ yaffs_unlink(name); continue; } op-=1; if(op < 0){ yaffs_rename(name,name1); continue; } op-=1; if(op < 0){ yaffs_mkdir(name,0666); continue; } op-=1; if(op < 0){ yaffs_rmdir(name); continue; } op_max = start_op-op; } }
int long_test(int argc, char *argv[]) { int f; int r; char buffer[20]; char str[100]; int h; mode_t temp_mode; struct yaffs_stat ystat; yaffs_StartUp(); yaffs_mount("/boot"); yaffs_mount("/data"); yaffs_mount("/flash"); yaffs_mount("/ram"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /data\n"); dumpDir("/data"); printf("\nDirectory look-up of /flash\n"); dumpDir("/flash"); //leave_unlinked_file("/flash",20000,0); //leave_unlinked_file("/data",20000,0); leave_unlinked_file("/ram",20,0); f = yaffs_open("/boot/b1", O_RDONLY,0); printf("open /boot/b1 readonly, f=%d\n",f); f = yaffs_open("/boot/b1", O_CREAT,S_IREAD | S_IWRITE); printf("open /boot/b1 O_CREAT, f=%d\n",f); r = yaffs_write(f,"hello",1); printf("write %d attempted to write to a read-only file\n",r); r = yaffs_close(f); printf("close %d\n",r); f = yaffs_open("/boot/b1", O_RDWR,0); printf("open /boot/b1 O_RDWR,f=%d\n",f); r = yaffs_write(f,"hello",2); printf("write %d attempted to write to a writeable file\n",r); r = yaffs_write(f,"world",3); printf("write %d attempted to write to a writeable file\n",r); r= yaffs_lseek(f,0,SEEK_END); printf("seek end %d\n",r); memset(buffer,0,20); r = yaffs_read(f,buffer,10); printf("read %d \"%s\"\n",r,buffer); r= yaffs_lseek(f,0,SEEK_SET); printf("seek set %d\n",r); memset(buffer,0,20); r = yaffs_read(f,buffer,10); printf("read %d \"%s\"\n",r,buffer); memset(buffer,0,20); r = yaffs_read(f,buffer,10); printf("read %d \"%s\"\n",r,buffer); // Check values reading at end. // A read past end of file should return 0 for 0 bytes read. r= yaffs_lseek(f,0,SEEK_END); r = yaffs_read(f,buffer,10); printf("read at end returned %d\n",r); r= yaffs_lseek(f,500,SEEK_END); r = yaffs_read(f,buffer,10); printf("read past end returned %d\n",r); r = yaffs_close(f); printf("close %d\n",r); copy_in_a_file("/boot/yyfile","xxx"); // Create a file with a long name copy_in_a_file("/boot/file with a long name","xxx"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check stat r = yaffs_stat("/boot/file with a long name",&ystat); // Check rename r = yaffs_rename("/boot/file with a long name","/boot/r1"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check unlink r = yaffs_unlink("/boot/r1"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check mkdir r = yaffs_mkdir("/boot/directory1",0); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); // add a file to the directory copy_in_a_file("/boot/directory1/file with a long name","xxx"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); // Attempt to delete directory (should fail) r = yaffs_rmdir("/boot/directory1"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); // Delete file first, then rmdir should work r = yaffs_unlink("/boot/directory1/file with a long name"); r = yaffs_rmdir("/boot/directory1"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); #if 0 fill_disk_and_delete("/boot",20,20); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); #endif yaffs_symlink("yyfile","/boot/slink"); yaffs_readlink("/boot/slink",str,100); printf("symlink alias is %s\n",str); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot (using stat instead of lstat)\n"); dumpDirFollow("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); h = yaffs_open("/boot/slink",O_RDWR,0); printf("file length is %d\n",(int)yaffs_lseek(h,0,SEEK_END)); yaffs_close(h); yaffs_unlink("/boot/slink"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check chmod yaffs_stat("/boot/yyfile",&ystat); temp_mode = ystat.st_mode; yaffs_chmod("/boot/yyfile",0x55555); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); yaffs_chmod("/boot/yyfile",temp_mode); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Permission checks... PermissionsCheck("/boot/yyfile",0, O_WRONLY,0); PermissionsCheck("/boot/yyfile",0, O_RDONLY,0); PermissionsCheck("/boot/yyfile",0, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IREAD, O_WRONLY,0); PermissionsCheck("/boot/yyfile",S_IREAD, O_RDONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDONLY,0); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDWR,1); yaffs_chmod("/boot/yyfile",temp_mode); //create a zero-length file and unlink it (test for scan bug) h = yaffs_open("/boot/zlf",O_CREAT | O_TRUNC | O_RDWR,0); yaffs_close(h); yaffs_unlink("/boot/zlf"); yaffs_DumpDevStruct("/boot"); fill_disk_and_delete("/boot",20,20); yaffs_DumpDevStruct("/boot"); fill_files("/boot",1,10000,0); fill_files("/boot",1,10000,5000); fill_files("/boot",2,10000,0); fill_files("/boot",2,10000,5000); leave_unlinked_file("/data",20000,0); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); yaffs_DumpDevStruct("/boot"); yaffs_DumpDevStruct("/data"); return 0; }