Update directory tree.
[lwext4.git] / demos / generic / main.c
1 /*\r
2  * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * - Redistributions of source code must retain the above copyright\r
10  *   notice, this list of conditions and the following disclaimer.\r
11  * - Redistributions in binary form must reproduce the above copyright\r
12  *   notice, this list of conditions and the following disclaimer in the\r
13  *   documentation and/or other materials provided with the distribution.\r
14  * - The name of the author may not be used to endorse or promote products\r
15  *   derived from this software without specific prior written permission.\r
16  *\r
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  */\r
28 \r
29 #include <stdio.h>\r
30 #include <stdlib.h>\r
31 #include <string.h>\r
32 #include <unistd.h>\r
33 #include <getopt.h>\r
34 #include <stdbool.h>\r
35 \r
36 #include <ext4_filedev.h>\r
37 #include <ext4.h>\r
38 \r
39 \r
40 \r
41 char input_name[128] = "ext2";\r
42 \r
43 /**@brief       Read-write size*/\r
44 static int rw_szie  = 1024;\r
45 \r
46 /**@brief       Read-write size*/\r
47 static int rw_count = 1024;\r
48 \r
49 static bool cache_mode = false;\r
50 \r
51 \r
52 /**@brief       File write buffer*/\r
53 static uint8_t  *wr_buff;\r
54 \r
55 /**@brief       File read buffer.*/\r
56 static uint8_t  *rd_buff;\r
57 \r
58 /**@brief       Block device handle.*/\r
59 static struct ext4_blockdev *bd;\r
60 \r
61 /**@brief       Block cache handle.*/\r
62 static struct ext4_bcache   *bc;\r
63 \r
64 static const char *usage = "                                                                    \n\\r
65 Welcome in ext4 generic demo.                                                                   \n\\r
66 Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)  \n\\r
67 Usage:                                                                                                                  \n\\r
68         -i   - input file            (default = ext2)                           \n\\r
69         -rws - single R/W size       (default = 1024)                           \n\\r
70         -rwc - R/W count             (default = 1024)                           \n\\r
71         -cache - 0 static, 1 dynamic (default = 0)                                      \n\\r
72 \n";\r
73 \r
74 static char* entry_to_str(uint8_t type)\r
75 {\r
76         switch(type){\r
77         case EXT4_DIRENTRY_UNKNOWN:\r
78                 return "[UNK] ";\r
79         case EXT4_DIRENTRY_REG_FILE:\r
80                 return "[FIL] ";\r
81         case EXT4_DIRENTRY_DIR:\r
82                 return "[DIR] ";\r
83         case EXT4_DIRENTRY_CHRDEV:\r
84                 return "[CHA] ";\r
85         case EXT4_DIRENTRY_BLKDEV:\r
86                 return "[BLK] ";\r
87         case EXT4_DIRENTRY_FIFO:\r
88                 return "[FIF] ";\r
89         case EXT4_DIRENTRY_SOCK:\r
90                 return "[SOC] ";\r
91         case EXT4_DIRENTRY_SYMLINK:\r
92                 return "[SYM] ";\r
93         default:\r
94                 break;\r
95         }\r
96         return "[???]";\r
97 }\r
98 \r
99 static void dir_ls(const char *path)\r
100 {\r
101         int j = 0;\r
102         char sss[255];\r
103         ext4_dir d;\r
104         ext4_direntry *de;\r
105 \r
106         printf("**********************************************\n");\r
107 \r
108         ext4_dir_open(&d, path);\r
109         de = ext4_entry_get(&d, j++);\r
110         printf("ls %s\n", path);\r
111 \r
112         while(de){\r
113                 memcpy(sss, de->name, de->name_length);\r
114                 sss[de->name_length] = 0;\r
115                 printf(entry_to_str(de->inode_type));\r
116                 printf(sss);\r
117                 printf("\n");\r
118                 de = ext4_entry_get(&d, j++);\r
119         }\r
120         printf("**********************************************\n");\r
121         ext4_dir_close(&d);\r
122 }\r
123 \r
124 static void mp_stats(void)\r
125 {\r
126     struct ext4_mount_stats stats;\r
127     ext4_mount_point_stats("/mp/", &stats);\r
128 \r
129     printf("**********************************************\n");\r
130     printf("ext4_mount_point_stats\n");\r
131     printf("inodes_count        = %d\n", stats.inodes_count);\r
132     printf("free_inodes_count   = %d\n", stats.free_inodes_count);\r
133     printf("blocks_count        = %d\n", stats.blocks_count);\r
134     printf("free_blocks_count   = %d\n", stats.free_blocks_count);\r
135     printf("block_size          = %d\n", stats.block_size);\r
136     printf("block_group_count   = %d\n", stats.block_group_count);\r
137     printf("blocks_per_group    = %d\n", stats.blocks_per_group);\r
138     printf("inodes_per_group    = %d\n", stats.inodes_per_group);\r
139     printf("volume_name         = %s\n", stats.volume_name);\r
140 \r
141     printf("**********************************************\n");\r
142 \r
143 }\r
144 \r
145 static void block_stats(void)\r
146 {\r
147     uint32_t i;\r
148 \r
149     printf("**********************************************\n");\r
150     printf("ext4 blockdev stats\n");\r
151     printf("bdev->bread_ctr          = %d\n", bd->bread_ctr);\r
152     printf("bdev->bwrite_ctr         = %d\n", bd->bwrite_ctr);\r
153 \r
154 \r
155     printf("bcache->ref_blocks       = %d\n", bc->ref_blocks);\r
156     printf("bcache->max_ref_blocks   = %d\n", bc->max_ref_blocks);\r
157     printf("bcache->lru_ctr          = %d\n", bc->lru_ctr);\r
158 \r
159     printf("\n");\r
160     for (i = 0; i < bc->cnt; ++i) {\r
161         printf("bcache->refctr[%d]     = %d\n", i, bc->refctr[i]);\r
162     }\r
163 \r
164     printf("\n");\r
165     for (i = 0; i < bc->cnt; ++i) {\r
166         printf("bcache->lru_id[%d]     = %d\n", i, bc->lru_id[i]);\r
167     }\r
168 \r
169     printf("\n");\r
170     for (i = 0; i < bc->cnt; ++i) {\r
171         printf("bcache->free_delay[%d] = %d\n", i, bc->free_delay[i]);\r
172     }\r
173 \r
174     printf("\n");\r
175     for (i = 0; i < bc->cnt; ++i) {\r
176         printf("bcache->lba[%d]        = %d\n", i, bc->lba[i]);\r
177     }\r
178 \r
179 \r
180 \r
181     printf("**********************************************\n");\r
182 }\r
183 \r
184 \r
185 int main(int argc, char **argv)\r
186 {\r
187         int option_index = 0;\r
188         int     c;\r
189         int     r;\r
190         int     i;\r
191         uint32_t  size;\r
192         ext4_file f;\r
193 \r
194     static struct option long_options[] =\r
195       {\r
196         {"in",          required_argument, 0, 'a'},\r
197         {"rws",     required_argument, 0, 'b'},\r
198         {"rwc",         required_argument, 0, 'c'},\r
199         {"cache",   required_argument, 0, 'd'},\r
200         {0, 0, 0, 0}\r
201       };\r
202 \r
203     while(-1 != (c = getopt_long (argc, argv, "a:b:c:d:", long_options, &option_index))) {\r
204 \r
205         switch(c){\r
206                 case 'a':\r
207                         strcpy(input_name, optarg);\r
208                         break;\r
209                 case 'b':\r
210                         rw_szie = atoi(optarg);\r
211                         break;\r
212                 case 'c':\r
213                         rw_count = atoi(optarg);\r
214                         break;\r
215                 case 'd':\r
216                         cache_mode = atoi(optarg);\r
217                         break;\r
218                 default:\r
219                         printf(usage);\r
220                         return EXIT_FAILURE;\r
221 \r
222         }\r
223     }\r
224 \r
225     printf("Test conditions:\n");\r
226     printf("Imput name: %s\n", input_name);\r
227     printf("RW size: %d\n",  rw_szie);\r
228     printf("RW count: %d\n", rw_count);\r
229     printf("Cache mode: %s\n", cache_mode ? "dynamic" : "static");\r
230 \r
231 \r
232 \r
233     ext4_filedev_filename(input_name);\r
234 \r
235     wr_buff = malloc(rw_szie);\r
236     rd_buff = malloc(rw_szie);\r
237 \r
238     if(!wr_buff || !rd_buff){\r
239         printf("Read-Write allocation ERROR\n");\r
240         return EXIT_FAILURE;\r
241     }\r
242 \r
243         bd = ext4_filedev_get();\r
244         bc = ext4_filecache_get();\r
245 \r
246     if(!bd || !bc){\r
247         printf("Block device ERROR\n");\r
248         return EXIT_FAILURE;\r
249     }\r
250 \r
251         ext4_dmask_set(EXT4_DEBUG_ALL);\r
252 \r
253         r = ext4_device_register(bd, cache_mode ? 0 : bc, "ext4_filesim");\r
254         if(r != EOK){\r
255                 printf("ext4_device_register ERROR = %d\n", r);\r
256                 return EXIT_FAILURE;\r
257         }\r
258 \r
259         r = ext4_mount("ext4_filesim", "/mp/");\r
260         if(r != EOK){\r
261                 printf("ext4_mount ERROR = %d\n", r);\r
262                 return EXIT_FAILURE;\r
263         }\r
264 \r
265 \r
266         ext4_fremove("/mp/hello.txt");\r
267         ext4_fremove("/mp/test1");\r
268         mp_stats();\r
269         dir_ls("/mp/");\r
270 \r
271     /*Add hello world file.*/\r
272     r = ext4_fopen(&f, "/mp/hello.txt", "wb");\r
273     r = ext4_fwrite(&f, "Hello World !\n", strlen("Hello World !\n"), 0);\r
274     r = ext4_fclose(&f);\r
275 \r
276 \r
277         printf("ext4_fopen: test1\n");\r
278 \r
279         r = ext4_fopen(&f, "/mp/test1", "wb");\r
280         if(r != EOK){\r
281                 printf("ext4_fopen ERROR = %d\n", r);\r
282                 return EXIT_FAILURE;\r
283         }\r
284 \r
285         printf("ext4_write: %d * %d ..." , rw_count, rw_szie);\r
286 \r
287         for (i = 0; i < rw_count; ++i) {\r
288 \r
289                 memset(wr_buff, i & 0xFF, rw_szie);\r
290 \r
291                 r = ext4_fwrite(&f, wr_buff, rw_szie, &size);\r
292 \r
293                 if((r != EOK) || (size != rw_szie))\r
294                         break;\r
295         }\r
296 \r
297         if(i != rw_count){\r
298                 printf("ERROR: rw_count = %d\n", i);\r
299                 return EXIT_FAILURE;\r
300         }\r
301 \r
302         printf("OK\n");\r
303         r = ext4_fclose(&f);\r
304         printf("ext4_fopen: test1\n");\r
305 \r
306         r = ext4_fopen(&f, "/mp/test1", "r+");\r
307         if(r != EOK){\r
308                 printf("ext4_fopen ERROR = %d\n", r);\r
309                 return EXIT_FAILURE;\r
310         }\r
311 \r
312         printf("ext4_read: %d * %d ..." , rw_count, rw_szie);\r
313 \r
314         for (i = 0; i < rw_count; ++i) {\r
315                 memset(wr_buff, i & 0xFF, rw_szie);\r
316                 r = ext4_fread(&f, rd_buff, rw_szie, &size);\r
317 \r
318                 if((r != EOK) || (size != rw_szie))\r
319                         break;\r
320 \r
321                 if(memcmp(rd_buff, wr_buff, rw_szie)){\r
322                         break;\r
323                 }\r
324         }\r
325         if(i != rw_count){\r
326                 printf("ERROR: rw_count = %d\n", i);\r
327                 return EXIT_FAILURE;\r
328         }\r
329 \r
330         printf("OK\n");\r
331 \r
332         r = ext4_fclose(&f);\r
333 \r
334 \r
335         mp_stats();\r
336         dir_ls("/mp/");\r
337 \r
338         block_stats();\r
339         r = ext4_umount("/mp/");\r
340 \r
341         printf("Test finish: OK\n");\r
342     return EXIT_SUCCESS;\r
343 \r
344 }\r