FEATURES:
[lwext4.git] / demos / generic / main.c
index 66024220cfd04549e0405baac1887f9f9e5c7069..e6e1f39013936f25f50ddf4846ffd1b15f430922 100644 (file)
 #include <ext4_filedev.h>\r
 #include <ext4.h>\r
 \r
-\r
-\r
 char input_name[128] = "ext2";\r
 \r
 /**@brief      Read-write size*/\r
 static int rw_szie  = 1024;\r
 \r
 /**@brief      Read-write size*/\r
-static int rw_count = 1024;\r
+static int rw_count = 10000;\r
+\r
+/**@brief   Directory test count*/\r
+static int dir_cnt  = 10;\r
 \r
+/**@brief   Static or dynamic cache mode*/\r
 static bool cache_mode = false;\r
 \r
+/**@brief   Cleanup after test.*/\r
+static bool cleanup_flag = false;\r
+\r
+/**@brief   Block device stats.*/\r
+static bool bstat = false;\r
+\r
+/**@brief   Superblock stats.*/\r
+static bool sbstat = false;\r
 \r
 /**@brief      File write buffer*/\r
 static uint8_t *wr_buff;\r
@@ -65,10 +75,14 @@ static const char *usage = "                                                                        \n\
 Welcome in ext4 generic demo.                                                                  \n\\r
 Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com) \n\\r
 Usage:                                                                                                                 \n\\r
-       -i   - input file            (default = ext2)                           \n\\r
-       -rws - single R/W size       (default = 1024)                           \n\\r
-       -rwc - R/W count             (default = 1024)                           \n\\r
-       -cache - 0 static, 1 dynamic (default = 0)                                      \n\\r
+       -i   - input file             (default = ext2)                          \n\\r
+       -rws - single R/W size        (default = 1024)                          \n\\r
+       -rwc - R/W count              (default = 10000)                         \n\\r
+       -cache  - 0 static, 1 dynamic  (default = 0)                \n\\r
+    -dirs   - directory test count (default = 10)               \n\\r
+    -clean  - clean up after test                               \n\\r
+    -bstat  - block device stats                                \n\\r
+    -sbstat - superblock stats                                  \n\\r
 \n";\r
 \r
 static char* entry_to_str(uint8_t type)\r
@@ -106,7 +120,7 @@ static void dir_ls(const char *path)
        printf("**********************************************\n");\r
 \r
        ext4_dir_open(&d, path);\r
-       de = ext4_entry_get(&d, j++);\r
+       de = ext4_dir_entry_get(&d, j++);\r
        printf("ls %s\n", path);\r
 \r
        while(de){\r
@@ -115,7 +129,7 @@ static void dir_ls(const char *path)
                printf(entry_to_str(de->inode_type));\r
                printf(sss);\r
                printf("\n");\r
-               de = ext4_entry_get(&d, j++);\r
+               de = ext4_dir_entry_get(&d, j++);\r
        }\r
        printf("**********************************************\n");\r
        ext4_dir_close(&d);\r
@@ -128,14 +142,14 @@ static void mp_stats(void)
 \r
     printf("**********************************************\n");\r
     printf("ext4_mount_point_stats\n");\r
-    printf("inodes_count        = %d\n", stats.inodes_count);\r
-    printf("free_inodes_count   = %d\n", stats.free_inodes_count);\r
-    printf("blocks_count        = %d\n", stats.blocks_count);\r
-    printf("free_blocks_count   = %d\n", stats.free_blocks_count);\r
-    printf("block_size          = %d\n", stats.block_size);\r
-    printf("block_group_count   = %d\n", stats.block_group_count);\r
-    printf("blocks_per_group    = %d\n", stats.blocks_per_group);\r
-    printf("inodes_per_group    = %d\n", stats.inodes_per_group);\r
+    printf("inodes_count        = %u\n", stats.inodes_count);\r
+    printf("free_inodes_count   = %u\n", stats.free_inodes_count);\r
+    printf("blocks_count        = %u\n", (uint32_t)stats.blocks_count);\r
+    printf("free_blocks_count   = %u\n", (uint32_t)stats.free_blocks_count);\r
+    printf("block_size          = %u\n", stats.block_size);\r
+    printf("block_group_count   = %u\n", stats.block_group_count);\r
+    printf("blocks_per_group    = %u\n", stats.blocks_per_group);\r
+    printf("inodes_per_group    = %u\n", stats.inodes_per_group);\r
     printf("volume_name         = %s\n", stats.volume_name);\r
 \r
     printf("**********************************************\n");\r
@@ -148,22 +162,22 @@ static void block_stats(void)
 \r
     printf("**********************************************\n");\r
     printf("ext4 blockdev stats\n");\r
-    printf("bdev->bread_ctr          = %d\n", bd->bread_ctr);\r
-    printf("bdev->bwrite_ctr         = %d\n", bd->bwrite_ctr);\r
+    printf("bdev->bread_ctr          = %u\n", bd->bread_ctr);\r
+    printf("bdev->bwrite_ctr         = %u\n", bd->bwrite_ctr);\r
 \r
 \r
-    printf("bcache->ref_blocks       = %d\n", bc->ref_blocks);\r
-    printf("bcache->max_ref_blocks   = %d\n", bc->max_ref_blocks);\r
-    printf("bcache->lru_ctr          = %d\n", bc->lru_ctr);\r
+    printf("bcache->ref_blocks       = %u\n", bc->ref_blocks);\r
+    printf("bcache->max_ref_blocks   = %u\n", bc->max_ref_blocks);\r
+    printf("bcache->lru_ctr          = %u\n", bc->lru_ctr);\r
 \r
     printf("\n");\r
     for (i = 0; i < bc->cnt; ++i) {\r
-        printf("bcache->refctr[%d]     = %d\n", i, bc->refctr[i]);\r
+        printf("bcache->refctr[%d]     = %u\n", i, bc->refctr[i]);\r
     }\r
 \r
     printf("\n");\r
     for (i = 0; i < bc->cnt; ++i) {\r
-        printf("bcache->lru_id[%d]     = %d\n", i, bc->lru_id[i]);\r
+        printf("bcache->lru_id[%d]     = %u\n", i, bc->lru_id[i]);\r
     }\r
 \r
     printf("\n");\r
@@ -173,7 +187,7 @@ static void block_stats(void)
 \r
     printf("\n");\r
     for (i = 0; i < bc->cnt; ++i) {\r
-        printf("bcache->lba[%d]        = %d\n", i, bc->lba[i]);\r
+        printf("bcache->lba[%d]        = %u\n", i, (uint32_t)bc->lba[i]);\r
     }\r
 \r
 \r
@@ -181,6 +195,41 @@ static void block_stats(void)
     printf("**********************************************\n");\r
 }\r
 \r
+static bool dir_test(int len)\r
+{\r
+    ext4_file f;\r
+    int       r;\r
+    int       i;\r
+    char path[64];\r
+\r
+    printf("Directory create: /mp/dir1\n");\r
+    r = ext4_dir_mk("/mp/dir1");\r
+    if(r != EOK){\r
+        printf("Unable to create directory: /mp/dir1\n");\r
+        return false;\r
+    }\r
+\r
+\r
+    printf("Add files to: /mp/dir1\n");\r
+    for (i = 0; i < len; ++i) {\r
+        sprintf(path, "/mp/dir1/f%d", i);\r
+        r = ext4_fopen(&f, path, "wb");\r
+        if(r != EOK){\r
+            printf("Unable to create file in directory: /mp/dir1\n");\r
+            return false;\r
+        }\r
+    }\r
+\r
+    dir_ls("/mp/dir1");\r
+    return true;\r
+}\r
+\r
+static void cleanup(void)\r
+{\r
+    ext4_fremove("/mp/hello.txt");\r
+    ext4_fremove("/mp/test1");\r
+    ext4_dir_rm("/mp/dir1");\r
+}\r
 \r
 int main(int argc, char **argv)\r
 {\r
@@ -197,10 +246,14 @@ int main(int argc, char **argv)
         {"rws",     required_argument, 0, 'b'},\r
         {"rwc",                required_argument, 0, 'c'},\r
         {"cache",   required_argument, 0, 'd'},\r
+        {"dirs",    required_argument, 0, 'e'},\r
+        {"clean",   no_argument,       0, 'f'},\r
+        {"bstat",   no_argument,       0, 'g'},\r
+        {"sbstat",  no_argument,       0, 'h'},\r
         {0, 0, 0, 0}\r
       };\r
 \r
-    while(-1 != (c = getopt_long (argc, argv, "a:b:c:d:", long_options, &option_index))) {\r
+    while(-1 != (c = getopt_long (argc, argv, "a:b:c:d:e:fgh", long_options, &option_index))) {\r
 \r
        switch(c){\r
                case 'a':\r
@@ -215,6 +268,18 @@ int main(int argc, char **argv)
                case 'd':\r
                        cache_mode = atoi(optarg);\r
                        break;\r
+            case 'e':\r
+                dir_cnt = atoi(optarg);\r
+                break;\r
+            case 'f':\r
+                cleanup_flag = true;\r
+                break;\r
+            case 'g':\r
+                bstat = true;\r
+                break;\r
+            case 'h':\r
+                sbstat = true;\r
+                break;\r
                default:\r
                        printf(usage);\r
                        return EXIT_FAILURE;\r
@@ -262,11 +327,14 @@ int main(int argc, char **argv)
                return EXIT_FAILURE;\r
        }\r
 \r
+       cleanup();\r
 \r
-       ext4_fremove("/mp/hello.txt");\r
-       ext4_fremove("/mp/test1");\r
-       mp_stats();\r
-       dir_ls("/mp/");\r
+    if(sbstat)\r
+        mp_stats();\r
+\r
+\r
+    dir_ls("/mp/");\r
+       dir_test(dir_cnt);\r
 \r
     /*Add hello world file.*/\r
     r = ext4_fopen(&f, "/mp/hello.txt", "wb");\r
@@ -328,16 +396,20 @@ int main(int argc, char **argv)
        }\r
 \r
        printf("OK\n");\r
-\r
        r = ext4_fclose(&f);\r
 \r
-\r
-       mp_stats();\r
        dir_ls("/mp/");\r
 \r
-       block_stats();\r
-       r = ext4_umount("/mp/");\r
+       if(sbstat)\r
+           mp_stats();\r
 \r
+       if(bstat)\r
+           block_stats();\r
+\r
+       if(cleanup_flag)\r
+           cleanup();\r
+\r
+       r = ext4_umount("/mp/");\r
        printf("Test finish: OK\n");\r
     return EXIT_SUCCESS;\r
 \r