int test_yaffs_chmod_EROFS(void) { int error=0; int output; if (yaffs_close(yaffs_open(FILE_PATH,O_CREAT | O_RDWR, FILE_MODE))==-1){ print_message("failed to create file\n",1); return -1; } EROFS_setup(); output = yaffs_chmod(FILE_PATH,S_IREAD|S_IWRITE); if (output<0){ error=yaffs_get_error(); if (abs(error)==EROFS){ return 1; } else { print_message("different error than expected\n",2); return -1; } } else { print_message("chmoded with EROFS setup (which is a bad thing)\n",2); return -1; } }
int test_yaffs_open_EACCES(void) { int error_code=0; int output =-1; if (yaffs_access(FILE_PATH,0)!=0){ output=yaffs_close(test_yaffs_open()); if (output<0){ print_message("failed to open file\n",2); return -1; } } output=yaffs_chmod(FILE_PATH,S_IREAD); if (output<0){ print_message("failed to chmod file\n",2); return -1; } handle=yaffs_open(FILE_PATH, O_TRUNC| O_RDWR,FILE_MODE ); if (handle <0){ error_code=yaffs_get_error(); if (abs(error_code)==EACCES){ return 1; } else { print_message("different error than expected\n",2); return -1; } } else { print_message("file opened with read and write permissions, chmoded to read only.(which is a bad thing)\n",2); return -1; } }
int test_yaffs_access_EACCES_clean(void) { int output=0; output=yaffs_chmod(FILE_PATH,S_IREAD|S_IWRITE); if (output<0){ print_message("failed to chmod file\n",2); return -1; } return 1; }
int test_yaffs_chmod(void) { int output=yaffs_chmod(FILE_PATH,S_IREAD|S_IWRITE); if (output>=0){ /* there were no errors */ return 1; } else { print_message("failed to chmod the file\n",2); return -1; } }
int test_yaffs_open_EACCES_clean(void) { int output= -1; int output2=-1; if (handle >=0){ output2= yaffs_close(handle); } output=yaffs_chmod(FILE_PATH,S_IREAD|S_IWRITE); if (output<0){ print_message("failed to chmod file\n",2); return -1; } return (output2&&output); }
int test_yaffs_chmod_ENOTDIR(void) { int error=0; int output=yaffs_chmod("/yaffs2/foo/file",S_IREAD|S_IWRITE); if (output<0){ error=yaffs_get_error(); if (abs(error)==ENOTDIR){ return 1; } else { print_message("different error than expected\n",2); return -1; } } else { print_message("chmoded the file (which is a bad thing)\n",2); return -1; } }
int test_yaffs_chmod_ENOENT2(void) { int error=0; int output=yaffs_chmod("/non_existing_directory/foo",S_IREAD|S_IWRITE); if (output<0){ error=yaffs_get_error(); if (abs(error)==ENOENT){ return 1; } else { print_message("different error than expected\n",2); return -1; } } else { print_message("chmoded the file (which is a bad thing)\n",2); return -1; } }
int root_perm_remount(const char *path) { struct yaffs_stat s; yaffs_StartUp(); yaffs_mount(path); yaffs_stat(path,&s); printf("root perms after mount %x\n",s.st_mode); yaffs_chmod(path, 0777); yaffs_stat(path,&s); printf("root perms after setting to 0777 is %x\n",s.st_mode); yaffs_unmount(path); return 0; }
static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expectedResult) { int fd; if(yaffs_chmod(path,tmode)< 0) printf("chmod failed\n"); fd = yaffs_open(path,tflags,0); if((fd >= 0) != (expectedResult > 0)) { printf("Permissions check %x %x %d failed\n",tmode,tflags,expectedResult); } else { printf("Permissions check %x %x %d OK\n",tmode,tflags,expectedResult); } yaffs_close(fd); }
int test_yaffs_access_EACCES(void) { int output=0; int error=0; output=yaffs_chmod(FILE_PATH,S_IREAD); if (output<0){ print_message("failed to chmod file\n",2); return -1; } output= yaffs_access(FILE_PATH,W_OK); if (output<0){ error=yaffs_get_error(); if ( abs(error)== EACCES){ return 1; } else { print_message("error does not match expected error\n",2); return -1; } } else{ print_message("accessed an existing file with bad mode (which is a bad thing\n",2); return -1; } }
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; }
void yaffs_touch(const char *fn) { yaffs_chmod(fn, S_IREAD | S_IWRITE); }