From 093b20ba2183f38fea1cfd1e5a94ce45c09e6409 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 29 Mar 2012 12:42:24 +0200 Subject: [PATCH] lib/sysfs: improve sysfs_is_partition_dirent() ... to work with absolute disk device path too. Signed-off-by: Karel Zak --- lib/sysfs.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/sysfs.c b/lib/sysfs.c index fb03dd999a..3b5d045c4f 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -2,6 +2,8 @@ * Copyright (C) 2011 Karel Zak */ +#include + #include "c.h" #include "at.h" #include "pathnames.h" @@ -285,8 +287,26 @@ int sysfs_is_partition_dirent(DIR *dir, struct dirent *d, const char *parent_nam d->d_type != DT_LNK) return 0; #endif - if (parent_name && strncmp(parent_name, d->d_name, strlen(parent_name))) - return 0; + if (parent_name) { + const char *p = parent_name; + size_t len; + + /* /dev/sda --> "sda" */ + if (*parent_name == '/') { + p = strrchr(parent_name, '/'); + if (!p) + return 0; + p++; + } + + len = strlen(p); + if (strlen(d->d_name) <= len) + return 0; + + /* partitions subdir name is "[:digit:]" */ + return strncmp(p, d->d_name, len) == 0 + && isdigit(*(d->d_name + len)); + } /* Cannot use /partition file, not supported on old sysfs */ snprintf(path, sizeof(path), "%s/start", d->d_name); -- 2.47.3