summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Golle <daniel@makrotopia.org>2021-11-01 12:39:11 +0000
committerDaniel Golle <daniel@makrotopia.org>2021-11-01 16:13:36 +0000
commitd3907445b7aa9cbde70d501bd68a5e38db90c6b2 (patch)
treef3380c4bc77e4d87553f01da51abecb4b34d2140
parent19fd7fc24129d931c755a815313d81bcfa66859a (diff)
downloadfstools-d3907445b7aa9cbde70d501bd68a5e38db90c6b2.tar.gz
libfstools: use uevent instead of relying on custom kernel patch
Detect partition name based on 'uevent' instead of relying in custom kernel patch exposing 'name' in sysfs directly. This will allow to drop the custom patch again. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
-rw-r--r--libfstools/partname.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/libfstools/partname.c b/libfstools/partname.c
index 5d4fde5..773df8c 100644
--- a/libfstools/partname.c
+++ b/libfstools/partname.c
@@ -61,11 +61,14 @@ static int partname_volume_init(struct volume *v)
return block_volume_format(v, 0, p->parent_dev.devpathstr);
}
-/* from procd/utils.c -> should go to libubox */
-static char* get_cmdline_val(const char* name, char* out, int len)
+/* 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)
{
char line[1024], *c, *sptr;
- int fd = open("/proc/cmdline", O_RDONLY);
+ int fd = open(filename, O_RDONLY);
+ if (fd == -1)
+ return NULL;
+
ssize_t r = read(fd, line, sizeof(line) - 1);
close(fd);
@@ -112,7 +115,7 @@ static char *rootdevname(char *devpath) {
static struct volume *partname_volume_find(char *name)
{
struct partname_volume *p;
- char volnamegstr[BUFLEN];
+ char ueventgstr[BUFLEN];
char namebuf[BUFLEN];
char rootparam[BUFLEN];
char *rootdev = NULL, *devname, *tmp;
@@ -120,23 +123,23 @@ static struct volume *partname_volume_find(char *name)
bool found = false;
glob_t gl;
- if (get_cmdline_val("fstools_ignore_partname", rootparam, sizeof(rootparam))) {
+ if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", rootparam, sizeof(rootparam))) {
if (!strcmp("1", rootparam))
return NULL;
}
- if (get_cmdline_val("root", rootparam, sizeof(rootparam))) {
+ if (get_var_from_file("/proc/cmdline", "root", rootparam, sizeof(rootparam))) {
rootdev = rootdevname(rootparam);
/* find partition on same device as rootfs */
- snprintf(volnamegstr, sizeof(volnamegstr), "%s/%s/*/name", block_dir_name, rootdev);
+ snprintf(ueventgstr, sizeof(ueventgstr), "%s/%s/*/uevent", block_dir_name, rootdev);
} else {
/* no 'root=' kernel cmdline parameter, find on any block device */
- snprintf(volnamegstr, sizeof(volnamegstr), "%s/*/name", block_dir_name);
+ snprintf(ueventgstr, sizeof(ueventgstr), "%s/*/uevent", block_dir_name);
}
- if (!glob(volnamegstr, GLOB_NOESCAPE, NULL, &gl))
+ if (!glob(ueventgstr, GLOB_NOESCAPE, NULL, &gl))
for (j = 0; j < gl.gl_pathc; j++) {
- if (!read_string_from_file("", gl.gl_pathv[j], namebuf, sizeof(namebuf)))
+ if (!get_var_from_file(gl.gl_pathv[j], "PARTNAME", namebuf, sizeof(namebuf)))
continue;
if (!strncmp(namebuf, name, sizeof(namebuf))) {
found = 1;