diff options
-rw-r--r-- | meta/recipes-devtools/e2fsprogs/e2fsprogs/0002-misc-create_inode.c-copy-files-recursively.patch | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/meta/recipes-devtools/e2fsprogs/e2fsprogs/0002-misc-create_inode.c-copy-files-recursively.patch b/meta/recipes-devtools/e2fsprogs/e2fsprogs/0002-misc-create_inode.c-copy-files-recursively.patch new file mode 100644 index 0000000..9bff644 --- /dev/null +++ b/meta/recipes-devtools/e2fsprogs/e2fsprogs/0002-misc-create_inode.c-copy-files-recursively.patch @@ -0,0 +1,135 @@ +From 08dfbaf4e3f704232ff46d78c0758a6cfe3961c8 Mon Sep 17 00:00:00 2001 +From: Robert Yang <liezhi.yang@windriver.com> +Date: Mon, 23 Dec 2013 02:59:10 -0500 +Subject: [PATCH 02/11] misc/create_inode.c: copy files recursively + +Use opendir() and readdir() to read the native directory, then use +lstat() to identify the file type and call the corresponding function to +add the file to the filesystem, call the populate_fs() recursively if it +is a directory. + +NOTE: the libext2fs can't create the socket file. + +Upstream-Status: Backport + +Signed-off-by: Robert Yang <liezhi.yang@windriver.com> +Reviewed-by: Darren Hart <dvhart@linux.intel.com> +--- + misc/create_inode.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 97 insertions(+) + +diff --git a/misc/create_inode.c b/misc/create_inode.c +index 46aaa60..b68b910 100644 +--- a/misc/create_inode.c ++++ b/misc/create_inode.c +@@ -1,5 +1,13 @@ + #include "create_inode.h" + ++#if __STDC_VERSION__ < 199901L ++# if __GNUC__ >= 2 ++# define __func__ __FUNCTION__ ++# else ++# define __func__ "<unknown>" ++# endif ++#endif ++ + /* Make a special file which is block, character and fifo */ + errcode_t do_mknod_internal(ext2_ino_t cwd, const char *name, struct stat *st) + { +@@ -23,4 +31,93 @@ errcode_t do_write_internal(ext2_ino_t cwd, const char *src, const char *dest) + /* Copy files from source_dir to fs */ + errcode_t populate_fs(ext2_ino_t parent_ino, const char *source_dir) + { ++ const char *name; ++ DIR *dh; ++ struct dirent *dent; ++ struct stat st; ++ char ln_target[PATH_MAX]; ++ ext2_ino_t ino; ++ errcode_t retval; ++ int read_cnt; ++ ++ root = EXT2_ROOT_INO; ++ ++ if (chdir(source_dir) < 0) { ++ com_err(__func__, errno, ++ _("while changing working directory to \"%s\""), source_dir); ++ return errno; ++ } ++ ++ if (!(dh = opendir("."))) { ++ com_err(__func__, errno, ++ _("while openning directory \"%s\""), source_dir); ++ return errno; ++ } ++ ++ while((dent = readdir(dh))) { ++ if((!strcmp(dent->d_name, ".")) || (!strcmp(dent->d_name, ".."))) ++ continue; ++ lstat(dent->d_name, &st); ++ name = dent->d_name; ++ ++ switch(st.st_mode & S_IFMT) { ++ case S_IFCHR: ++ case S_IFBLK: ++ case S_IFIFO: ++ if ((retval = do_mknod_internal(parent_ino, name, &st))) { ++ com_err(__func__, retval, ++ _("while creating special file \"%s\""), name); ++ return retval; ++ } ++ break; ++ case S_IFSOCK: ++ /* FIXME: there is no make socket function atm. */ ++ com_err(__func__, 0, ++ _("ignoring socket file \"%s\""), name); ++ continue; ++ case S_IFLNK: ++ if((read_cnt = readlink(name, ln_target, sizeof(ln_target))) == -1) { ++ com_err(__func__, errno, ++ _("while trying to readlink \"%s\""), name); ++ return errno; ++ } ++ ln_target[read_cnt] = '\0'; ++ if ((retval = do_symlink_internal(parent_ino, name, ln_target))) { ++ com_err(__func__, retval, ++ _("while writing symlink\"%s\""), name); ++ return retval; ++ } ++ break; ++ case S_IFREG: ++ if ((retval = do_write_internal(parent_ino, name, name))) { ++ com_err(__func__, retval, ++ _("while writing file \"%s\""), name); ++ return retval; ++ } ++ break; ++ case S_IFDIR: ++ if ((retval = do_mkdir_internal(parent_ino, name, &st))) { ++ com_err(__func__, retval, ++ _("while making dir \"%s\""), name); ++ return retval; ++ } ++ if ((retval = ext2fs_namei(current_fs, root, parent_ino, name, &ino))) { ++ com_err(name, retval, 0); ++ return retval; ++ } ++ /* Populate the dir recursively*/ ++ retval = populate_fs(ino, name); ++ if (retval) { ++ com_err(__func__, retval, _("while adding dir \"%s\""), name); ++ return retval; ++ } ++ chdir(".."); ++ break; ++ default: ++ com_err(__func__, 0, ++ _("ignoring entry \"%s\""), name); ++ } ++ } ++ closedir(dh); ++ return retval; + } +-- +1.7.10.4 + |