1.1 --- a/include/e2access/image.h Mon Mar 25 00:04:18 2019 +0100
1.2 +++ b/include/e2access/image.h Mon Mar 25 22:17:43 2019 +0100
1.3 @@ -44,6 +44,10 @@
1.4 errcode_t image_inode(ext2_filsys fs, const char *pathname,
1.5 struct ext2_inode *inode);
1.6
1.7 +errcode_t image_make_dir(ext2_filsys fs, ext2_ino_t ino_dir,
1.8 + const char *basename, __u16 mode,
1.9 + __u16 uid, __u16 gid, ext2_ino_t *ino);
1.10 +
1.11 errcode_t image_make_next_dir(ext2_filsys fs, ext2_ino_t ino_dir,
1.12 const char **basename, __u16 mode, __u16 uid,
1.13 __u16 gid, ext2_ino_t *ino);
2.1 --- a/lib/src/image.c Mon Mar 25 00:04:18 2019 +0100
2.2 +++ b/lib/src/image.c Mon Mar 25 22:17:43 2019 +0100
2.3 @@ -185,6 +185,37 @@
2.4 return ext2fs_read_inode(fs, ino, inode);
2.5 }
2.6
2.7 +/* Make a directory in the given directory in the filesystem image having the
2.8 + given name and metadata. */
2.9 +
2.10 +errcode_t image_make_dir(ext2_filsys fs, ext2_ino_t ino_dir,
2.11 + const char *basename, __u16 mode,
2.12 + __u16 uid, __u16 gid, ext2_ino_t *ino)
2.13 +{
2.14 + struct ext2_inode inode_dir;
2.15 + errcode_t retval = 0;
2.16 +
2.17 + /* Create an inode in the directory. */
2.18 +
2.19 + retval = ext2fs_new_inode(fs, ino_dir, LINUX_S_IFDIR | mode, 0, ino);
2.20 + if (retval)
2.21 + return retval;
2.22 +
2.23 + /* Make the directory and update the metadata (due to ext2fs_mkdir
2.24 + limitation). */
2.25 +
2.26 + retval = ext2fs_mkdir(fs, ino_dir, *ino, basename);
2.27 + if (retval)
2.28 + return retval;
2.29 +
2.30 + retval = ext2fs_read_inode(fs, *ino, &inode_dir);
2.31 + if (retval)
2.32 + return retval;
2.33 +
2.34 + image_set_metadata(&inode_dir, 0, LINUX_S_IFDIR | mode, uid, gid);
2.35 + return ext2fs_write_inode(fs, *ino, &inode_dir);
2.36 +}
2.37 +
2.38 /* Make a directory in the given directory in the filesystem image, updating
2.39 the name reference to refer to the next component. */
2.40
2.41 @@ -192,7 +223,6 @@
2.42 const char **basename, __u16 mode, __u16 uid,
2.43 __u16 gid, ext2_ino_t *ino)
2.44 {
2.45 - struct ext2_inode inode_dir;
2.46 char *end = (char *) path_component_end(*basename);
2.47 char endchar = *end;
2.48 errcode_t retval = 0;
2.49 @@ -205,27 +235,7 @@
2.50 /* Do not create directories for empty components. */
2.51
2.52 if (**basename)
2.53 - {
2.54 - /* Create an inode in the directory. */
2.55 -
2.56 - retval = ext2fs_new_inode(fs, ino_dir, LINUX_S_IFDIR | mode, 0, ino);
2.57 - if (retval)
2.58 - return retval;
2.59 -
2.60 - /* Make the directory and update the metadata (due to ext2fs_mkdir
2.61 - limitation). */
2.62 -
2.63 - retval = ext2fs_mkdir(fs, ino_dir, *ino, *basename);
2.64 - if (!retval)
2.65 - {
2.66 - retval = ext2fs_read_inode(fs, *ino, &inode_dir);
2.67 - if (!retval)
2.68 - {
2.69 - image_set_metadata(&inode_dir, 0, LINUX_S_IFDIR | mode, uid, gid);
2.70 - retval = ext2fs_write_inode(fs, *ino, &inode_dir);
2.71 - }
2.72 - }
2.73 - }
2.74 + retval = image_make_dir(fs, ino_dir, *basename, mode, uid, gid, ino);
2.75
2.76 /* Restore the path separator and update the current component. */
2.77