From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Wed, 31 May 2023 17:23:00 +0200 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1q4NfB-004QPP-FG for lore@lore.pengutronix.de; Wed, 31 May 2023 17:23:00 +0200 Received: from localhost ([127.0.0.1] helo=metis.ext.pengutronix.de) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1q4Nf7-0005gh-LB; Wed, 31 May 2023 17:22:57 +0200 Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q4Nf5-0005eV-Tc; Wed, 31 May 2023 17:22:55 +0200 Received: from [2a0a:edc0:0:1101:1d::54] (helo=dude05.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1q4Nf5-0049Ae-6r; Wed, 31 May 2023 17:22:55 +0200 Received: from afa by dude05.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1q4Nf4-005uDq-AS; Wed, 31 May 2023 17:22:54 +0200 From: Ahmad Fatoum To: oss-tools@pengutronix.de Date: Wed, 31 May 2023 17:22:47 +0200 Message-Id: <20230531152253.1407395-3-a.fatoum@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230531152253.1407395-1-a.fatoum@pengutronix.de> References: <20230531152253.1407395-1-a.fatoum@pengutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [OSS-Tools] [PATCH 2/8] libdt: factor out u64 sysattr parsing into helper X-BeenThere: oss-tools@pengutronix.de X-Mailman-Version: 2.1.29 Precedence: list List-Id: Pengutronix Public Open-Source-Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "OSS-Tools" X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: oss-tools-bounces@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false We will need to parse two more sysattrs in a follow-up patch, so factor this out for reuse. While at it switch to 64-bit strtoull: This may be more useful for future users and unlike atol doesn't invoke undefined behavior when parsing fails. Signed-off-by: Ahmad Fatoum --- src/libdt.c | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/src/libdt.c b/src/libdt.c index 2c994c647ac9..580b0b0ba769 100644 --- a/src/libdt.c +++ b/src/libdt.c @@ -2179,6 +2179,33 @@ static struct udev_device *device_find_mtd_partition(struct udev_device *dev, return NULL; } +/* + * udev_device_parse_sysattr_u64 - parse sysattr value as unsigned 64-bit integer + * @dev: the udev_device to extract the attribute from + * @attr: name of the attribute to lookup + * @outvalue: returns the value parsed out of the attribute + * + * returns 0 for success or negative error value on failure. + */ +static int udev_device_parse_sysattr_u64(struct udev_device *dev, const char *attr, + u64 *outvalue) +{ + char *endptr; + u64 value; + const char *str; + + str = udev_device_get_sysattr_value(dev, attr); + if (!str) + return -EINVAL; + + value = strtoull(str, &endptr, 0); + if (!*str || *endptr) + return -EINVAL; + + *outvalue = value; + return 0; +} + /* * device_find_block_device - extract device path from udev block device * @@ -2305,24 +2332,25 @@ static int udev_device_is_eeprom(struct udev_device *dev) * udev_parse_mtd - get information from a mtd udev_device * @dev: the udev_device to extract information from * @devpath: returns the devicepath under which the mtd device is accessible - * @size: returns the size of the mtd device + * @outsize: returns the size of the mtd device * * returns 0 for success or negative error value on failure. *devpath * will be valid on success and must be freed after usage. */ -static int udev_parse_mtd(struct udev_device *dev, char **devpath, size_t *size) +static int udev_parse_mtd(struct udev_device *dev, char **devpath, size_t *outsize) { - const char *sizestr; const char *outpath; + u64 size; + int ret; if (!udev_device_is_mtd(dev)) return -EINVAL; - sizestr = udev_device_get_sysattr_value(dev, "size"); - if (!sizestr) - return -EINVAL; + ret = udev_device_parse_sysattr_u64(dev, "size", &size); + if (ret) + return ret; - *size = atol(sizestr); + *outsize = size; outpath = udev_device_get_devnode(dev); if (!outpath) -- 2.39.2