Skip to content

Commit d978b66

Browse files
committed
mke2fs: the -d option can now handle tarball input
If archive.h is available during compilation, enable mke2fs to read a tarball as input. Since libarchive.so.13 is opened with dlopen, libarchive is not a hard library dependency of the resulting binary. In comparison with feeding a directory tree to mke2fs via -d this has the following advantages: - no superuser privileges, nor fakeroot, nor unshared user namespaces are needed to create filesystems with arbitrary ownership information and special files like device nodes which otherwise need require root - by reading a tarball from standard input, no temporary files need to be written out first as mke2fs can be used as part of a shell pipeline which reduces disk usage and makes the conversion independent of the underlying file system A round-trip from tarball to ext4 to tarball yields bit-by-bit identical results Signed-off-by: Johannes Schauer Marin Rodrigues <josch@mister-muffin.de>
1 parent 260dfea commit d978b66

24 files changed

+1692
-35
lines changed

MCONFIG.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ LIBFUSE = @FUSE_LIB@
141141
LIBSUPPORT = $(LIBINTL) $(LIB)/libsupport@STATIC_LIB_EXT@
142142
LIBBLKID = @LIBBLKID@ @PRIVATE_LIBS_CMT@ $(LIBUUID)
143143
LIBINTL = @LIBINTL@
144+
LIBARCHIVE = @ARCHIVE_LIB@
144145
SYSLIBS = @LIBS@ @PTHREAD_LIBS@
145146
DEPLIBSS = $(LIB)/libss@LIB_EXT@
146147
DEPLIBCOM_ERR = $(LIB)/libcom_err@LIB_EXT@

configure

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,7 @@ SEM_INIT_LIB
704704
FUSE_CMT
705705
FUSE_LIB
706706
CLOCK_GETTIME_LIB
707+
ARCHIVE_LIB
707708
MAGIC_LIB
708709
SOCKET_LIB
709710
SIZEOF_TIME_T
@@ -13540,6 +13541,57 @@ if test "$ac_cv_func_dlopen" = yes ; then
1354013541
MAGIC_LIB=$DLOPEN_LIB
1354113542
fi
1354213543

13544+
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archive_read_new in -larchive" >&5
13545+
printf %s "checking for archive_read_new in -larchive... " >&6; }
13546+
if test ${ac_cv_lib_archive_archive_read_new+y}
13547+
then :
13548+
printf %s "(cached) " >&6
13549+
else $as_nop
13550+
ac_check_lib_save_LIBS=$LIBS
13551+
LIBS="-larchive $LIBS"
13552+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
13553+
/* end confdefs.h. */
13554+
13555+
/* Override any GCC internal prototype to avoid an error.
13556+
Use char because int might match the return type of a GCC
13557+
builtin and then its argument prototype would still apply. */
13558+
char archive_read_new ();
13559+
int
13560+
main (void)
13561+
{
13562+
return archive_read_new ();
13563+
;
13564+
return 0;
13565+
}
13566+
_ACEOF
13567+
if ac_fn_c_try_link "$LINENO"
13568+
then :
13569+
ac_cv_lib_archive_archive_read_new=yes
13570+
else $as_nop
13571+
ac_cv_lib_archive_archive_read_new=no
13572+
fi
13573+
rm -f core conftest.err conftest.$ac_objext conftest.beam \
13574+
conftest$ac_exeext conftest.$ac_ext
13575+
LIBS=$ac_check_lib_save_LIBS
13576+
fi
13577+
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_archive_archive_read_new" >&5
13578+
printf "%s\n" "$ac_cv_lib_archive_archive_read_new" >&6; }
13579+
if test "x$ac_cv_lib_archive_archive_read_new" = xyes
13580+
then :
13581+
ARCHIVE_LIB=-larchive
13582+
ac_fn_c_check_header_compile "$LINENO" "archive.h" "ac_cv_header_archive_h" "$ac_includes_default"
13583+
if test "x$ac_cv_header_archive_h" = xyes
13584+
then :
13585+
printf "%s\n" "#define HAVE_ARCHIVE_H 1" >>confdefs.h
13586+
13587+
fi
13588+
13589+
fi
13590+
13591+
if test "$ac_cv_func_dlopen" = yes ; then
13592+
ARCHIVE_LIB=$DLOPEN_LIB
13593+
fi
13594+
1354313595
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
1354413596
printf %s "checking for clock_gettime in -lrt... " >&6; }
1354513597
if test ${ac_cv_lib_rt_clock_gettime+y}

