*** empty log message ***
[yaffs/.git] / direct / dtest.c
diff --git a/direct/dtest.c b/direct/dtest.c
new file mode 100644 (file)
index 0000000..7360584
--- /dev/null
@@ -0,0 +1,409 @@
+/*
+* Test code for the "direct" interface. 
+*/
+
+
+#include <stdio.h>
+#include <string.h>
+
+#include "yaffsfs.h"
+
+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 fill_disk(char *path,int nfiles)
+{
+       int h;
+       int n;
+       int result;
+       
+       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)
+               {
+                       //printf(".");
+               }
+               result = yaffs_close(h);
+               printf(" close %d\n",result);
+       }
+}
+
+void fill_disk_and_delete(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 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 length %d mode %X ",de->d_name,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,yaffs_freespace(dname));
+
+}
+void dumpDir(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_lstat(str,&s);
+                       
+                       printf("%s length %d mode %X ",de->d_name,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,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 main(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");
+       
+       printf("\nDirectory look-up of /boot\n");
+       dumpDir("/boot");
+
+       f = yaffs_open("/boot/b1", O_RDONLY,0);
+       
+       printf("open /boot/b1 readonly, f=%d\n",f);
+       
+       f = yaffs_open("/boot/b1", O_CREAT,0);
+       
+       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,SEEK_END,0);
+       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,SEEK_SET,0);
+       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);
+       
+       
+       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",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");
+               
+               
+       return 0;
+
+}