*** empty log message ***
[yaffs/.git] / yaffsdev.c
1 /*
2  * YAFFS: Yet another FFS. A NAND-flash specific file system. 
3  * yaffsdev.c
4  *
5  * Copyright (C) 2002 Aleph One Ltd.
6  *   for Toby Churchill Ltd and Brightstar Engineering
7  *
8  * Created by Charles Manning <charles@aleph1.co.uk>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  *
14  */
15  
16 #include "yaffsinterface.h"
17 #if YAFFS_FILEEM        
18 #include "yaffs_fileem.h"
19 #else
20 #include "yaffs_nandemul.h" 
21 #endif
22
23 #include "yaffs_guts.h"
24 #include <stdlib.h>
25
26 #include <stdio.h>
27 #include <string.h>
28
29  
30
31
32
33 yaffs_Device device;
34
35
36
37
38
39
40
41 char *testStr = "this is a test string";
42
43 char *testStr2 = "abcdefghijklmnopqrstuvwxyz1234567890";
44
45 void TestTimexxx(yaffs_Device *dev)
46 {
47         yaffs_Object *f;
48         int x;
49         
50         
51         printf("Start\n");
52         
53
54         f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
55         if(f)
56         {
57                 printf("Found\n");
58         }
59         else
60         {
61                 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
62                 printf("Created\n");
63         }
64         
65         
66         x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
67                 
68 }
69
70
71 void TestTimeasasas(yaffs_Device *dev)
72 {
73         yaffs_Object *f; 
74         int x;
75         int i;
76         int b;
77         char data[200];
78         int written;
79         
80         
81         printf("Start\n");
82         
83
84         f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
85         if(f)
86         {
87                 printf("Found\n");
88         }
89         else
90         {
91                 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
92                 printf("Created\n");
93         }
94         
95         
96         x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
97         
98         
99         
100         for(i = 0; i < 10000; i+=20)
101         {
102         
103                 b++;
104                 if(b & 1)
105                         written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
106                 else
107                         written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
108         }
109         
110         
111         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
112         
113         printf("Flush\n");
114         
115         yaffs_FlushFile(f);
116
117         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
118         
119         yaffs_ReadDataFromFile(f,data,1000,50);
120         data[50] = 0;
121         
122         printf("Read data is \"%s\"\n",data);
123         
124         yaffs_DumpObject(f);
125
126         printf("Resize\n");     
127         yaffs_ResizeFile(f,2000);
128         
129         yaffs_DumpObject(f);
130
131         yaffs_FlushFile(f);
132         
133         
134                 
135
136 }
137
138 void TestTime(yaffs_Device *dev)
139 {
140         yaffs_Object *f;
141         yaffs_Object *sl;
142         yaffs_Object *lnf;
143         
144         yaffs_Object *hl1;
145         yaffs_Object *hl2;
146         yaffs_Object *hl3;
147         yaffs_Object *d, *df;
148         
149         int x;
150         int i;
151         int b;
152         char data[200];
153         
154         char * alias;
155         int written;
156         
157         
158         printf("Exisiting objects\n");
159         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
160         printf("Exisiting objects in lost+found\n");
161         lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
162         yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
163
164         printf("Start\n");
165         
166         
167         
168
169         f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
170         if(f)
171         {
172                 printf("Found\n");
173         }
174         else
175         {
176                 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
177                 printf("Created\n");
178         }
179         
180         
181         x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
182         
183         for(i = 0; i < 100000; i+=20)
184         {
185         
186                 b++;
187                 if(b & 1)
188                         written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
189                 else
190                         written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
191         }
192         
193         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
194         
195         printf("Flush\n");
196         
197         yaffs_FlushFile(f);
198         
199         printf("File length is %d\n",yaffs_GetObjectFileLength(f));
200         
201         sl = yaffs_MknodSymLink(yaffs_Root(dev),"sym-link",0,0,0,"/tmp/alias");
202
203
204         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
205         
206         printf("\n\nsymlink alias is \"%s\"\n",alias = yaffs_GetSymlinkAlias(sl));
207         
208         free(alias);
209         
210         printf("Unlink symlink %d\n",yaffs_Unlink(yaffs_Root(dev),"sym-link"));
211         
212         
213         yaffs_ReadDataFromFile(f,data,1000,50);
214         data[50] = 0;
215         
216         printf("Read data is \"%s\"\n",data);
217         
218         yaffs_DumpObject(f);
219
220         printf("Resize\n");     
221         yaffs_ResizeFile(f,2000);
222         
223         yaffs_DumpObject(f);
224         
225         lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
226         
227         
228
229         yaffs_FlushFile(f);
230                 
231
232         printf("Unlink file: %d\n",yaffs_Unlink(yaffs_Root(dev),"Rename"));
233         
234         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
235         
236         // Create a directory and play with it
237         
238
239         printf("Create directory and play with it\n");
240                 
241         d = yaffs_MknodDirectory(yaffs_Root(dev),"direct",0,0,0);
242         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
243         yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
244         
245         printf("Make file in directory\n");
246         
247         df = yaffs_MknodFile(d,"file-in-directory",0,0,0);
248         yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
249         
250         
251         // Do some stuff with hardlinks
252         //
253         // NB Deleting hardlinked objects can mess up pointers to hardlinks.
254         // The mechanism is as follows:
255         // * If you unlink a file,softlink or directory that has one or more hardlinks,
256         // then the object is renamed to one of the hardlinks and that hardlink is unlinked.
257         // This means that a pointer to a hardlink so deleted will point to an invalid address.
258         // Thus, make sure that pointers to hardlinks are immediately dereferenced.
259
260
261         printf("Hard link tests\n");
262                 
263         f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
264         hl1 = yaffs_Link(yaffs_Root(dev),"HardLink 1",f);
265         hl2 = yaffs_Link(yaffs_Root(dev),"HardLink 2",f);
266         hl3 = yaffs_Link(yaffs_Root(dev),"HardLink 3",hl2);
267
268         printf("\n\nHard links created\n");
269         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
270         
271         yaffs_Unlink(yaffs_Root(dev),"HardLink 1");
272         printf("\n\nHard link deleted\n");
273         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
274         
275         yaffs_Unlink(yaffs_Root(dev),"Name1");
276         printf("\n\nHard linked file deleted\n");
277         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
278         
279         yaffs_Unlink(yaffs_Root(dev),"HardLink 2");
280         printf("\n\nHard link 2 deleted\n");
281         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
282         
283         yaffs_Unlink(yaffs_Root(dev),"HardLink 3");
284
285         printf("\n\nHard link 3 deleted\n");
286         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
287         
288         // NB We don't allow unlinking or rename of the root or lost+found
289         // We allow setting attributes, but these must not be written to
290         // NAND since they are not real objects.
291         
292         printf("Attempt to rename lost+found - should have failed\n");
293         x = yaffs_RenameObject(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME,NULL,"Renamed");
294         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
295
296         f = yaffs_MknodFile(yaffs_Root(dev),"pfile",0,0,0);
297         yaffs_WriteDataToFile(f,testStr,0,strlen(testStr));
298
299         yaffs_Link(yaffs_Root(dev),"phl4",f);
300 }
301
302 int main(int argc,char *argv[])
303 {
304         device.nBlocks = (2 * 1024 * 1024) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
305         device.startBlock = 1;  // Don't use block 0
306         device.endBlock = device.nBlocks - 1;
307
308 #if YAFFS_FILEEM        
309         device.writeChunkToNAND = yaffs_FEWriteChunkToNAND;
310         device.readChunkFromNAND = yaffs_FEReadChunkFromNAND;
311         device.eraseBlockInNAND = yaffs_FEEraseBlockInNAND;
312         device.initialiseNAND = yaffs_FEInitialiseNAND;
313
314         printf("Testing on file emulation\n");
315 #else
316         device.writeChunkToNAND = nandemul_WriteChunkToNAND;
317         device.readChunkFromNAND = nandemul_ReadChunkFromNAND;
318         device.eraseBlockInNAND = nandemul_EraseBlockInNAND;
319         device.initialiseNAND = nandemul_InitialiseNAND;
320         
321         printf("Testing on RAM emulation\n");
322 #endif
323
324         yaffs_GutsInitialise(&device);
325         
326         // yaffs_GutsTest();
327         
328         TestTime(&device);
329         
330         exit(0);
331 }