configure.ac

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,6 +1298,15 @@ if test "$ac_cv_func_dlopen" = yes ; then
12981298
fi
12991299
AC_SUBST(MAGIC_LIB)
13001300
dnl
1301+
dnl libarchive
1302+
dnl
1303+
AC_CHECK_LIB(archive, archive_read_new, [ARCHIVE_LIB=-larchive
1304+
AC_CHECK_HEADERS([archive.h])])
1305+
if test "$ac_cv_func_dlopen" = yes ; then
1306+
ARCHIVE_LIB=$DLOPEN_LIB
1307+
fi
1308+
AC_SUBST(ARCHIVE_LIB)
1309+
dnl
13011310
dnl Check to see if librt is required for clock_gettime() (glibc < 2.17)
13021311
dnl
13031312
AC_CHECK_LIB(rt, clock_gettime, [CLOCK_GETTIME_LIB=-lrt])

debugfs/Makefile.in

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ MK_CMDS= _SS_DIR_OVERRIDE=$(srcdir)/../lib/ss ../lib/ss/mk_cmds
2020
DEBUG_OBJS= debug_cmds.o debugfs.o util.o ncheck.o icheck.o ls.o \
2121
lsdel.o dump.o set_fields.o logdump.o htree.o unused.o e2freefrag.o \
2222
filefrag.o extent_cmds.o extent_inode.o zap.o create_inode.o \
23-
quota.o xattrs.o journal.o revoke.o recovery.o do_journal.o
23+
create_inode_libarchive.o quota.o xattrs.o journal.o revoke.o \
24+
recovery.o do_journal.o
2425

2526
RO_DEBUG_OBJS= ro_debug_cmds.o ro_debugfs.o util.o ncheck.o icheck.o ls.o \
2627
lsdel.o logdump.o htree.o e2freefrag.o filefrag.o extent_cmds.o \
@@ -31,12 +32,13 @@ SRCS= debug_cmds.c $(srcdir)/debugfs.c $(srcdir)/util.c $(srcdir)/ls.c \
3132
$(srcdir)/dump.c $(srcdir)/set_fields.c ${srcdir}/logdump.c \
3233
$(srcdir)/htree.c $(srcdir)/unused.c ${srcdir}/../misc/e2freefrag.c \
3334
$(srcdir)/filefrag.c $(srcdir)/extent_inode.c $(srcdir)/zap.c \
34-
$(srcdir)/../misc/create_inode.c $(srcdir)/xattrs.c $(srcdir)/quota.c \
35-
$(srcdir)/journal.c $(srcdir)/../e2fsck/revoke.c \
35+
$(srcdir)/../misc/create_inode.c \
36+
$(srcdir)/../misc/create_inode_libarchive.c $(srcdir)/xattrs.c \
37+
$(srcdir)/quota.c $(srcdir)/journal.c $(srcdir)/../e2fsck/revoke.c \
3638
$(srcdir)/../e2fsck/recovery.c $(srcdir)/do_journal.c
3739

3840
LIBS= $(LIBSUPPORT) $(LIBEXT2FS) $(LIBE2P) $(LIBSS) $(LIBCOM_ERR) $(LIBBLKID) \
39-
$(LIBUUID) $(LIBMAGIC) $(SYSLIBS)
41+
$(LIBUUID) $(LIBMAGIC) $(SYSLIBS) $(LIBARCHIVE)
4042
DEPLIBS= $(DEPLIBSUPPORT) $(LIBEXT2FS) $(LIBE2P) $(DEPLIBSS) $(DEPLIBCOM_ERR) \
4143
$(DEPLIBBLKID) $(DEPLIBUUID)
4244

