From: Karel Zak Date: Thu, 29 Mar 2012 10:42:24 +0000 (+0200) Subject: lib/sysfs: improve sysfs_is_partition_dirent() X-Git-Tag: v2.22-rc1~555^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=093b20ba2183f38fea1cfd1e5a94ce45c09e6409;p=thirdparty%2Futil-linux.git lib/sysfs: improve sysfs_is_partition_dirent() ... to work with absolute disk device path too. Signed-off-by: Karel Zak --- 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);