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