1.1 --- a/image.c Mon Mar 25 15:51:46 2019 +0100
1.2 +++ b/image.c Mon Mar 25 17:30:33 2019 +0100
1.3 @@ -185,6 +185,37 @@
1.4 return ext2fs_read_inode(fs, ino, inode);
1.5 }
1.6
1.7 +/* Make a directory in the given directory in the filesystem image having the
1.8 + given name and metadata. */
1.9 +
1.10 +errcode_t image_make_dir(ext2_filsys fs, ext2_ino_t ino_dir,
1.11 + const char *basename, __u16 mode,
1.12 + __u16 uid, __u16 gid, ext2_ino_t *ino)
1.13 +{
1.14 + struct ext2_inode inode_dir;
1.15 + errcode_t retval = 0;
1.16 +
1.17 + /* Create an inode in the directory. */
1.18 +
1.19 + retval = ext2fs_new_inode(fs, ino_dir, LINUX_S_IFDIR | mode, 0, ino);
1.20 + if (retval)
1.21 + return retval;
1.22 +
1.23 + /* Make the directory and update the metadata (due to ext2fs_mkdir
1.24 + limitation). */
1.25 +
1.26 + retval = ext2fs_mkdir(fs, ino_dir, *ino, basename);
1.27 + if (retval)
1.28 + return retval;
1.29 +
1.30 + retval = ext2fs_read_inode(fs, *ino, &inode_dir);
1.31 + if (retval)
1.32 + return retval;
1.33 +
1.34 + image_set_metadata(&inode_dir, 0, LINUX_S_IFDIR | mode, uid, gid);
1.35 + return ext2fs_write_inode(fs, *ino, &inode_dir);
1.36 +}
1.37 +
1.38 /* Make a directory in the given directory in the filesystem image, updating
1.39 the name reference to refer to the next component. */
1.40
1.41 @@ -192,7 +223,6 @@
1.42 const char **basename, __u16 mode, __u16 uid,
1.43 __u16 gid, ext2_ino_t *ino)
1.44 {
1.45 - struct ext2_inode inode_dir;
1.46 char *end = (char *) path_component_end(*basename);
1.47 char endchar = *end;
1.48 errcode_t retval = 0;
1.49 @@ -205,27 +235,7 @@
1.50 /* Do not create directories for empty components. */
1.51
1.52 if (**basename)
1.53 - {
1.54 - /* Create an inode in the directory. */
1.55 -
1.56 - retval = ext2fs_new_inode(fs, ino_dir, LINUX_S_IFDIR | mode, 0, ino);
1.57 - if (retval)
1.58 - return retval;
1.59 -
1.60 - /* Make the directory and update the metadata (due to ext2fs_mkdir
1.61 - limitation). */
1.62 -
1.63 - retval = ext2fs_mkdir(fs, ino_dir, *ino, *basename);
1.64 - if (!retval)
1.65 - {
1.66 - retval = ext2fs_read_inode(fs, *ino, &inode_dir);
1.67 - if (!retval)
1.68 - {
1.69 - image_set_metadata(&inode_dir, 0, LINUX_S_IFDIR | mode, uid, gid);
1.70 - retval = ext2fs_write_inode(fs, *ino, &inode_dir);
1.71 - }
1.72 - }
1.73 - }
1.74 + retval = image_make_dir(fs, ino_dir, *basename, mode, uid, gid, ino);
1.75
1.76 /* Restore the path separator and update the current component. */
1.77
2.1 --- a/image.h Mon Mar 25 15:51:46 2019 +0100
2.2 +++ b/image.h Mon Mar 25 17:30:33 2019 +0100
2.3 @@ -44,6 +44,10 @@
2.4 errcode_t image_inode(ext2_filsys fs, const char *pathname,
2.5 struct ext2_inode *inode);
2.6
2.7 +errcode_t image_make_dir(ext2_filsys fs, ext2_ino_t ino_dir,
2.8 + const char *basename, __u16 mode,
2.9 + __u16 uid, __u16 gid, ext2_ino_t *ino);
2.10 +
2.11 errcode_t image_make_next_dir(ext2_filsys fs, ext2_ino_t ino_dir,
2.12 const char **basename, __u16 mode, __u16 uid,
2.13 __u16 gid, ext2_ino_t *ino);