@@ -113,6 +115,11 @@ create_inode.o: $(srcdir)/../misc/create_inode.c
113115
$(Q) $(CC) -c $(ALL_CFLAGS) -I$(srcdir) \
114116
$(srcdir)/../misc/create_inode.c -o $@
115117

118+
create_inode_libarchive.o: $(srcdir)/../misc/create_inode_libarchive.c
119+
$(E) " CC $@"
120+
$(Q) $(CC) -c $(ALL_CFLAGS) -I$(srcdir) \
121+
$(srcdir)/../misc/create_inode_libarchive.c -o $@
122+
116123
debugfs.8: $(DEP_SUBSTITUTE) $(srcdir)/debugfs.8.in
117124
$(E) " SUBST $@"
118125
$(Q) $(SUBSTITUTE_UPTIME) $(srcdir)/debugfs.8.in debugfs.8
@@ -357,6 +364,16 @@ create_inode.o: $(srcdir)/../misc/create_inode.c $(top_builddir)/lib/config.h \
357364
$(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/fiemap.h \
358365
$(srcdir)/../misc/create_inode.h $(top_srcdir)/lib/e2p/e2p.h \
359366
$(top_srcdir)/lib/support/nls-enable.h
367+
create_inode_libarchive.o: $(srcdir)/../misc/create_inode_libarchive.c \
368+
$(top_builddir)/lib/config.h $(srcdir)/../misc/create_inode_libarchive.h \
369+
$(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
370+
$(top_builddir)/lib/ext2fs/ext2_types.h $(top_srcdir)/lib/ext2fs/ext2_fs.h \
371+
$(top_srcdir)/lib/ext2fs/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
372+
$(top_srcdir)/lib/ext2fs/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
373+
$(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
374+
$(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/fiemap.h \
375+
$(srcdir)/../misc/create_inode.h $(top_srcdir)/lib/e2p/e2p.h \
376+
$(top_srcdir)/lib/support/nls-enable.h
360377
xattrs.o: $(srcdir)/xattrs.c $(top_builddir)/lib/config.h \
361378
$(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/support/cstring.h \
362379
$(srcdir)/debugfs.h $(top_srcdir)/lib/ss/ss.h \

lib/config.h.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
/* Define to 1 if you have the `add_key' function. */
4141
#undef HAVE_ADD_KEY
4242

43+
/* Define to 1 if you have the <archive.h> header file. */
44+
#undef HAVE_ARCHIVE_H
45+
4346
/* Define to 1 if you have the <attr/xattr.h> header file. */
4447
#undef HAVE_ATTR_XATTR_H
4548

lib/ext2fs/Makefile.in

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ COMPILE_ET= _ET_DIR_OVERRIDE=$(srcdir)/../et ../et/compile_et
2424
DEBUG_OBJS= debug_cmds.o extent_cmds.o tst_cmds.o debugfs.o util.o \
2525
ncheck.o icheck.o ls.o lsdel.o dump.o set_fields.o logdump.o \
2626
htree.o unused.o e2freefrag.o filefrag.o extent_inode.o zap.o \
27-
xattrs.o quota.o tst_libext2fs.o create_inode.o journal.o \
28-
revoke.o recovery.o do_journal.o
27+
xattrs.o quota.o tst_libext2fs.o create_inode.o \
28+
create_inode_libarchive.o journal.o revoke.o recovery.o do_journal.o
2929

3030
DEBUG_SRCS= debug_cmds.c extent_cmds.c tst_cmds.c \
3131
$(top_srcdir)/debugfs/debugfs.c \
@@ -46,6 +46,7 @@ DEBUG_SRCS= debug_cmds.c extent_cmds.c tst_cmds.c \
4646
$(top_srcdir)/debugfs/xattrs.c \
4747
$(top_srcdir)/misc/e2freefrag.c \
4848
$(top_srcdir)/misc/create_inode.c \
49+
$(top_srcdir)/misc/create_inode_libarchive.c \
4950
$(top_srcdir)/debugfs/journal.c \
5051
$(top_srcdir)/e2fsck/revoke.c \
5152
$(top_srcdir)/e2fsck/recovery.c \
@@ -458,7 +459,13 @@ e2freefrag.o: $(top_srcdir)/misc/e2freefrag.c
458459
$(E) " CC $<"
459460
$(Q) $(CC) $(ALL_CFLAGS) -DDEBUGFS -I$(top_srcdir)/debugfs -c $< -o $@
460461

461-
create_inode.o: $(top_srcdir)/misc/create_inode.c
462+
create_inode.o: $(top_srcdir)/misc/create_inode.c \
463+
$(top_srcdir)/misc/create_inode_libarchive.c
464+
$(E) " CC $<"
465+
$(Q) $(CC) $(ALL_CFLAGS) -DDEBUGFS -c $< -o $@
466+
467+
create_inode_libarchive.o: $(top_srcdir)/misc/create_inode_libarchive.c \
468+
$(top_srcdir)/misc/create_inode_libarchive.c
462469
$(E) " CC $<"
463470
$(Q) $(CC) $(ALL_CFLAGS) -DDEBUGFS -c $< -o $@
464471

@@ -499,7 +506,7 @@ tst_libext2fs: $(DEBUG_OBJS) \
499506
$(Q) $(CC) -o tst_libext2fs $(ALL_LDFLAGS) -DDEBUG $(DEBUG_OBJS) \
500507
$(STATIC_LIBSS) $(STATIC_LIBE2P) $(LIBSUPPORT) \
501508
$(STATIC_LIBEXT2FS) $(LIBBLKID) $(LIBUUID) $(LIBMAGIC) \
502-
$(STATIC_LIBCOM_ERR) $(SYSLIBS) -I $(top_srcdir)/debugfs
509+
$(STATIC_LIBCOM_ERR) $(SYSLIBS) $(LIBARCHIVE) -I $(top_srcdir)/debugfs
503510

504511
tst_inline: $(srcdir)/inline.c $(STATIC_LIBEXT2FS) $(DEPSTATIC_LIBCOM_ERR)
505512
$(E) " LD $@"
@@ -1413,6 +1420,16 @@ e2freefrag.o: $(top_srcdir)/misc/e2freefrag.c $(top_builddir)/lib/config.h \
14131420
$(top_srcdir)/lib/support/dqblk_v2.h \
14141421
$(top_srcdir)/lib/support/quotaio_tree.h
14151422
create_inode.o: $(top_srcdir)/misc/create_inode.c \
1423+
$(top_srcdir)/misc/create_inode_libarchive.c \
1424+
$(top_builddir)/lib/config.h $(top_builddir)/lib/dirpaths.h \
1425+
$(srcdir)/ext2fs.h $(top_builddir)/lib/ext2fs/ext2_types.h \
1426+
$(srcdir)/ext2_fs.h $(srcdir)/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
1427+
$(srcdir)/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
1428+
$(srcdir)/ext2_ext_attr.h $(srcdir)/hashmap.h $(srcdir)/bitops.h \
1429+
$(srcdir)/fiemap.h $(top_srcdir)/misc/create_inode.h \
1430+
$(top_srcdir)/lib/e2p/e2p.h $(top_srcdir)/lib/support/nls-enable.h
1431+
create_inode_libarchive.o: $(top_srcdir)/misc/create_inode_libarchive.c \
1432+
$(top_srcdir)/misc/create_inode_libarchive.c \
14161433
$(top_builddir)/lib/config.h $(top_builddir)/lib/dirpaths.h \
14171434
$(srcdir)/ext2fs.h $(top_builddir)/lib/ext2fs/ext2_types.h \
14181435
$(srcdir)/ext2_fs.h $(srcdir)/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \

misc/Makefile.in

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ LPROGS= @E2INITRD_PROG@
5656
TUNE2FS_OBJS= tune2fs.o util.o journal.o recovery.o revoke.o
5757
MKLPF_OBJS= mklost+found.o
5858
MKE2FS_OBJS= mke2fs.o util.o default_profile.o mk_hugefiles.o \
59-
create_inode.o
59+
create_inode.o create_inode_libarchive.o
6060
CHATTR_OBJS= chattr.o
6161
LSATTR_OBJS= lsattr.o
6262
UUIDGEN_OBJS= uuidgen.o
@@ -80,7 +80,8 @@ PROFILED_MKLPF_OBJS= profiled/mklost+found.o
8080
PROFILED_MKE2FS_OBJS= profiled/mke2fs.o profiled/util.o \
8181
profiled/default_profile.o \
8282
profiled/mk_hugefiles.o \
83-
profiled/create_inode.o
83+
profiled/create_inode.o \
84+
profiled/create_inode_libarchive.o
8485
PROFILED_CHATTR_OBJS= profiled/chattr.o
8586
PROFILED_LSATTR_OBJS= profiled/lsattr.o
8687
PROFILED_UUIDGEN_OBJS= profiled/uuidgen.o
@@ -281,7 +282,7 @@ mke2fs: $(MKE2FS_OBJS) $(DEPLIBS) $(LIBE2P) $(DEPLIBBLKID) $(DEPLIBUUID) \
281282
$(E) " LD $@"
282283
$(Q) $(CC) $(ALL_LDFLAGS) -o mke2fs $(MKE2FS_OBJS) $(LIBS) $(LIBBLKID) \
283284
$(LIBUUID) $(LIBEXT2FS) $(LIBE2P) $(LIBINTL) \
284-
$(SYSLIBS) $(LIBMAGIC)
285+
$(SYSLIBS) $(LIBMAGIC) $(LIBARCHIVE)
285286

286287
mke2fs.static: $(MKE2FS_OBJS) $(STATIC_DEPLIBS) $(STATIC_LIBE2P) $(DEPSTATIC_LIBUUID) \
287288
$(DEPSTATIC_LIBBLKID)
@@ -857,6 +858,16 @@ create_inode.o: $(srcdir)/create_inode.c $(top_builddir)/lib/config.h \
857858
$(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/fiemap.h \
858859
$(srcdir)/create_inode.h $(top_srcdir)/lib/e2p/e2p.h \
859860
$(top_srcdir)/lib/support/nls-enable.h
861+
create_inode_libarchive.o: $(srcdir)/create_inode_libarchive.c \
862+
$(top_builddir)/lib/config.h \
863+
$(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
864+
$(top_builddir)/lib/ext2fs/ext2_types.h $(top_srcdir)/lib/ext2fs/ext2_fs.h \
865+
$(top_srcdir)/lib/ext2fs/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
866+
$(top_srcdir)/lib/ext2fs/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
867+
$(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
868+
$(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/fiemap.h \
869+
$(srcdir)/create_inode.h $(top_srcdir)/lib/e2p/e2p.h \
870+
$(top_srcdir)/lib/support/nls-enable.h
860871
fuse2fs.o: $(srcdir)/fuse2fs.c $(top_builddir)/lib/config.h \
861872
$(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
862873
$(top_builddir)/lib/ext2fs/ext2_types.h $(top_srcdir)/lib/ext2fs/ext2_fs.h \

misc/create_inode.c

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
#include "create_inode.h"
4040
#include "support/nls-enable.h"
4141

42+
#include "create_inode_libarchive.h"
43+
4244
/* 64KiB is the minimum blksize to best minimize system call overhead. */
4345
#define COPY_FILE_BUFLEN 65536
4446

@@ -69,7 +71,7 @@ static int ext2_file_type(unsigned int mode)
6971
}
7072

7173
/* Link an inode number to a directory */
72-
static errcode_t add_link(ext2_filsys fs, ext2_ino_t parent_ino,
74+
errcode_t add_link(ext2_filsys fs, ext2_ino_t parent_ino,
7375
ext2_ino_t ino, const char *name)
7476
{
7577
struct ext2_inode inode;
@@ -108,8 +110,8 @@ static errcode_t add_link(ext2_filsys fs, ext2_ino_t parent_ino,
108110
}
109111

110112
/* Set the uid, gid, mode and time for the inode */
111-
static errcode_t set_inode_extra(ext2_filsys fs, ext2_ino_t ino,
112-
struct stat *st)
113+
errcode_t set_inode_extra(ext2_filsys fs, ext2_ino_t ino,
114+
const struct stat *st)
113115
{
114116
errcode_t retval;
115117
struct ext2_inode inode;
@@ -720,12 +722,6 @@ errcode_t do_write_internal(ext2_filsys fs, ext2_ino_t cwd, const char *src,
720722
return retval;
721723
}
722724

723-
struct file_info {
724-
char *path;
725-
size_t path_len;
726-
size_t path_max_len;
727-
};
728-
729725
static errcode_t path_append(struct file_info *target, const char *file)
730726
{
731727
if (strlen(file) + target->path_len + 1 > target->path_max_len) {
@@ -1044,7 +1040,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
10441040
}
10451041

10461042
errcode_t populate_fs2(ext2_filsys fs, ext2_ino_t parent_ino,
1047-
const char *source_dir, ext2_ino_t root,
1043+
const char *source, ext2_ino_t root,
10481044
struct fs_ops_callbacks *fs_callbacks)
10491045
{
10501046
struct file_info file_info;
@@ -1069,14 +1065,35 @@ errcode_t populate_fs2(ext2_filsys fs, ext2_ino_t parent_ino,
10691065
file_info.path_max_len = 255;
10701066
file_info.path = calloc(file_info.path_max_len, 1);
10711067

1072-
retval = set_inode_xattr(fs, root, source_dir);
1068+
/* interpret input as tarball either if it's "-" (stdin) or if it's
1069+
* a regular file (or a symlink pointing to a regular file)
1070+
*/
1071+
if (strcmp(source, "-") == 0) {
1072+
retval = __populate_fs_from_tar(fs, parent_ino, NULL, root, &hdlinks,
1073+
&file_info, fs_callbacks);
1074+
goto out;
1075+
}
1076+
1077+
struct stat st;
1078+
if (stat(source, &st)) {
1079+
retval = errno;
1080+
com_err(__func__, retval, _("while calling stat"));
1081+
return retval;
1082+
}
1083+
if (S_ISREG(st.st_mode)) {
1084+
retval = __populate_fs_from_tar(fs, parent_ino, source, root, &hdlinks,
1085+
&file_info, fs_callbacks);
1086+
goto out;
1087+
}
1088+
1089+
retval = set_inode_xattr(fs, root, source);
10731090
if (retval) {
10741091
com_err(__func__, retval,
10751092
_("while copying xattrs on root directory"));
10761093
goto out;
10771094
}
10781095

1079-
retval = __populate_fs(fs, parent_ino, source_dir, root, &hdlinks,
1096+
retval = __populate_fs(fs, parent_ino, source, root, &hdlinks,
10801097
&file_info, fs_callbacks);
10811098

10821099
out:
@@ -1086,7 +1103,7 @@ errcode_t populate_fs2(ext2_filsys fs, ext2_ino_t parent_ino,
10861103
}
10871104

10881105
errcode_t populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
1089-
const char *source_dir, ext2_ino_t root)
1106+
const char *source, ext2_ino_t root)
10901107
{
1091-
return populate_fs2(fs, parent_ino, source_dir, root, NULL);
1108+
return populate_fs2(fs, parent_ino, source, root, NULL);
10921109
}

misc/create_inode.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ struct hdlinks_s
2222
struct hdlink_s *hdl;
2323
};
2424

25+
struct file_info {
26+
char *path;
27+
size_t path_len;
28+
size_t path_max_len;
29+
};
30+
2531
#define HDLINK_CNT (4)
2632

2733
struct fs_ops_callbacks {
@@ -53,5 +59,9 @@ extern errcode_t do_mkdir_internal(ext2_filsys fs, ext2_ino_t cwd,
5359
extern errcode_t do_write_internal(ext2_filsys fs, ext2_ino_t cwd,
5460
const char *src, const char *dest,
5561
ext2_ino_t root);
62+
extern errcode_t add_link(ext2_filsys fs, ext2_ino_t parent_ino,
63+
ext2_ino_t ino, const char *name);
64+
extern errcode_t set_inode_extra(ext2_filsys fs, ext2_ino_t ino,
65+
const struct stat *st);
5666

5767
#endif /* _CREATE_INODE_H */

0 commit comments

Comments
 (0)