Signed-off-by: Gao Xiang <[email protected]>
---
 erofs_io.c  | 74 ++++++++++++++++++-------------------------------------------
 mkfs_main.c | 11 ++++-----
 2 files changed, 27 insertions(+), 58 deletions(-)

diff --git a/erofs_io.c b/erofs_io.c
index 57e283e..563ca3f 100644
--- a/erofs_io.c
+++ b/erofs_io.c
@@ -22,93 +22,61 @@
 #define pr_fmt(fmt) "DEVICE IO: " FUNC_LINE_FMT fmt "\n"
 #include "erofs_debug.h"
 
-static char *erofs_devname;
+static const char *erofs_devname;
 static int erofs_devfd = -1;
 static u64 erofs_devsz;
 
 void dev_close(void)
 {
        close(erofs_devfd);
-       free(erofs_devname);
        erofs_devname = NULL;
        erofs_devfd   = -1;
        erofs_devsz   = 0;
 }
 
-int dev_open(const char *devname)
+int dev_open(const char *dev)
 {
-       char *dev;
        struct stat st;
-       int fd;
-       int ret;
-
-       dev = strdup(devname);
-       if (!dev)
-               return -ENOMEM;
-again:
-       fd = open(dev, O_RDWR);
-       if (fd < 0 && errno != ENOENT) {
-               erofs_err("Open device/file(%s) fail.", dev);
-               free(dev);
-               return -errno;
-       }
+       int fd, ret;
 
+       fd = open(dev, O_RDWR | O_CREAT, 0644);
        if (fd < 0) {
-               fd = open(dev, O_RDWR | O_CREAT | O_NOCTTY,
-                         S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
-               if (fd < 0) {
-                       if (errno != EEXIST) {
-                               erofs_err("Create image file(%s) fail.", dev);
-                               free(dev);
-                               return -errno;
-                       }
-
-                       erofs_dbg("Image file(%s) existed, it might be created 
by the other users.",
-                                 dev);
-                       goto again;
-
-               }
+               erofs_err("failed to open(%s).", dev);
+               return -errno;
        }
 
        ret = fstat(fd, &st);
        if (ret) {
-               erofs_err("Get stat of device/file(%s) fail.", dev);
+               erofs_err("failed to fstat(%s).", dev);
                close(fd);
-               free(dev);
                return -errno;
        }
 
-       if (!S_ISBLK(st.st_mode) && !S_ISREG(st.st_mode)) {
-               erofs_err("File (%s) type is wrong.", dev);
-               close(fd);
-               free(dev);
-               return -EINVAL;
-       }
-
-       if (S_ISREG(st.st_mode)) {
+       switch(st.st_mode & S_IFMT) {
+       case S_IFBLK:
+               erofs_devsz = st.st_size;
+               break;
+       case S_IFREG:
                ret = ftruncate(fd, 0);
                if (ret) {
-                       erofs_err("Truncate file(%s) fail.", dev);
+                       erofs_err("failed to ftruncate(%s).", dev);
                        close(fd);
-                       free(dev);
                        return -errno;
                }
-       }
-
-       erofs_devname = dev;
-       erofs_devfd   = fd;
-
-       if (S_ISBLK(st.st_mode)) {
-               erofs_devsz = st.st_size;
-       } else {
                /* INT64_MAX is the limit of kernel vfs */
                erofs_devsz = INT64_MAX;
+               break;
+       default:
+               erofs_err("bad file type (%s, %o).", dev, st.st_mode);
+               close(fd);
+               return -EINVAL;
        }
 
+       erofs_devname = dev;
+       erofs_devfd = fd;
        erofs_devsz = round_down(erofs_devsz, EROFS_BLKSIZE);
 
-       erofs_info("Open device/file %s", erofs_devname);
-
+       erofs_info("successfully to open %s", dev);
        return 0;
 }
 
diff --git a/mkfs_main.c b/mkfs_main.c
index 17611f4..30b0a22 100644
--- a/mkfs_main.c
+++ b/mkfs_main.c
@@ -107,11 +107,6 @@ static void mkfs_parse_options_cfg(int argc, char *argv[])
        erofs_compress_alg_init(erofs_cfg.c_alg_name);
 
        mkfs_dump_config();
-
-       if (dev_open(erofs_cfg.c_img_path) < 0) {
-               erofs_err("dev_open is failed!!!");
-               usage(argv[0]);
-       }
 }
 
 void mkfs_update_erofs_header(u64 root_addr)
@@ -156,6 +151,12 @@ int main(int argc, char **argv)
        mkfs_init_configure();
        mkfs_parse_options_cfg(argc, argv);
 
+       err = dev_open(erofs_cfg.c_img_path);
+       if (err) {
+               usage(argv[0]);
+               return -1;
+       }
+
        proot_node = mkfs_prepare_root_inode(erofs_cfg.c_src_path);
        if (!proot_node)
                goto exit;
-- 
2.14.4

Reply via email to