diff options
Diffstat (limited to 'meta/recipes-devtools/syslinux/syslinux/0002-linux-syslinux-implement-open_ext2_fs.patch')
-rw-r--r-- | meta/recipes-devtools/syslinux/syslinux/0002-linux-syslinux-implement-open_ext2_fs.patch | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/meta/recipes-devtools/syslinux/syslinux/0002-linux-syslinux-implement-open_ext2_fs.patch b/meta/recipes-devtools/syslinux/syslinux/0002-linux-syslinux-implement-open_ext2_fs.patch new file mode 100644 index 0000000000..77cf060451 --- /dev/null +++ b/meta/recipes-devtools/syslinux/syslinux/0002-linux-syslinux-implement-open_ext2_fs.patch | |||
@@ -0,0 +1,141 @@ | |||
1 | From 07fb737fb60c08eaaa41989d531fc23009523546 Mon Sep 17 00:00:00 2001 | ||
2 | From: Robert Yang <liezhi.yang@windriver.com> | ||
3 | Date: Wed, 31 Dec 2014 16:09:18 +0800 | ||
4 | Subject: [PATCH 2/9] linux/syslinux: implement open_ext2_fs() | ||
5 | |||
6 | The open_ext2_fs() checks whether it is an ext2/ext3/ext4 device, and | ||
7 | return: | ||
8 | 0: It is an ext2, ext3 or ext4. | ||
9 | 1: Not an ext2, ext3 or ext4. | ||
10 | -1: unexpected error. | ||
11 | |||
12 | Upstream-Status: Submitted | ||
13 | |||
14 | Signed-off-by: Robert Yang <liezhi.yang@windriver.com> | ||
15 | Tested-by: Du Dolpher <dolpher.du@intel.com> | ||
16 | --- | ||
17 | linux/Makefile | 2 +- | ||
18 | linux/syslinux.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
19 | 2 files changed, 81 insertions(+), 1 deletion(-) | ||
20 | |||
21 | diff --git a/linux/Makefile b/linux/Makefile | ||
22 | index 11667e1..ac1ac58 100644 | ||
23 | --- a/linux/Makefile | ||
24 | +++ b/linux/Makefile | ||
25 | @@ -51,7 +51,7 @@ spotless: clean | ||
26 | installer: syslinux syslinux-nomtools | ||
27 | |||
28 | syslinux: $(OBJS) | ||
29 | - $(CC) $(LDFLAGS) -o $@ $^ | ||
30 | + $(CC) $(LDFLAGS) -o $@ $^ -lext2fs | ||
31 | |||
32 | syslinux-nomtools: syslinux | ||
33 | ln -f $< $@ | ||
34 | diff --git a/linux/syslinux.c b/linux/syslinux.c | ||
35 | index 36fc202..cc4e7da 100755 | ||
36 | --- a/linux/syslinux.c | ||
37 | +++ b/linux/syslinux.c | ||
38 | @@ -72,6 +72,7 @@ | ||
39 | #include "syslxfs.h" | ||
40 | #include "setadv.h" | ||
41 | #include "syslxopt.h" /* unified options */ | ||
42 | +#include <ext2fs/ext2fs.h> | ||
43 | |||
44 | extern const char *program; /* Name of program */ | ||
45 | |||
46 | @@ -82,6 +83,9 @@ char *mntpath = NULL; /* Path on which to mount */ | ||
47 | int loop_fd = -1; /* Loop device */ | ||
48 | #endif | ||
49 | |||
50 | +ext2_filsys e2fs = NULL; /* Ext2/3/4 filesystem */ | ||
51 | +ext2_ino_t root, cwd; /* The root and cwd of e2fs */ | ||
52 | + | ||
53 | void __attribute__ ((noreturn)) die(const char *msg) | ||
54 | { | ||
55 | fprintf(stderr, "%s: %s\n", program, msg); | ||
56 | @@ -266,6 +270,82 @@ int do_open_file(char *name) | ||
57 | */ | ||
58 | static int open_ext2_fs(const char *device, const char *subdir) | ||
59 | { | ||
60 | + int retval; | ||
61 | + int open_flag = EXT2_FLAG_RW, mount_flags; | ||
62 | + ext2_ino_t dirino; | ||
63 | + char opt_string[40]; | ||
64 | + | ||
65 | + if (opt.offset) { | ||
66 | + sprintf(opt_string, "offset=%llu", (unsigned long long)opt.offset); | ||
67 | + retval = ext2fs_open2(device, opt_string, open_flag, 0, 0, unix_io_manager, &e2fs); | ||
68 | + } else | ||
69 | + retval = ext2fs_open(device, open_flag, 0, 0, unix_io_manager, &e2fs); | ||
70 | + if (retval) { | ||
71 | + /* It might not be an extN fs, so we need check magic firstly */ | ||
72 | + if (retval == EXT2_ET_BAD_MAGIC) { | ||
73 | + /* Do nothing, return silently */ | ||
74 | + return 1; | ||
75 | + } else { | ||
76 | + fprintf(stderr, "%s: error while trying to open: %s\n", | ||
77 | + program, device); | ||
78 | + return -1; | ||
79 | + } | ||
80 | + } | ||
81 | + | ||
82 | + /* Stop if it is mounted */ | ||
83 | + retval = ext2fs_check_if_mounted(device, &mount_flags); | ||
84 | + if (retval) { | ||
85 | + fprintf(stderr, "%s: ext2fs_check_if_mount() error on %s\n", | ||
86 | + program, device); | ||
87 | + goto fail; | ||
88 | + } | ||
89 | + | ||
90 | + if (mount_flags & EXT2_MF_MOUNTED) { | ||
91 | + fprintf(stderr, "%s: %s is mounted\n", program, device); | ||
92 | + goto fail; | ||
93 | + } | ||
94 | + | ||
95 | + e2fs->default_bitmap_type = EXT2FS_BMAP64_RBTREE; | ||
96 | + | ||
97 | + /* Read the inode map */ | ||
98 | + retval = ext2fs_read_inode_bitmap(e2fs); | ||
99 | + if (retval) { | ||
100 | + fprintf(stderr, "%s: while reading inode bitmap: %s\n", | ||
101 | + program, device); | ||
102 | + goto fail; | ||
103 | + } | ||
104 | + | ||
105 | + /* Read the block map */ | ||
106 | + retval = ext2fs_read_block_bitmap(e2fs); | ||
107 | + if (retval) { | ||
108 | + fprintf(stderr, "%s: while reading block bitmap: %s\n", | ||
109 | + program, device); | ||
110 | + goto fail; | ||
111 | + } | ||
112 | + | ||
113 | + root = cwd = EXT2_ROOT_INO; | ||
114 | + /* Check the subdir */ | ||
115 | + if (strcmp(subdir, "/")) { | ||
116 | + retval = ext2fs_namei(e2fs, root, cwd, subdir, &dirino); | ||
117 | + if (retval) { | ||
118 | + fprintf(stderr, "%s: failed to find dir %s on %s\n", | ||
119 | + program, subdir, device); | ||
120 | + goto fail; | ||
121 | + } | ||
122 | + | ||
123 | + retval = ext2fs_check_directory(e2fs, dirino); | ||
124 | + if (retval) { | ||
125 | + fprintf(stderr, "%s: failed to cd to: %s\n", program, subdir); | ||
126 | + goto fail; | ||
127 | + } | ||
128 | + cwd = dirino; | ||
129 | + } | ||
130 | + | ||
131 | + return 0; | ||
132 | + | ||
133 | +fail: | ||
134 | + (void) ext2fs_close(e2fs); | ||
135 | + return -1; | ||
136 | } | ||
137 | |||
138 | /* The install func for ext2, ext3 and ext4 */ | ||
139 | -- | ||
140 | 1.9.1 | ||
141 | |||