In bootargs, the specific parameter is overridden if needed for booting
OpenWrt, such as "root=".
In this case, the last specific parameter in bootargs should be read
instead of the one passed by bootloader.

example (I-O DATA HDL2-AAX):

console=ttyS0,115200 mtdparts=spi0.0:960k(boot),64k(env),-(system) \
  initrd=0x3000040 rw root=/dev/md2 rootfstype=ext4 rw rootdelay=2 \
  init=/lib/sysvinit/init init=/sbin/init root=PARTLABEL=rootfs \
  rootfstype=squashfs,ext4

- "root=/dev/md2"        : passed by bootloader, for stock firmware
- "root=PARTLABEL=rootfs": passed by dtb, for OpenWrt

So, this patch adds checking support for all parameters in the specified
file and check all for root device ("root=" parameter).

Signed-off-by: INAGAKI Hiroshi <musashino.o...@gmail.com>
---
v1 -> v2:

  (no patch)

v2 -> v3:

  - added patch to fix wrong detection of overridden root= parameter

 libfstools/partname.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/libfstools/partname.c b/libfstools/partname.c
index f59c52e..e282402 100644
--- a/libfstools/partname.c
+++ b/libfstools/partname.c
@@ -62,9 +62,9 @@ static int partname_volume_init(struct volume *v)
 }
 
 /* adapted from procd/utils.c -> should go to libubox */
-static char* get_var_from_file(const char* filename, const char* name, char* 
out, int len)
+static char* get_var_from_file(const char* filename, const char* name, char* 
out, int len, bool chk_all)
 {
-       char line[1024], *c, *sptr;
+       char line[1024], *c, *sptr, *_out = NULL;
        int fd = open(filename, O_RDONLY);
        if (fd == -1)
                return NULL;
@@ -89,10 +89,13 @@ static char* get_var_from_file(const char* filename, const 
char* name, char* out
 
                strncpy(out, &sep[1], len);
                out[len-1] = '\0';
-               return out;
+               if (!chk_all)
+                       return out;
+
+               _out = out;
        }
 
-       return NULL;
+       return _out;
 }
 
 static char *rootdevname(char *devpath) {
@@ -123,12 +126,12 @@ static struct volume *partname_volume_find(char *name)
        bool found = false;
        glob_t gl;
 
-       if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", 
rootparam, sizeof(rootparam))) {
+       if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", 
rootparam, sizeof(rootparam), false)) {
                if (!strcmp("1", rootparam))
                        return NULL;
        }
 
-       if (get_var_from_file("/proc/cmdline", "root", rootparam, 
sizeof(rootparam))) {
+       if (get_var_from_file("/proc/cmdline", "root", rootparam, 
sizeof(rootparam), true)) {
                rootdev = rootdevname(rootparam);
                /* find partition on same device as rootfs */
                snprintf(ueventgstr, sizeof(ueventgstr), "%s/%s/*/uevent", 
block_dir_name, rootdev);
@@ -139,7 +142,7 @@ static struct volume *partname_volume_find(char *name)
 
        if (!glob(ueventgstr, GLOB_NOESCAPE, NULL, &gl))
                for (j = 0; j < gl.gl_pathc; j++) {
-                       if (!get_var_from_file(gl.gl_pathv[j], "PARTNAME", 
namebuf, sizeof(namebuf)))
+                       if (!get_var_from_file(gl.gl_pathv[j], "PARTNAME", 
namebuf, sizeof(namebuf), false))
                                continue;
                        if (!strncmp(namebuf, name, sizeof(namebuf))) {
                                found = 1;
-- 
2.36.1.windows.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to