* 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.
- *
*/
yaffs_lstat(str,&s);
- printf("%s ino %d length %d mode %X ",de->d_name,(int)s.st_ino,(int)s.st_size,s.st_mode);
+ printf("%s ino %lld length %d mode %X ",de->d_name,(int)s.st_ino,s.st_size,s.st_mode);
switch(s.st_mode & S_IFMT)
{
case S_IFREG: printf("data file"); break;
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);
+ printf("%s inode %d obj %x length %lld mode %X ",
+ str,s.st_ino,de->d_dont_use, s.st_size,s.st_mode);
switch(s.st_mode & S_IFMT)
{
case S_IFREG: printf("data file"); break;
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)
+{
+ printf("About to do first yaffs_start\n");
+ yaffs_start_up();
+ printf("started\n");
+ printf("First mount returns %d\n", yaffs_mount(mountpt));
+ printf("About to do second yaffs_start\n");
+ yaffs_start_up();
+ printf("started\n");
+ printf("Second mount returns %d\n", yaffs_mount(mountpt));
+}
+
+#define N_WRITES 2000
+#define STRIDE 2000
+
+#define BUFFER_N 1100
+unsigned xxbuffer[BUFFER_N];
+
+
+void set_buffer(int n)
+{
+ int i;
+ for(i = 0; i < BUFFER_N; i++)
+ xxbuffer[i] = i + n;
+}
+
+void write_big_sparse_file(int h)
+{
+ int i;
+ loff_t offset = 0;
+ loff_t pos;
+ int n = sizeof(xxbuffer);
+ int wrote;
+
+ for(i = 0; i < N_WRITES; i++) {
+ printf("writing at %lld\n", offset);
+ set_buffer(i);
+ pos = yaffs_lseek(h, offset, SEEK_SET);
+ if(pos != offset) {
+ printf("mismatched seek pos %lld offset %lld\n",
+ pos, offset);
+ perror("lseek64");
+ exit(1);
+ }
+ wrote = yaffs_write(h, xxbuffer, n);
+
+ if(wrote != n) {
+ printf("mismatched write wrote %d n %d\n", wrote, n);
+ exit(1);
+ }
+
+ offset += (STRIDE * sizeof(xxbuffer));
+ }
+
+ yaffs_ftruncate(h, offset);
+
+}
+
+
+
+
+void verify_big_sparse_file(int h)
+{
+ unsigned check_buffer[BUFFER_N];
+ int i;
+ loff_t offset = 0;
+ loff_t pos;
+ int n = sizeof(check_buffer);
+ int result;
+ const char * check_type;
+ int checks_failed = 0;
+ int checks_passed = 0;
+
+ for(i = 0; i < N_WRITES * STRIDE; i++) {
+ if(i % STRIDE) {
+ check_type = "zero";
+ memset(xxbuffer,0, n);
+ } else {
+ check_type = "buffer";
+ set_buffer(i/STRIDE);
+ }
+ //printf("%s checking %lld\n", check_type, offset);
+ pos = yaffs_lseek(h, offset, SEEK_SET);
+ if(pos != offset) {
+ printf("mismatched seek pos %lld offset %lld\n",
+ pos, offset);
+ perror("lseek64");
+ exit(1);
+ }
+ result = yaffs_read(h, check_buffer, n);
+
+ if(result != n) {
+ printf("mismatched read result %d n %d\n", result, n);
+ exit(1);
+ }
+
+
+
+
+ if(memcmp(xxbuffer, check_buffer, n)) {
+ int j;
+
+ printf("buffer at %lld mismatches\n", pos);
+ printf("xxbuffer ");
+ for(j = 0; j < 20; j++)
+ printf(" %d",xxbuffer[j]);
+ printf("\n");
+ printf("check_buffer ");
+ for(j = 0; j < 20; j++)
+ printf(" %d",check_buffer[j]);
+ printf("\n");
+
+ checks_failed++;
+ } else {
+ checks_passed++;
+ }
+
+ offset += sizeof(xxbuffer);
+ }
+
+ printf("%d checks passed, %d checks failed\n", checks_passed, checks_failed);
+
+}
+
+
+void large_file_test(const char *mountpt)
+{
+ int handle;
+ char fullname[100];
+
+ yaffs_trace_mask = 0;
+
+ yaffs_start_up();
+
+ yaffs_mount(mountpt);
+ printf("mounted\n");
+ dumpDir(mountpt);
+
+ sprintf(fullname, "%s/%s", mountpt, "big-test-file");
+
+ handle = yaffs_open(fullname, O_RDONLY, 0);
+
+ handle = yaffs_open(fullname, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
+
+ if(handle < 0) {
+ perror("opening file");
+ exit(1);
+ }
+
+ write_big_sparse_file(handle);
+ verify_big_sparse_file(handle);
+
+ yaffs_close(handle);
+
+ printf("Job done\n");
+ yaffs_unmount(mountpt);
+
+ yaffs_mount(mountpt);
+ printf("mounted again\n");
+ dumpDir(mountpt);
+ handle = yaffs_open(fullname, O_RDONLY, 0);
+ verify_big_sparse_file(handle);
+ yaffs_unmount(mountpt);
+
+
+ yaffs_mount_common(mountpt, 0, 1);
+ printf("mounted with no checkpt\n");
+ dumpDir(mountpt);
+ handle = yaffs_open(fullname, O_RDONLY, 0);
+ verify_big_sparse_file(handle);
+ yaffs_unmount(mountpt);
+
+}
+
+
int random_seed;
int simulate_power_failure;
// link_follow_test("/yaffs2");
//basic_utime_test("/yaffs2");
- max_files_test("/yaffs2");
+ //max_files_test("/yaffs2");
+
+ start_twice("/yaffs2");
+
+ //large_file_test("/yaffs2");
+ //basic_utime_test("/yaffs2");
+ //case_insensitive_test("/yaffs2");
return 0;