1.1 --- a/libe2access/host/e2access.c Thu Mar 03 23:59:16 2022 +0100
1.2 +++ b/libe2access/host/e2access.c Fri Mar 04 00:07:50 2022 +0100
1.3 @@ -206,6 +206,39 @@
1.4
1.5
1.6
1.7 +/* Make a new object using the given function. */
1.8 +
1.9 +static int _make_object(ext2_filsys fs, const char *filename,
1.10 + ext2_ino_t ino_parent, const char *basename,
1.11 + ext2_ino_t *ino_target,
1.12 + errcode_t (*fn)(ext2_filsys, ext2_ino_t, const char *,
1.13 + __u16, __u16, __u16, ext2_ino_t *))
1.14 +{
1.15 + errcode_t retval;
1.16 + struct stat st;
1.17 +
1.18 + /* Obtain the metadata. */
1.19 +
1.20 + if (lstat(filename, &st))
1.21 + {
1.22 + fprintf(stderr, "Failed to read object metadata: %s\n", filename);
1.23 + return 1;
1.24 + }
1.25 +
1.26 + retval = fn(fs, ino_parent, basename, st.st_mode & ~md.mask,
1.27 + md.have_uid ? md.uid : st.st_uid,
1.28 + md.have_gid ? md.gid : st.st_gid,
1.29 + ino_target);
1.30 +
1.31 + if (retval)
1.32 + {
1.33 + fprintf(stderr, "Failed to create object: %s\n", filename);
1.34 + return 1;
1.35 + }
1.36 +
1.37 + return 0;
1.38 +}
1.39 +
1.40 /* Copy a source file from the external environment into the filesystem. */
1.41
1.42 static int _copy_in(ext2_filsys fs, const char *filename, ext2_ino_t ino_target,
1.43 @@ -243,25 +276,9 @@
1.44 return 1;
1.45 }
1.46
1.47 - /* Obtain the metadata. */
1.48 -
1.49 - if (lstat(filename, &st))
1.50 - {
1.51 - fprintf(stderr, "Failed to read object metadata: %s\n", filename);
1.52 + if (_make_object(fs, filename, ino_parent, basename, &ino_target,
1.53 + image_make_dir))
1.54 return 1;
1.55 - }
1.56 -
1.57 - retval = image_make_dir(fs, ino_parent, basename,
1.58 - st.st_mode & ~md.mask,
1.59 - md.have_uid ? md.uid : st.st_uid,
1.60 - md.have_gid ? md.gid : st.st_gid,
1.61 - &ino_target);
1.62 -
1.63 - if (retval)
1.64 - {
1.65 - fprintf(stderr, "Failed to create directory: %s\n", filename);
1.66 - return 1;
1.67 - }
1.68 }
1.69
1.70 /* Files are copied. */
1.71 @@ -274,24 +291,9 @@
1.72
1.73 if (target_is_new)
1.74 {
1.75 - /* Populate the inode details. */
1.76 -
1.77 - if (lstat(filename, &st))
1.78 - {
1.79 - fprintf(stderr, "Failed to read object metadata: %s\n", filename);
1.80 + if (_make_object(fs, filename, ino_parent, basename, &ino_target,
1.81 + image_create_file))
1.82 return 1;
1.83 - }
1.84 -
1.85 - retval = image_create_file(fs, ino_parent, basename,
1.86 - st.st_mode & ~md.mask,
1.87 - md.have_uid ? md.uid : st.st_uid,
1.88 - md.have_gid ? md.gid : st.st_gid,
1.89 - &ino_target);
1.90 - if (retval)
1.91 - {
1.92 - fprintf(stderr, "Failed to create file: %s\n", filename);
1.93 - return 1;
1.94 - }
1.95
1.96 flags |= EXT2_FILE_CREATE;
1.97 }