Re: [PATCH 14/32] tools:iio:iio_utils: implement digit calculation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 31/05/15 13:40, Hartmut Knaack wrote:
> Previously, the return value of sscanf() was treated as an indication of
> the digits it would have read. Yet, sscanf() only returns the amount of
> valid matches.
> Therefore, introduce a function to calculate the decimal digits of the
> read number and use this one to commence a colon search, as originally
> intended.
> 
> Signed-off-by: Hartmut Knaack <knaack.h@xxxxxx>
Applied.  Ouch.
> ---
>  tools/iio/iio_utils.c | 35 +++++++++++++++++++++++++++++++----
>  1 file changed, 31 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/iio/iio_utils.c b/tools/iio/iio_utils.c
> index c5b4136..60e5ec4 100644
> --- a/tools/iio/iio_utils.c
> +++ b/tools/iio/iio_utils.c
> @@ -431,6 +431,18 @@ error_ret:
>  	return ret;
>  }
>  
> +int calc_digits(int num)
> +{
> +	int count = 0;
> +
> +	while (num != 0) {
> +		num /= 10;
> +		count++;
> +	}
> +
> +	return count;
> +}
> +
>  /**
>   * find_type_by_name() - function to match top level types by name
>   * @name: top level type instance name
> @@ -441,7 +453,7 @@ error_ret:
>  int find_type_by_name(const char *name, const char *type)
>  {
>  	const struct dirent *ent;
> -	int number, numstrlen;
> +	int number, numstrlen, ret;
>  
>  	FILE *nameFile;
>  	DIR *dp;
> @@ -459,9 +471,19 @@ int find_type_by_name(const char *name, const char *type)
>  			strcmp(ent->d_name, "..") != 0 &&
>  			strlen(ent->d_name) > strlen(type) &&
>  			strncmp(ent->d_name, type, strlen(type)) == 0) {
> -			numstrlen = sscanf(ent->d_name + strlen(type),
> -					   "%d",
> -					   &number);
> +			errno = 0;
> +			ret = sscanf(ent->d_name + strlen(type), "%d", &number);
> +			if (ret < 0) {
> +				ret = -errno;
> +				printf("failed to read element number\n");
> +				goto error_close_dir;
> +			} else if (ret != 1) {
> +				ret = -EIO;
> +				printf("failed to match element number\n");
> +				goto error_close_dir;
> +			}
> +
> +			numstrlen = calc_digits(number);
>  			/* verify the next character is not a colon */
>  			if (strncmp(ent->d_name + strlen(type) + numstrlen,
>  					":",
> @@ -495,6 +517,11 @@ int find_type_by_name(const char *name, const char *type)
>  	}
>  	closedir(dp);
>  	return -ENODEV;
> +
> +error_close_dir:
> +	if (closedir(dp) == -1)
> +		perror("find_type_by_name(): Failed to close directory");
> +	return ret;
>  }
>  
>  int _write_sysfs_int(char *filename, char *basedir, int val, int verify)
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux