Merge pull request #33 from enetor/fseek
[lwext4.git] / fs_test / lwext4_server.c
index fa23b52c67054e3c1a2329befb500a1eeaa0e510..2c923baef9285e7dd15111b30a22417e3ba13d13 100644 (file)
@@ -34,6 +34,7 @@
 #include <stdbool.h>
 #include <getopt.h>
 #include <time.h>
+#include <inttypes.h>
 #include <sys/time.h>
 
 #ifdef WIN32
 #include <sys/types.h>
 #endif
 
-#include "../blockdev/linux/ext4_filedev.h"
-#include "../blockdev/windows/io_raw.h"
-
 #include <ext4.h>
-#include <errno.h>
+#include "../blockdev/linux/file_dev.h"
+#include "../blockdev/windows/file_windows.h"
+
 
 static int winsock_init(void);
 static void winsock_fini(void);
@@ -70,15 +70,15 @@ static int connection_port = 1234;
 static char *ext4_fname = "ext2";
 
 /**@brief   Verbose mode*/
-static int verbose = 0;
+static bool verbose = false;
 
 /**@brief   Winpart mode*/
-static int winpart = 0;
+static bool winpart = false;
 
 /**@brief   Blockdev handle*/
 static struct ext4_blockdev *bd;
 
-static int cache_wb = 0;
+static bool cache_wb = false;
 
 static char read_buffer[MAX_RW_BUFFER];
 static char write_buffer[MAX_RW_BUFFER];
@@ -113,7 +113,7 @@ struct lwext4_op_codes {
 
 /**@brief   Library call wraper.*/
 struct lwext4_call {
-       int (*lwext4_call)(char *p);
+       int (*lwext4_call)(const char *p);
 };
 
 /**@brief  */
@@ -153,64 +153,64 @@ static struct lwext4_op_codes op_codes[] = {
     "stats_check",
 };
 
-int _device_register(char *p);
-int _mount(char *p);
-int _umount(char *p);
-int _mount_point_stats(char *p);
-int _cache_write_back(char *p);
-int _fremove(char *p);
-int _fopen(char *p);
-int _fclose(char *p);
-int _fread(char *p);
-int _fwrite(char *p);
-int _fseek(char *p);
-int _ftell(char *p);
-int _fsize(char *p);
-int _dir_rm(char *p);
-int _dir_mk(char *p);
-int _dir_open(char *p);
-int _dir_close(char *p);
-int _dir_close(char *p);
-int _dir_entry_get(char *p);
-
-int _multi_fcreate(char *p);
-int _multi_fwrite(char *p);
-int _multi_fread(char *p);
-int _multi_fremove(char *p);
-int _multi_dcreate(char *p);
-int _multi_dremove(char *p);
-int _stats_save(char *p);
-int _stats_check(char *p);
+static int device_register(const char *p);
+static int mount(const char *p);
+static int umount(const char *p);
+static int mount_point_stats(const char *p);
+static int cache_write_back(const char *p);
+static int fremove(const char *p);
+static int file_open(const char *p);
+static int file_close(const char *p);
+static int file_read(const char *p);
+static int file_write(const char *p);
+static int file_seek(const char *p);
+static int file_tell(const char *p);
+static int file_size(const char *p);
+static int dir_rm(const char *p);
+static int dir_mk(const char *p);
+static int dir_open(const char *p);
+static int dir_close(const char *p);
+static int dir_close(const char *p);
+static int dir_entry_get(const char *p);
+
+static int multi_fcreate(const char *p);
+static int multi_fwrite(const char *p);
+static int multi_fread(const char *p);
+static int multi_fremove(const char *p);
+static int multi_dcreate(const char *p);
+static int multi_dremove(const char *p);
+static int stats_save(const char *p);
+static int stats_check(const char *p);
 
 /**@brief  */
 static struct lwext4_call op_call[] = {
-    _device_register,   /*PARAMS(3):   0 cache_mode dev_name   */
-    _mount,            /*PARAMS(2):   dev_name mount_point    */
-    _umount,           /*PARAMS(1):   mount_point             */
-    _mount_point_stats, /*PARAMS(2):   mount_point, 0          */
-    _cache_write_back,  /*PARAMS(2):   mount_point, en         */
-    _fremove,          /*PARAMS(1):   path                    */
-    _fopen,            /*PARAMS(2):   fid path flags          */
-    _fclose,           /*PARAMS(1):   fid                     */
-    _fread,            /*PARAMS(4):   fid 0 len 0             */
-    _fwrite,           /*PARAMS(4):   fid 0 len 0             */
-    _fseek,            /*PARAMS(2):   fid off origin          */
-    _ftell,            /*PARAMS(2):   fid exp                 */
-    _fsize,            /*PARAMS(2):   fid exp                 */
-    _dir_rm,           /*PARAMS(1):   path                    */
-    _dir_mk,           /*PARAMS(1):   path                    */
-    _dir_open,         /*PARAMS(2):   did, path               */
-    _dir_close,                /*PARAMS(1):   did                     */
-    _dir_entry_get,     /*PARAMS(2):   did, exp                */
-
-    _multi_fcreate, /*PARAMS(3):   path prefix cnt         */
-    _multi_fwrite,  /*PARAMS(4):   path prefix cnt size    */
-    _multi_fread,   /*PARAMS(4):   path prefix cnt size    */
-    _multi_fremove, /*PARAMS(2):   path prefix cnt         */
-    _multi_dcreate, /*PARAMS(3):   path prefix cnt         */
-    _multi_dremove, /*PARAMS(2):   path prefix             */
-    _stats_save,    /*PARAMS(1):   path                    */
-    _stats_check,   /*PARAMS(1):   path                    */
+    device_register,   /*PARAMS(3):   0 cache_mode dev_name   */
+    mount,             /*PARAMS(2):   dev_name mount_point    */
+    umount,            /*PARAMS(1):   mount_point             */
+    mount_point_stats, /*PARAMS(2):   mount_point, 0          */
+    cache_write_back,  /*PARAMS(2):   mount_point, en         */
+    fremove,           /*PARAMS(1):   path                    */
+    file_open,         /*PARAMS(2):   fid path flags          */
+    file_close,                /*PARAMS(1):   fid                     */
+    file_read,         /*PARAMS(4):   fid 0 len 0             */
+    file_write,                /*PARAMS(4):   fid 0 len 0             */
+    file_seek,         /*PARAMS(2):   fid off origin          */
+    file_tell,         /*PARAMS(2):   fid exp                 */
+    file_size,         /*PARAMS(2):   fid exp                 */
+    dir_rm,            /*PARAMS(1):   path                    */
+    dir_mk,            /*PARAMS(1):   path                    */
+    dir_open,          /*PARAMS(2):   did, path               */
+    dir_close,         /*PARAMS(1):   did                     */
+    dir_entry_get,     /*PARAMS(2):   did, exp                */
+
+    multi_fcreate, /*PARAMS(3):   path prefix cnt         */
+    multi_fwrite,  /*PARAMS(4):   path prefix cnt size    */
+    multi_fread,   /*PARAMS(4):   path prefix cnt size    */
+    multi_fremove, /*PARAMS(2):   path prefix cnt         */
+    multi_dcreate, /*PARAMS(3):   path prefix cnt         */
+    multi_dremove, /*PARAMS(2):   path prefix             */
+    stats_save,    /*PARAMS(1):   path                    */
+    stats_check,   /*PARAMS(1):   path                    */
 };
 
 static clock_t get_ms(void)
@@ -221,7 +221,7 @@ static clock_t get_ms(void)
 }
 
 /**@brief  */
