e38a98330a5f04b2f4139ea86a3a431dd71e8be1
[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("Start\n");
159         
160
161         f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
162         if(f)
163         {
164                 printf("Found\n");
165         }
166         else
167         {
168                 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
169                 printf("Created\n");
170         }
171         
172         
173         x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
174         
175         for(i = 0; i < 100000; i+=20)
176         {
177         
178                 b++;
179                 if(b & 1)
180                         written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
181                 else
182                         written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
183         }
184         
185         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
186         
187         printf("Flush\n");
188         
189         yaffs_FlushFile(f);
190         
191         printf("File length is %d\n",yaffs_GetObjectFileLength(f));
192         
193         sl = yaffs_MknodSymLink(yaffs_Root(dev),"sym-link",0,0,0,"/tmp/alias");
194
195
196         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
197         
198         printf("\n\nsymlink alias is \"%s\"\n",alias = yaffs_GetSymlinkAlias(sl));
199         
200         free(alias);
201         
202         printf("Unlink symlink %d\n",yaffs_Unlink(yaffs_Root(dev),"sym-link"));
203         
204         
205         yaffs_ReadDataFromFile(f,data,1000,50);
206         data[50] = 0;
207         
208         printf("Read data is \"%s\"\n",data);
209         
210         yaffs_DumpObject(f);
211
212         printf("Resize\n");     
213         yaffs_ResizeFile(f,2000);
214         
215         yaffs_DumpObject(f);
216         
217         lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
218         
219         
220
221         yaffs_FlushFile(f);
222                 
223
224         printf("Unlink file: %d\n",yaffs_Unlink(yaffs_Root(dev),"Rename"));
225         
226         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
227         
228         // Create a directory and play with it
229         
230
231         printf("Create directory and play with it\n");
232                 
233         d = yaffs_MknodDirectory(yaffs_Root(dev),"direct",0,0,0);
234         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
235         yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
236         
237         printf("Make file in directory\n");
238         
239         df = yaffs_MknodFile(d,"file-in-directory",0,0,0);
240         yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
241         
242         
243         // Do some stuff with hardlinks
244         //
245         // NB Deleting hardlinked objects can mess up pointers to hardlinks.
246         // The mechanism is as follows:
247         // * If you unlink a file,softlink or directory that has one or more hardlinks,
248         // then the object is renamed to one of the hardlinks and that hardlink is unlinked.
249         // This means that a pointer to a hardlink so deleted will point to an invalid address.
250         // Thus, make sure that pointers to hardlinks are immediately dereferenced.
251
252
253         printf("Hard link tests\n");
254                 
255         f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
256         hl1 = yaffs_Link(yaffs_Root(dev),"HardLink 1",f);
257         hl2 = yaffs_Link(yaffs_Root(dev),"HardLink 2",f);
258         hl3 = yaffs_Link(yaffs_Root(dev),"HardLink 3",hl2);
259
260         printf("\n\nHard links created\n");
261         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
262         
263         yaffs_Unlink(yaffs_Root(dev),"HardLink 1");
264         printf("\n\nHard link deleted\n");
265         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
266         
267         yaffs_Unlink(yaffs_Root(dev),"Name1");
268         printf("\n\nHard linked file deleted\n");
269         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
270         
271         yaffs_Unlink(yaffs_Root(dev),"HardLink 2");
272         printf("\n\nHard link 2 deleted\n");
273         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
274         
275         yaffs_Unlink(yaffs_Root(dev),"HardLink 3");
276
277         printf("\n\nHard link 3 deleted\n");
278         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
279         
280         // NB We don't allow unlinking or rename of the root or lost+found
281         // We allow setting attributes, but these must not be written to
282         // NAND since they are not real objects.
283         
284         printf("Attempt to rename lost+found - should have failed\n");
285         x = yaffs_RenameObject(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME,NULL,"Renamed");
286         yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
287
288 }
289
290 int main(int argc,char *argv[])
291 {
292         device.nBlocks = (2 * 1024 * 1024) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
293         device.startBlock = 1;  // Don't use block 0
294         device.endBlock = device.nBlocks - 1;
295
296 #if YAFFS_FILEEM        
297         device.writeChunkToNAND = yaffs_FEWriteChunkToNAND;
298         device.readChunkFromNAND = yaffs_FEReadChunkFromNAND;
299         device.eraseBlockInNAND = yaffs_FEEraseBlockInNAND;
300         device.initialiseNAND = yaffs_FEInitialiseNAND;
301
302         printf("Testing on file emulation\n");
303 #else
304         device.writeChunkToNAND = nandemul_WriteChunkToNAND;
305         device.readChunkFromNAND = nandemul_ReadChunkFromNAND;
306         device.eraseBlockInNAND = nandemul_EraseBlockInNAND;
307         device.initialiseNAND = nandemul_InitialiseNAND;
308         
309         printf("Testing on RAM emulation\n");
310 #endif
311
312         yaffs_GutsInitialise(&device);
313         
314         // yaffs_GutsTest();
315         
316         TestTime(&device);
317         
318         exit(0);
319 }