📄 dtest.c
字号:
/* * YAFFS: Yet another FFS. A NAND-flash specific file system. * * Copyright (C) 2002 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning <charles@aleph1.co.uk> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */#include <stdio.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#include "yaffsfs.h"void dumpDir(const char *dname);char xx[600];void copy_in_a_file(char *yaffsName,char *inName){ int inh,outh; unsigned char buffer[100]; int ni,no; inh = open(inName,O_RDONLY); outh = yaffs_open(yaffsName, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); while((ni = read(inh,buffer,100)) > 0) { no = yaffs_write(outh,buffer,ni); if(ni != no) { printf("problem writing yaffs file\n"); } } yaffs_close(outh); close(inh);}void make_a_file(char *yaffsName,char bval,int sizeOfFile){ int outh; int i; unsigned char buffer[100]; outh = yaffs_open(yaffsName, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); memset(buffer,bval,100); do{ i = sizeOfFile; if(i > 100) i = 100; sizeOfFile -= i; yaffs_write(outh,buffer,i); } while (sizeOfFile > 0); yaffs_close(outh);}void make_pattern_file(char *fn,int size){ int outh; int marker; int i; outh = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); yaffs_lseek(outh,size-1,SEEK_SET); yaffs_write(outh,"A",1); for(i = 0; i < size; i+=256) { marker = ~i; yaffs_lseek(outh,i,SEEK_SET); yaffs_write(outh,&marker,sizeof(marker)); } yaffs_close(outh); }int check_pattern_file(char *fn){ int h; int marker; int i; int size; int ok = 1; h = yaffs_open(fn, O_RDWR,0); size = yaffs_lseek(h,0,SEEK_END); for(i = 0; i < size; i+=256) { yaffs_lseek(h,i,SEEK_SET); yaffs_read(h,&marker,sizeof(marker)); ok = (marker == ~i); if(!ok) { printf("pattern check failed on file %s, size %d at position %d. Got %x instead of %x\n", fn,size,i,marker,~i); } } yaffs_close(h); return ok;}int dump_file_data(char *fn){ int h; int i = 0; int ok = 1; unsigned char b; h = yaffs_open(fn, O_RDWR,0); printf("%s\n",fn); while(yaffs_read(h,&b,1)> 0) { printf("%02x",b); i++; if(i > 32) { printf("\n"); i = 0;; } } printf("\n"); yaffs_close(h); return ok;}void dump_file(const char *fn){ int i; int size; int h; h = yaffs_open(fn,O_RDONLY,0); if(h < 0) { printf("*****\nDump file %s does not exist\n",fn); } else { size = yaffs_lseek(h,0,SEEK_SET); printf("*****\nDump file %s size %d\n",fn,size); for(i = 0; i < size; i++) { } }}void create_file_of_size(const char *fn,int syze){ int h; int n; int result; char xx[200]; int iterations = (syze + strlen(fn) -1)/ strlen(fn); h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); while (iterations > 0) { sprintf(xx,"%s %8d",fn,iterations); n = strlen(xx); result = yaffs_write(h,xx,n); if(result != n) printf("Wrote %d, should have been %d\n",result,n); iterations--; } yaffs_close (h);}void verify_file_of_size(const char *fn,int syze){ int h; int result; char xx[200]; char yy[200]; int l; int iterations = (syze + strlen(fn) -1)/ strlen(fn); h = yaffs_open(fn, O_RDONLY, S_IREAD | S_IWRITE); while (iterations > 0) { sprintf(xx,"%s %8d",fn,iterations); l = strlen(xx); result = yaffs_read(h,yy,l); yy[l] = 0; if(strcmp(xx,yy)){ printf("=====>>>>> verification of file %s failed near position %lld\n",fn,(long long)yaffs_lseek(h,0,SEEK_CUR)); } iterations--; } yaffs_close (h);}void create_resized_file_of_size(const char *fn,int syze1,int reSyze, int syze2){ int h; int iterations; h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); iterations = (syze1 + strlen(fn) -1)/ strlen(fn); while (iterations > 0) { yaffs_write(h,fn,strlen(fn)); iterations--; } yaffs_ftruncate(h,reSyze); yaffs_lseek(h,0,SEEK_SET); iterations = (syze2 + strlen(fn) -1)/ strlen(fn); while (iterations > 0) { yaffs_write(h,fn,strlen(fn)); iterations--; } yaffs_close (h);}void do_some_file_stuff(const char *path){ char fn[100]; sprintf(fn,"%s/%s",path,"f1"); create_file_of_size(fn,10000); sprintf(fn,"%s/%s",path,"fdel"); create_file_of_size(fn,10000); yaffs_unlink(fn); sprintf(fn,"%s/%s",path,"f2"); create_resized_file_of_size(fn,10000,3000,4000);}void yaffs_backward_scan_test(const char *path){ char fn[100]; yaffs_StartUp(); yaffs_mount(path); do_some_file_stuff(path); sprintf(fn,"%s/ddd",path); yaffs_mkdir(fn,0); do_some_file_stuff(fn); yaffs_unmount(path); yaffs_mount(path);}char xxzz[2000];void yaffs_device_flush_test(const char *path){ char fn[100]; int h; int i; yaffs_StartUp(); yaffs_mount(path); do_some_file_stuff(path); // Open and add some data to a few files for(i = 0; i < 10; i++) { sprintf(fn,"%s/ff%d",path,i); h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IWRITE | S_IREAD); yaffs_write(h,xxzz,2000); yaffs_write(h,xxzz,2000); } yaffs_unmount(path); yaffs_mount(path);}void short_scan_test(const char *path, int fsize, int niterations){ int i; char fn[100]; sprintf(fn,"%s/%s",path,"f1"); yaffs_StartUp(); for(i = 0; i < niterations; i++) { printf("\n*****************\nIteration %d\n",i); yaffs_mount(path); printf("\nmount: Directory look-up of %s\n",path); dumpDir(path); make_a_file(fn,1,fsize); yaffs_unmount(path); }}void scan_pattern_test(const char *path, int fsize, int niterations){ int i; int j; char fn[3][100]; int result; sprintf(fn[0],"%s/%s",path,"f0"); sprintf(fn[1],"%s/%s",path,"f1"); sprintf(fn[2],"%s/%s",path,"f2"); yaffs_StartUp(); for(i = 0; i < niterations; i++) { printf("\n*****************\nIteration %d\n",i); yaffs_mount(path); printf("\nmount: Directory look-up of %s\n",path); dumpDir(path); for(j = 0; j < 3; j++) { result = dump_file_data(fn[j]); result = check_pattern_file(fn[j]); make_pattern_file(fn[j],fsize); result = dump_file_data(fn[j]); result = check_pattern_file(fn[j]); } yaffs_unmount(path); }}void fill_disk(const char *path,int nfiles){ int h; int n; int result; int f; char str[50]; for(n = 0; n < nfiles; n++) { sprintf(str,"%s/%d",path,n); h = yaffs_open(str, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); printf("writing file %s handle %d ",str, h); while ((result = yaffs_write(h,xx,600)) == 600) { f = yaffs_freespace(path); } result = yaffs_close(h); printf(" close %d\n",result); }}void fill_disk_and_delete(const char *path, int nfiles, int ncycles){ int i,j; char str[50]; int result; for(i = 0; i < ncycles; i++) { printf("@@@@@@@@@@@@@@ cycle %d\n",i); fill_disk(path,nfiles); for(j = 0; j < nfiles; j++) { sprintf(str,"%s/%d",path,j); result = yaffs_unlink(str); printf("unlinking file %s, result %d\n",str,result); } }}void fill_files(char *path,int flags, int maxIterations,int siz){ int i; int j; char str[50]; int h; i = 0; do{ sprintf(str,"%s/%d",path,i); h = yaffs_open(str, O_CREAT | O_TRUNC | O_RDWR,S_IREAD | S_IWRITE); yaffs_close(h); if(h >= 0) { for(j = 0; j < siz; j++) { yaffs_write(h,str,1); } } if( flags & 1) { yaffs_unlink(str); } i++; } while(h >= 0 && i < maxIterations); if(flags & 2) { i = 0; do{ sprintf(str,"%s/%d",path,i); printf("unlink %s\n",str); i++; } while(yaffs_unlink(str) >= 0); }}void leave_unlinked_file(char *path,int maxIterations,int siz){ int i; char str[50]; int h; i = 0; do{ sprintf(str,"%s/%d",path,i); printf("create %s\n",str); h = yaffs_open(str, O_CREAT | O_TRUNC | O_RDWR,S_IREAD | S_IWRITE); if(h >= 0) { yaffs_unlink(str); } i++; } while(h < 0 && i < maxIterations); if(h >= 0) { for(i = 0; i < siz; i++) { yaffs_write(h,str,1); } } printf("Leaving file %s open\n",str);}void dumpDirFollow(const char *dname){ yaffs_DIR *d; yaffs_dirent *de; struct yaffs_stat s; char str[100]; d = yaffs_opendir(dname); if(!d) { printf("opendir failed\n"); } else { while((de = yaffs_readdir(d)) != NULL) { sprintf(str,"%s/%s",dname,de->d_name); yaffs_stat(str,&s); printf("%s ino %d length %d mode %X ",de->d_name,(int)s.st_ino,(int)s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { case S_IFREG: printf("data file"); break; case S_IFDIR: printf("directory"); break; case S_IFLNK: printf("symlink -->"); if(yaffs_readlink(str,str,100) < 0) printf("no alias"); else printf("\"%s\"",str); break; default: printf("unknown"); break; } printf("\n"); } yaffs_closedir(d); } printf("\n"); printf("Free space in %s is %d\n\n",dname,(int)yaffs_freespace(dname));}void dump_directory_tree_worker(const char *dname,int recursive){ yaffs_DIR *d; yaffs_dirent *de; struct yaffs_stat s; char str[1000]; d = yaffs_opendir(dname); if(!d) { printf("opendir failed\n"); } else { while((de = yaffs_readdir(d)) != NULL) { sprintf(str,"%s/%s",dname,de->d_name); yaffs_lstat(str,&s); printf("%s inode %d obj %x length %d mode %X ",str,s.st_ino,de->d_dont_use,(int)s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { case S_IFREG: printf("data file"); break; case S_IFDIR: printf("directory"); break; case S_IFLNK: printf("symlink -->"); if(yaffs_readlink(str,str,100) < 0) printf("no alias"); else printf("\"%s\"",str); break; default: printf("unknown"); break; } printf("\n"); if((s.st_mode & S_IFMT) == S_IFDIR && recursive) dump_directory_tree_worker(str,1); } yaffs_closedir(d); }}static void dump_directory_tree(const char *dname){ dump_directory_tree_worker(dname,1); printf("\n"); printf("Free space in %s is %d\n\n",dname,(int)yaffs_freespace(dname));}void dumpDir(const char *dname){ dump_directory_tree_worker(dname,0); printf("\n"); printf("Free space in %s is %d\n\n",dname,(int)yaffs_freespace(dname));}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 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -