From: Chengyu Zhu <[email protected]>

Factor out erofsmount_open_source() and erofsmount_open_recovery_source()
helpers; introduce EROFSMOUNT_RUNDIR / EROFSMOUNT_NBD_REC_FMT macros.

Signed-off-by: Chengyu Zhu <[email protected]>
---
 mount/main.c | 196 +++++++++++++++++++++++++--------------------------
 1 file changed, 98 insertions(+), 98 deletions(-)

diff --git a/mount/main.c b/mount/main.c
index 350738d..93c8444 100644
--- a/mount/main.c
+++ b/mount/main.c
@@ -41,6 +41,9 @@ struct loop_info {
 /* Device boundary probe */
 #define EROFSMOUNT_NBD_DISK_SIZE       (INT64_MAX >> 9)
 
+#define EROFSMOUNT_RUNDIR              "/var/run/erofs"
+#define EROFSMOUNT_NBD_REC_FMT         EROFSMOUNT_RUNDIR "/mountnbd_nbd%d"
+
 enum erofs_backend_drv {
        EROFSAUTO,
        EROFSLOCAL,
@@ -613,6 +616,25 @@ err_out:
        return err;
 }
 
+static int erofsmount_open_source(struct erofs_vfile *vf,
+                                 struct erofsmount_source *source)
+{
+       int err;
+
+       if (source->type == EROFSMOUNT_SOURCE_OCI) {
+               if (source->ocicfg.tarindex_path || source->ocicfg.zinfo_path)
+                       return erofsmount_tarindex_open(vf, &source->ocicfg,
+                                                       
source->ocicfg.tarindex_path,
+                                                       
source->ocicfg.zinfo_path);
+               return ocierofs_io_open(vf, &source->ocicfg);
+       }
+       err = open(source->device_path, O_RDONLY);
+       if (err < 0)
+               return -errno;
+       vf->fd = err;
+       return 0;
+}
+
 struct erofsmount_nbd_ctx {
        struct erofs_vfile vd;          /* virtual device */
        struct erofs_vfile sk;          /* socket file */
@@ -671,26 +693,9 @@ static int erofsmount_startnbd(int nbdfd, struct 
erofsmount_source *source)
        pthread_t th;
        int err, err2;
 
-       if (source->type == EROFSMOUNT_SOURCE_OCI) {
-               if (source->ocicfg.tarindex_path || source->ocicfg.zinfo_path) {
-                       err = erofsmount_tarindex_open(&ctx.vd, &source->ocicfg,
-                                                      
source->ocicfg.tarindex_path,
-                                                      
source->ocicfg.zinfo_path);
-                       if (err)
-                               goto out_closefd;
-               } else {
-                       err = ocierofs_io_open(&ctx.vd, &source->ocicfg);
-                       if (err)
-                               goto out_closefd;
-               }
-       } else {
-               err = open(source->device_path, O_RDONLY);
-               if (err < 0) {
-                       err = -errno;
-                       goto out_closefd;
-               }
-               ctx.vd.fd = err;
-       }
+       err = erofsmount_open_source(&ctx.vd, source);
+       if (err)
+               goto out_closefd;
 
        err = erofs_nbd_connect(nbdfd, 9, EROFSMOUNT_NBD_DISK_SIZE);
        if (err < 0) {
@@ -797,13 +802,13 @@ static int erofsmount_write_recovery_local(FILE *f, 
struct erofsmount_source *so
 
 static char *erofsmount_write_recovery_info(struct erofsmount_source *source)
 {
-       char recp[] = "/var/run/erofs/mountnbd_XXXXXX";
+       char recp[] = EROFSMOUNT_RUNDIR "/mountnbd_XXXXXX";
        int fd, err;
        FILE *f;
 
        fd = mkstemp(recp);
        if (fd < 0 && errno == ENOENT) {
-               err = mkdir("/var/run/erofs", 0700);
+               err = mkdir(EROFSMOUNT_RUNDIR, 0700);
                if (err)
                        return ERR_PTR(-errno);
                fd = mkstemp(recp);
@@ -945,7 +950,7 @@ static int erofsmount_reattach_oci(struct erofs_vfile *vf,
 }
 #endif
 
-static int erofsmount_reattach_gzran_oci(struct erofsmount_nbd_ctx *ctx,
+static int erofsmount_reattach_gzran_oci(struct erofs_vfile *vd,
                                         char *source)
 {
        char *tokens[6] = {0}, *p = source, *space, *oci_source;
@@ -975,12 +980,12 @@ static int erofsmount_reattach_gzran_oci(struct 
erofsmount_nbd_ctx *ctx,
        if (err < 0)
                return -ENOMEM;
 
-       err = erofsmount_reattach_oci(&ctx->vd, "OCI_NATIVE_BLOB", oci_source);
+       err = erofsmount_reattach_oci(vd, "OCI_NATIVE_BLOB", oci_source);
        free(oci_source);
        if (err)
                return err;
 
-       temp_vd = ctx->vd;
+       temp_vd = *vd;
        oci_cfg.image_ref = strdup(source);
        if (!oci_cfg.image_ref) {
                erofs_io_close(&temp_vd);
@@ -992,13 +997,60 @@ static int erofsmount_reattach_gzran_oci(struct 
erofsmount_nbd_ctx *ctx,
        if (token_count > 4 && tokens[4] && *tokens[4])
                zinfo_path = tokens[4];
 
-       err = erofsmount_tarindex_open(&ctx->vd, &oci_cfg,
+       err = erofsmount_tarindex_open(vd, &oci_cfg,
                                       meta_path, zinfo_path);
        free(oci_cfg.image_ref);
        erofs_io_close(&temp_vd);
        return err;
 }
 
+static int erofsmount_open_recovery_source(FILE *f,
+                                          struct erofs_vfile *vd)
+{
+       char *line = NULL, *source;
+       size_t n = 0;
+       int err;
+
+       err = getline(&line, &n, f);
+       if (err <= 0) {
+               err = -errno;
+               fclose(f);
+               goto out;
+       }
+       fclose(f);
+       if (err && line[err - 1] == '\n')
+               line[err - 1] = '\0';
+
+       source = strchr(line, ' ');
+       if (!source) {
+               erofs_err("invalid source in recovery file: %s", line);
+               err = -EINVAL;
+               goto out;
+       }
+       *(source++) = '\0';
+
+       if (!strcmp(line, "LOCAL")) {
+               err = open(source, O_RDONLY);
+               if (err < 0) {
+                       err = -errno;
+                       goto out;
+               }
+               vd->fd = err;
+               err = 0;
+       } else if (!strcmp(line, "TARINDEX_OCI_BLOB")) {
+               err = erofsmount_reattach_gzran_oci(vd, source);
+       } else if (!strcmp(line, "OCI_LAYER") || !strcmp(line, 
"OCI_NATIVE_BLOB")) {
+               err = erofsmount_reattach_oci(vd, line, source);
+       } else {
+               erofs_err("unsupported source type %s in recovery file",
+                         line);
+               err = -EOPNOTSUPP;
+       }
+out:
+       free(line);
+       return err;
+}
+
 static int erofsmount_nbd_fix_backend_linkage(int num, char **recp)
 {
        char *newrecp;
@@ -1013,7 +1065,7 @@ static int erofsmount_nbd_fix_backend_linkage(int num, 
char **recp)
                return err;
        }
 
-       if (asprintf(&newrecp, "/var/run/erofs/mountnbd_nbd%d", num) <= 0)
+       if (asprintf(&newrecp, EROFSMOUNT_NBD_REC_FMT, num) <= 0)
                return -ENOMEM;
 
        if (rename(*recp, newrecp) < 0) {
@@ -1042,24 +1094,9 @@ static int erofsmount_startnbd_nl(pid_t *pid, struct 
erofsmount_source *source)
                if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
                        exit(EXIT_FAILURE);
 
-               if (source->type == EROFSMOUNT_SOURCE_OCI) {
-                       if (source->ocicfg.tarindex_path || 
source->ocicfg.zinfo_path) {
-                               err = erofsmount_tarindex_open(&ctx.vd, 
&source->ocicfg,
-                                                              
source->ocicfg.tarindex_path,
-                                                              
source->ocicfg.zinfo_path);
-                               if (err)
-                                       exit(EXIT_FAILURE);
-                       } else {
-                               err = ocierofs_io_open(&ctx.vd, 
&source->ocicfg);
-                               if (err)
-                                       exit(EXIT_FAILURE);
-                       }
-               } else {
-                       err = open(source->device_path, O_RDONLY);
-                       if (err < 0)
-                               exit(EXIT_FAILURE);
-                       ctx.vd.fd = err;
-               }
+               err = erofsmount_open_source(&ctx.vd, source);
+               if (err)
+                       exit(EXIT_FAILURE);
                recp = erofsmount_write_recovery_info(source);
                if (IS_ERR(recp)) {
                        erofs_io_close(&ctx.vd);
@@ -1101,11 +1138,10 @@ out_fork:
 
 static int erofsmount_reattach(const char *target)
 {
-       char *identifier, *line, *source, *recp = NULL;
+       char *identifier;
        struct erofsmount_nbd_ctx ctx = {};
        int nbdnum, err;
        struct stat st;
-       size_t n;
        FILE *f;
 
        err = lstat(target, &st);
@@ -1126,65 +1162,31 @@ static int erofsmount_reattach(const char *target)
                identifier = NULL;
        }
 
-       if (!identifier &&
-           (asprintf(&recp, "/var/run/erofs/mountnbd_nbd%d", nbdnum) <= 0)) {
-               err = -ENOMEM;
-               goto err_identifier;
-       }
+       if (!identifier) {
+               char *recp;
 
-       f = fopen(identifier ?: recp, "r");
-       if (!f) {
-               err = -errno;
+               if (asprintf(&recp, EROFSMOUNT_NBD_REC_FMT, nbdnum) <= 0) {
+                       err = -ENOMEM;
+                       goto err_out;
+               }
+               f = fopen(recp, "r");
                free(recp);
-               goto err_identifier;
+       } else {
+               f = fopen(identifier, "r");
        }
-       free(recp);
-
-       line = NULL;
-       if ((err = getline(&line, &n, f)) <= 0) {
+       if (!f) {
                err = -errno;
-               fclose(f);
-               goto err_identifier;
-       }
-       fclose(f);
-       if (err && line[err - 1] == '\n')
-               line[err - 1] = '\0';
-
-       source = strchr(line, ' ');
-       if (!source) {
-               erofs_err("invalid source recorded in recovery file: %s", line);
-               err = -EINVAL;
-               goto err_line;
-       } else {
-               *(source++) = '\0';
+               goto err_out;
        }
 
-       if (!strcmp(line, "LOCAL")) {
-               err = open(source, O_RDONLY);
-               if (err < 0) {
-                       err = -errno;
-                       goto err_line;
-               }
-               ctx.vd.fd = err;
-       } else if (!strcmp(line, "TARINDEX_OCI_BLOB")) {
-               err = erofsmount_reattach_gzran_oci(&ctx, source);
-               if (err)
-                       goto err_line;
-       } else if (!strcmp(line, "OCI_LAYER") || !strcmp(line, 
"OCI_NATIVE_BLOB")) {
-               err = erofsmount_reattach_oci(&ctx.vd, line, source);
-               if (err)
-                       goto err_line;
-       } else {
-               err = -EOPNOTSUPP;
-               erofs_err("unsupported source type %s recorded in recovery 
file", line);
-               goto err_line;
-       }
+       err = erofsmount_open_recovery_source(f, &ctx.vd);
+       if (err)
+               goto err_out;
 
        err = erofs_nbd_nl_reconnect(nbdnum, identifier);
        if (err >= 0) {
                ctx.sk.fd = err;
                if (fork() == 0) {
-                       free(line);
                        free(identifier);
                        if ((uintptr_t)erofsmount_nbd_loopfn(&ctx))
                                return EXIT_FAILURE;
@@ -1194,9 +1196,7 @@ static int erofsmount_reattach(const char *target)
                err = 0;
        }
        erofs_io_close(&ctx.vd);
-err_line:
-       free(line);
-err_identifier:
+err_out:
        free(identifier);
        return err;
 }
-- 
2.47.1


Reply via email to