summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/recipes-devtools/e2fsprogs/e2fsprogs/0002-misc-create_inode.c-copy-files-recursively.patch135
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
+
OpenPOWER on IntegriCloud