-static int exec_op_code(char *opcode)
+static int exec_op_code(const char *opcode)
 {
        int i;
        int r = -1;
@@ -299,12 +299,13 @@ static bool parse_opt(int argc, char **argv)
        static struct option long_options[] = {
            {"image", required_argument, 0, 'i'},
            {"port", required_argument, 0, 'p'},
-           {"verbose", required_argument, 0, 'v'},
-           {"winpart", required_argument, 0, 'w'},
-           {"cache_wb", required_argument, 0, 'c'},
+           {"verbose", no_argument, 0, 'v'},
+           {"winpart", no_argument, 0, 'w'},
+           {"cache_wb", no_argument, 0, 'c'},
+           {"version", no_argument, 0, 'x'},
            {0, 0, 0, 0}};
 
-       while (-1 != (c = getopt_long(argc, argv, "c:i:p:v:w:", long_options,
+       while (-1 != (c = getopt_long(argc, argv, "i:p:vcwx", long_options,
                                      &option_index))) {
 
                switch (c) {
@@ -315,13 +316,17 @@ static bool parse_opt(int argc, char **argv)
                        connection_port = atoi(optarg);
                        break;
                case 'v':
-                       verbose = atoi(optarg);
+                       verbose = true;
                        break;
                case 'c':
-                       cache_wb = atoi(optarg);
+                       cache_wb = true;
                        break;
                case 'w':
-                       winpart = atoi(optarg);
+                       winpart = true;
+                       break;
+               case 'x':
+                       puts(VERSION);
+                       exit(0);
                        break;
                default:
                        printf("%s", usage);
@@ -375,7 +380,7 @@ int main(int argc, char *argv[])
        return 0;
 }
 
-int _device_register(char *p)
+static int device_register(const char *p)
 {
        int dev;
        int cache_mode;
@@ -388,19 +393,22 @@ int _device_register(char *p)
 
 #ifdef WIN32
        if (winpart) {
-               ext4_io_raw_filename(ext4_fname);
-               bd = ext4_io_raw_dev_get();
+               file_windows_name_set(ext4_fname);
+               bd = file_windows_dev_get();
 
        } else
 #endif
        {
-               ext4_filedev_filename(ext4_fname);
-               bd = ext4_filedev_get();
+               file_dev_name_set(ext4_fname);
+               bd = file_dev_get();
        }
-       return ext4_device_register(bd, 0, dev_name);
+
+       ext4_device_unregister_all();
+
+       return ext4_device_register(bd, dev_name);
 }
 
-int _mount(char *p)
+static int mount(const char *p)
 {
        char dev_name[32];
        char mount_point[32];
@@ -411,15 +419,30 @@ int _mount(char *p)
                return -1;
        }
 
-       rc = ext4_mount(dev_name, mount_point);
+       if (verbose)
+               ext4_dmask_set(DEBUG_ALL);
+
+       rc = ext4_mount(dev_name, mount_point, false);
+       if (rc != EOK)
+               return rc;
+
+       rc = ext4_recover(mount_point);
+       if (rc != EOK && rc != ENOTSUP)
+               return rc;
+
+       rc = ext4_journal_start(mount_point);
+       if (rc != EOK)
+               return rc;
+
        if (cache_wb)
                ext4_cache_write_back(mount_point, 1);
        return rc;
 }
 
-int _umount(char *p)
+static int umount(const char *p)
 {
        char mount_point[32];
+       int rc;
 
        if (sscanf(p, "%s", mount_point) != 1) {
                printf("Param list error\n");
@@ -429,10 +452,18 @@ int _umount(char *p)
        if (cache_wb)
                ext4_cache_write_back(mount_point, 0);
 
-       return ext4_umount(mount_point);
+       rc = ext4_journal_stop(mount_point);
+       if (rc != EOK)
+               return rc;
+
+       rc = ext4_umount(mount_point);
+       if (rc != EOK)
+               return rc;
+
+       return rc;
 }
 
-int _mount_point_stats(char *p)
+static int mount_point_stats(const char *p)
 {
        char mount_point[32];
        int d;
@@ -450,23 +481,26 @@ int _mount_point_stats(char *p)
                return rc;
 
        if (verbose) {
-               printf("\tinodes_count = %d\n", stats.inodes_count);
-               printf("\tfree_inodes_count = %d\n", stats.free_inodes_count);
-               printf("\tblocks_count = %llu\n", stats.blocks_count);
-               printf("\tfree_blocks_count = %llu\n", stats.free_blocks_count);
-
-               printf("\tblock_size = %d\n", stats.block_size);
-               printf("\tblock_group_count = %d\n", stats.block_group_count);
-               printf("\tblocks_per_group = %d\n", stats.blocks_per_group);
-               printf("\tinodes_per_group = %d\n", stats.inodes_per_group);
-
+               printf("\tinodes_count = %" PRIu32"\n", stats.inodes_count);
+               printf("\tfree_inodes_count = %" PRIu32"\n",
+                               stats.free_inodes_count);
+               printf("\tblocks_count = %" PRIu64"\n", stats.blocks_count);
+               printf("\tfree_blocks_count = %" PRIu64"\n",
+                               stats.free_blocks_count);
+               printf("\tblock_size = %" PRIu32"\n", stats.block_size);
+               printf("\tblock_group_count = %" PRIu32"\n",
+                               stats.block_group_count);
+               printf("\tblocks_per_group = %" PRIu32"\n",
+                               stats.blocks_per_group);
+               printf("\tinodes_per_group = %" PRIu32"\n",
+                               stats.inodes_per_group);
                printf("\tvolume_name = %s\n", stats.volume_name);
        }
 
        return rc;
 }
 
-int _cache_write_back(char *p)
+static int cache_write_back(const char *p)
 {
        char mount_point[32];
        int en;
@@ -479,7 +513,7 @@ int _cache_write_back(char *p)
        return ext4_cache_write_back(mount_point, en);
 }
 
-int _fremove(char *p)
+static int fremove(const char *p)
 {
        char path[255];
 
@@ -491,7 +525,7 @@ int _fremove(char *p)
        return ext4_fremove(path);
 }
 
-int _fopen(char *p)
+static int file_open(const char *p)
 {
        int fid = MAX_FILES;
        char path[256];
@@ -516,7 +550,7 @@ int _fopen(char *p)
        return rc;
 }
 
-int _fclose(char *p)
+static int file_close(const char *p)
 {
        int fid = MAX_FILES;
        int rc;
@@ -544,7 +578,7 @@ int _fclose(char *p)
        return rc;
 }
 
-int _fread(char *p)
+static int file_read(const char *p)
 {
        int fid = MAX_FILES;
        int len;
@@ -592,13 +626,13 @@ int _fread(char *p)
        return rc;
 }
 
-int _fwrite(char *p)
+static int file_write(const const char *p)
 {
        int fid = MAX_FILES;
        int d;
        int rc;
 
-       size_t len;
+       int len;
        size_t wb;
 
        if (sscanf(p, "%d %d %d %d", &fid, &d, &len, &d) != 4) {
@@ -634,7 +668,7 @@ int _fwrite(char *p)
        return rc;
 }
 
-int _fseek(char *p)
+static int file_seek(const char *p)
 {
        int fid = MAX_FILES;
        int off;
@@ -658,7 +692,7 @@ int _fseek(char *p)
        return ext4_fseek(&file_tab[fid].fd, off, origin);
 }
 
-int _ftell(char *p)
+static int file_tell(const char *p)
 {
        int fid = MAX_FILES;
        uint32_t exp_pos;
@@ -686,7 +720,7 @@ int _ftell(char *p)
        return EOK;
 }
 
-int _fsize(char *p)
+static int file_size(const char *p)
 {
        int fid = MAX_FILES;
        uint32_t exp_size;
@@ -714,7 +748,7 @@ int _fsize(char *p)
        return EOK;
 }
 
-int _dir_rm(char *p)
+static int dir_rm(const char *p)
 {
        char path[255];
 
@@ -726,7 +760,7 @@ int _dir_rm(char *p)
        return ext4_dir_rm(path);
 }
 
-int _dir_mk(char *p)
+static int dir_mk(const char *p)
 {
        char path[255];
 
@@ -738,7 +772,7 @@ int _dir_mk(char *p)
        return ext4_dir_mk(path);
 }
 
-int _dir_open(char *p)
+static int dir_open(const char *p)
 {
        int did = MAX_DIRS;
        char path[255];
@@ -762,7 +796,7 @@ int _dir_open(char *p)
        return rc;
 }
 
-int _dir_close(char *p)
+static int dir_close(const char *p)
 {
        int did = MAX_DIRS;
        int rc;
@@ -790,7 +824,7 @@ int _dir_close(char *p)
        return rc;
 }
 
-int _dir_entry_get(char *p)
+static int dir_entry_get(const char *p)
 {
        int did = MAX_DIRS;
        int exp;
@@ -837,7 +871,7 @@ int _dir_entry_get(char *p)
        return EOK;
 }
 
-int _multi_fcreate(char *p)
+static int multi_fcreate(const char *p)
 {
        char path[256];
        char path1[256];
@@ -863,7 +897,7 @@ int _multi_fcreate(char *p)
        return rc;
 }
 
-int _multi_fwrite(char *p)
+static int multi_fwrite(const char *p)
 {
        char path[256];
        char path1[256];
@@ -906,7 +940,7 @@ int _multi_fwrite(char *p)
        return rc;
 }
 
-int _multi_fread(char *p)
+static int multi_fread(const char *p)
 {
        char path[256];
        char path1[256];
@@ -956,7 +990,7 @@ int _multi_fread(char *p)
        return rc;
 }
 
-int _multi_fremove(char *p)
+static int multi_fremove(const char *p)
 {
        char path[256];
        char path1[256];
@@ -978,7 +1012,7 @@ int _multi_fremove(char *p)
        return rc;
 }
 
-int _multi_dcreate(char *p)
+static int multi_dcreate(const char *p)
 {
        char path[256];
        char path1[256];
@@ -1000,7 +1034,7 @@ int _multi_dcreate(char *p)
        return rc;
 }
 
-int _multi_dremove(char *p)
+static int multi_dremove(const char *p)
 {
        char path[256];
        char path1[256];
@@ -1024,7 +1058,7 @@ int _multi_dremove(char *p)
 
 struct ext4_mount_stats saved_stats;
 
-int _stats_save(char *p)
+static int stats_save(const char *p)
 {
        char path[256];
 
@@ -1036,7 +1070,7 @@ int _stats_save(char *p)
        return ext4_mount_point_stats(path, &saved_stats);
 }
 
-int _stats_check(char *p)
+static int stats_check(const char *p)
 {
        char path[256];
        int rc;
@@ -1058,37 +1092,38 @@ int _stats_check(char *p)
                if (verbose) {
                        printf("\tMount point stats error:\n");
                        printf("\tsaved_stats:\n");
-                       printf("\tinodes_count = %d\n",
+                       printf("\tinodes_count = %" PRIu32"\n",
                               saved_stats.inodes_count);
-                       printf("\tfree_inodes_count = %d\n",
+                       printf("\tfree_inodes_count = %" PRIu32"\n",
                               saved_stats.free_inodes_count);
-                       printf("\tblocks_count = %llu\n",
+                       printf("\tblocks_count = %" PRIu64"\n",
                               saved_stats.blocks_count);
-                       printf("\tfree_blocks_count = %llu\n",
+                       printf("\tfree_blocks_count = %" PRIu64"\n",
                               saved_stats.free_blocks_count);
-                       printf("\tblock_size = %d\n", saved_stats.block_size);
-                       printf("\tblock_group_count = %d\n",
+                       printf("\tblock_size = %" PRIu32"\n",
+                                       saved_stats.block_size);
+                       printf("\tblock_group_count = %" PRIu32"\n",
                               saved_stats.block_group_count);
-                       printf("\tblocks_per_group = %d\n",
+                       printf("\tblocks_per_group = %" PRIu32"\n",
                               saved_stats.blocks_per_group);
-                       printf("\tinodes_per_group = %d\n",
+                       printf("\tinodes_per_group = %" PRIu32"\n",
                               saved_stats.inodes_per_group);
                        printf("\tvolume_name = %s\n", saved_stats.volume_name);
                        printf("\tactual_stats:\n");
-                       printf("\tinodes_count = %d\n",
+                       printf("\tinodes_count = %" PRIu32"\n",
                               actual_stats.inodes_count);
-                       printf("\tfree_inodes_count = %d\n",
+                       printf("\tfree_inodes_count = %" PRIu32"\n",
                               actual_stats.free_inodes_count);
-                       printf("\tblocks_count = %llu\n",
+                       printf("\tblocks_count = %" PRIu64"\n",
                               actual_stats.blocks_count);
-                       printf("\tfree_blocks_count = %llu\n",
+                       printf("\tfree_blocks_count = %" PRIu64"\n",
                               actual_stats.free_blocks_count);
                        printf("\tblock_size = %d\n", actual_stats.block_size);
-                       printf("\tblock_group_count = %d\n",
+                       printf("\tblock_group_count = %" PRIu32"\n",
                               actual_stats.block_group_count);
-                       printf("\tblocks_per_group = %d\n",
+                       printf("\tblocks_per_group = %" PRIu32"\n",
                               actual_stats.blocks_per_group);
-                       printf("\tinodes_per_group = %d\n",
+                       printf("\tinodes_per_group = %" PRIu32"\n",
                               actual_stats.inodes_per_group);
                        printf("\tvolume_name = %s\n",
                               actual_stats.volume_name);
@@ -1102,22 +1137,22 @@ int _stats_check(char *p)
 static char *entry_to_str(uint8_t type)
 {
        switch (type) {
-       case EXT4_DIRENTRY_UNKNOWN:
-               return "[UNK] ";
-       case EXT4_DIRENTRY_REG_FILE:
-               return "[FIL] ";
-       case EXT4_DIRENTRY_DIR:
-               return "[DIR] ";
-       case EXT4_DIRENTRY_CHRDEV:
-               return "[CHA] ";
-       case EXT4_DIRENTRY_BLKDEV:
-               return "[BLK] ";
-       case EXT4_DIRENTRY_FIFO:
-               return "[FIF] ";
-       case EXT4_DIRENTRY_SOCK:
-               return "[SOC] ";
-       case EXT4_DIRENTRY_SYMLINK:
-               return "[SYM] ";
+       case EXT4_DE_UNKNOWN:
+               return "[unk] ";
+       case EXT4_DE_REG_FILE:
+               return "[fil] ";
+       case EXT4_DE_DIR:
+               return "[dir] ";
+       case EXT4_DE_CHRDEV:
+               return "[cha] ";
+       case EXT4_DE_BLKDEV:
+               return "[blk] ";
+       case EXT4_DE_FIFO:
+               return "[fif] ";
+       case EXT4_DE_SOCK:
+               return "[soc] ";
+       case EXT4_DE_SYMLINK:
+               return "[sym] ";
        default:
                break;
        }