diff --git a/tools/i2cbusses.c b/tools/i2cbusses.c index 434b8a3..96d22e6 100644 --- a/tools/i2cbusses.c +++ b/tools/i2cbusses.c @@ -344,6 +344,29 @@ int lookup_i2c_bus(const char *i2cbus_arg) return i2cbus; } +/* + * Parse a CHIP-ADDRESS command line argument and return the corresponding + * chip address, or a negative value if the address is invalid. + */ +int parse_i2c_address(const char *address_arg) +{ + long address; + char *end; + + address = strtol(address_arg, &end, 0); + if (*end || !*address_arg) { + fprintf(stderr, "Error: Chip address is not a number!\n"); + return -1; + } + if (address < 0x03 || address > 0x77) { + fprintf(stderr, "Error: Chip address out of range " + "(0x03-0x77)!\n"); + return -2; + } + + return address; +} + int open_i2c_dev(const int i2cbus, char *filename, const int quiet) { int file; diff --git a/tools/i2cbusses.h b/tools/i2cbusses.h index a2f3476..cbd794a 100644 --- a/tools/i2cbusses.h +++ b/tools/i2cbusses.h @@ -33,6 +33,7 @@ struct i2c_adap *gather_i2c_busses(void); void free_adapters(struct i2c_adap *adapters); int lookup_i2c_bus(const char *i2cbus_arg); +int parse_i2c_address(const char *address_arg); int open_i2c_dev(const int i2cbus, char *filename, const int quiet); int set_slave_addr(int file, int address, int force); diff --git a/tools/i2cdump.c b/tools/i2cdump.c index e618ee5..bad8ccf 100644 --- a/tools/i2cdump.c +++ b/tools/i2cdump.c @@ -97,14 +97,8 @@ int main(int argc, char *argv[]) help(); exit(1); } - address = strtol(argv[flags+2], &end, 0); - if (*end) { - fprintf(stderr, "Error: Second argument not a number!\n"); - help(); - exit(1); - } - if (address < 0x03 || address > 0x77) { - fprintf(stderr, "Error: Address out of range!\n"); + address = parse_i2c_address(argv[flags+2]); + if (address < 0) { help(); exit(1); } diff --git a/tools/i2cget.c b/tools/i2cget.c index e994f03..747a6a9 100644 --- a/tools/i2cget.c +++ b/tools/i2cget.c @@ -189,11 +189,9 @@ int main(int argc, char *argv[]) if (i2cbus < 0) help(); - address = strtol(argv[flags+2], &end, 0); - if (*end || address < 0x03 || address > 0x77) { - fprintf(stderr, "Error: Chip address invalid!\n"); + address = parse_i2c_address(argv[flags+2]); + if (address < 0) help(); - } if (!(flags+3 < argc)) { size = I2C_SMBUS_BYTE; diff --git a/tools/i2cset.c b/tools/i2cset.c index f721b87..88a62c6 100644 --- a/tools/i2cset.c +++ b/tools/i2cset.c @@ -83,11 +83,9 @@ int main(int argc, char *argv[]) if (i2cbus < 0) help(); - address = strtol(argv[flags+2], &end, 0); - if (*end || address < 0x03 || address > 0x77) { - fprintf(stderr, "Error: Chip address invalid!\n"); + address = parse_i2c_address(argv[flags+2]); + if (address < 0) help(); - } daddress = strtol(argv[flags+3], &end, 0); if (*end || daddress < 0 || daddress > 0xff) {