From patchwork Fri May 6 14:06:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean Delvare X-Patchwork-Id: 570603 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 53904C433F5 for ; Fri, 6 May 2022 14:06:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1390637AbiEFOKk (ORCPT ); Fri, 6 May 2022 10:10:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33666 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231739AbiEFOKj (ORCPT ); Fri, 6 May 2022 10:10:39 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BCFF95A2DF for ; Fri, 6 May 2022 07:06:55 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 790DA1F918 for ; Fri, 6 May 2022 14:06:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1651846014; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jTUyrl4kmKe3OxGNjgSqhvjWm9Sb+2ATk8cgjw4C9xY=; b=bgmbKCxf1agS6H6UhyR7yE5dOB6TlnvWEi+y2/gmGZzE1J2DtWYfs/8s1/1gQm9LP97CtI fSgqwKeKmxePAw0MqEVHQoIVGFStVDXV93fv8DB5soPpwewbKCF2DB9KYyw5mQRLeUplLw 3Z/8iwKNTJEguzz+w/f9E0qvbITyNho= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1651846014; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jTUyrl4kmKe3OxGNjgSqhvjWm9Sb+2ATk8cgjw4C9xY=; b=EscxhSYKb4nfhnc9/ypaMvDrUX9KR+FxJFYGS6M0U1Jrzy1gPvohMz5ga9+bERMeq/W9SO suybNt9lLrCN01BQ== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 5FEFF13A1B for ; Fri, 6 May 2022 14:06:54 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id hvjIFX4rdWKDZwAAMHmgww (envelope-from ) for ; Fri, 06 May 2022 14:06:54 +0000 Date: Fri, 6 May 2022 16:06:52 +0200 From: Jean Delvare To: Linux I2C Subject: [PATCH 1/2] i2c-tools: Use getopt Message-ID: <20220506160652.61d61aa6@endymion.delvare> Organization: SUSE Linux X-Mailer: Claws Mail 3.18.0 (GTK+ 2.24.32; x86_64-suse-linux-gnu) MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Use the standard C getopt() function instead of parsing the options manually. The benefit of this move is that getopt() supports merged flags (for example -fy instead of -f -y) and does not require options to come first on the command line. As this is pretty standard by now, not supporting such possibilities can confuse and disappoint the user. Based on a preliminary patch from David Kerns. Signed-off-by: Jean Delvare --- tools/i2cdetect.c | 23 ++++++++++------------- tools/i2cdump.c | 49 +++++++++++++++++++++++-------------------------- tools/i2cget.c | 31 ++++++++++++++----------------- tools/i2cset.c | 45 +++++++++++++++++++-------------------------- 4 files changed, 66 insertions(+), 82 deletions(-) --- i2c-tools.orig/tools/i2cdetect.c 2022-01-19 12:06:56.018443831 +0100 +++ i2c-tools/tools/i2cdetect.c 2022-05-06 15:22:27.631142241 +0200 @@ -205,12 +205,12 @@ int main(int argc, char *argv[]) unsigned long funcs; int mode = MODE_AUTO; int first = 0x08, last = 0x77; - int flags = 0; + int opt; int yes = 0, version = 0, list = 0; /* handle (optional) flags first */ - while (1+flags < argc && argv[1+flags][0] == '-') { - switch (argv[1+flags][1]) { + while ((opt = getopt(argc, argv, "FValqry")) != -1) { + switch (opt) { case 'V': version = 1; break; case 'y': yes = 1; break; case 'l': list = 1; break; @@ -242,13 +242,10 @@ int main(int argc, char *argv[]) first = 0x00; last = 0x7F; break; - default: - fprintf(stderr, "Error: Unsupported option " - "\"%s\"!\n", argv[1+flags]); + case '?': help(); exit(1); } - flags++; } if (version) { @@ -261,22 +258,22 @@ int main(int argc, char *argv[]) exit(0); } - if (argc < flags + 2) { + if (argc < optind + 1) { fprintf(stderr, "Error: No i2c-bus specified!\n"); help(); exit(1); } - i2cbus = lookup_i2c_bus(argv[flags+1]); + i2cbus = lookup_i2c_bus(argv[optind]); if (i2cbus < 0) { help(); exit(1); } /* read address range if present */ - if (argc == flags + 4 && mode != MODE_FUNC) { + if (argc == optind + 3 && mode != MODE_FUNC) { int tmp; - tmp = strtol(argv[flags+2], &end, 0); + tmp = strtol(argv[optind+1], &end, 0); if (*end) { fprintf(stderr, "Error: FIRST argument not a " "number!\n"); @@ -291,7 +288,7 @@ int main(int argc, char *argv[]) } first = tmp; - tmp = strtol(argv[flags+3], &end, 0); + tmp = strtol(argv[optind+2], &end, 0); if (*end) { fprintf(stderr, "Error: LAST argument not a " "number!\n"); @@ -305,7 +302,7 @@ int main(int argc, char *argv[]) exit(1); } last = tmp; - } else if (argc != flags + 2) { + } else if (argc != optind + 1) { help(); exit(1); } --- i2c-tools.orig/tools/i2cdump.c 2021-07-22 16:39:29.619547310 +0200 +++ i2c-tools/tools/i2cdump.c 2022-05-06 15:27:20.168698719 +0200 @@ -110,26 +110,23 @@ int main(int argc, char *argv[]) char filename[20]; int block[256]; int pec = 0, even = 0; - int flags = 0; + int opt; int force = 0, yes = 0, version = 0, all_addrs = 0; const char *range = NULL; int first = 0x00, last = 0xff; /* handle (optional) flags first */ - while (1+flags < argc && argv[1+flags][0] == '-') { - switch (argv[1+flags][1]) { + while ((opt = getopt(argc, argv, "Vafr:y")) != -1) { + switch (opt) { case 'V': version = 1; break; case 'f': force = 1; break; - case 'r': range = argv[1+(++flags)]; break; + case 'r': range = optarg; break; case 'y': yes = 1; break; case 'a': all_addrs = 1; break; - default: - fprintf(stderr, "Error: Unsupported option " - "\"%s\"!\n", argv[1+flags]); + case '?': help(); exit(1); } - flags++; } if (version) { @@ -137,48 +134,48 @@ int main(int argc, char *argv[]) exit(0); } - if (argc < flags + 2) { + if (argc < optind + 1) { fprintf(stderr, "Error: No i2c-bus specified!\n"); help(); exit(1); } - i2cbus = lookup_i2c_bus(argv[flags+1]); + i2cbus = lookup_i2c_bus(argv[optind]); if (i2cbus < 0) { help(); exit(1); } - if (argc < flags + 3) { + if (argc < optind + 2) { fprintf(stderr, "Error: No address specified!\n"); help(); exit(1); } - address = parse_i2c_address(argv[flags+2], all_addrs); + address = parse_i2c_address(argv[optind+1], all_addrs); if (address < 0) { help(); exit(1); } - if (argc < flags + 4) { + if (argc < optind + 3) { fprintf(stderr, "No size specified (using byte-data access)\n"); size = I2C_SMBUS_BYTE_DATA; - } else if (!strncmp(argv[flags+3], "b", 1)) { + } else if (!strncmp(argv[optind+2], "b", 1)) { size = I2C_SMBUS_BYTE_DATA; - pec = argv[flags+3][1] == 'p'; - } else if (!strncmp(argv[flags+3], "w", 1)) { + pec = argv[optind+2][1] == 'p'; + } else if (!strncmp(argv[optind+2], "w", 1)) { size = I2C_SMBUS_WORD_DATA; - pec = argv[flags+3][1] == 'p'; - } else if (!strncmp(argv[flags+3], "W", 1)) { + pec = argv[optind+2][1] == 'p'; + } else if (!strncmp(argv[optind+2], "W", 1)) { size = I2C_SMBUS_WORD_DATA; even = 1; - } else if (!strncmp(argv[flags+3], "s", 1)) { + } else if (!strncmp(argv[optind+2], "s", 1)) { fprintf(stderr, "SMBus block mode is no longer supported, please use i2cget instead\n"); exit(1); - } else if (!strncmp(argv[flags+3], "c", 1)) { + } else if (!strncmp(argv[optind+2], "c", 1)) { size = I2C_SMBUS_BYTE; - pec = argv[flags+3][1] == 'p'; - } else if (!strcmp(argv[flags+3], "i")) + pec = argv[optind+2][1] == 'p'; + } else if (!strcmp(argv[optind+2], "i")) size = I2C_SMBUS_I2C_BLOCK_DATA; else { fprintf(stderr, "Error: Invalid mode!\n"); @@ -186,8 +183,8 @@ int main(int argc, char *argv[]) exit(1); } - if (argc > flags + 4) { - bank = strtol(argv[flags+4], &end, 0); + if (argc > optind + 3) { + bank = strtol(argv[optind+3], &end, 0); if (*end || size == I2C_SMBUS_I2C_BLOCK_DATA) { fprintf(stderr, "Error: Invalid bank number!\n"); help(); @@ -200,8 +197,8 @@ int main(int argc, char *argv[]) exit(1); } - if (argc > flags + 5) { - bankreg = strtol(argv[flags+5], &end, 0); + if (argc > optind + 4) { + bankreg = strtol(argv[optind+4], &end, 0); if (*end) { fprintf(stderr, "Error: Invalid bank register " "number!\n"); --- i2c-tools.orig/tools/i2cget.c 2022-05-06 10:17:28.301368522 +0200 +++ i2c-tools/tools/i2cget.c 2022-05-06 10:18:28.780137643 +0200 @@ -180,25 +180,22 @@ int main(int argc, char *argv[]) int daddress; char filename[20]; int pec = 0; - int flags = 0; + int opt; int force = 0, yes = 0, version = 0, all_addrs = 0; int length; unsigned char block_data[I2C_SMBUS_BLOCK_MAX]; /* handle (optional) flags first */ - while (1+flags < argc && argv[1+flags][0] == '-') { - switch (argv[1+flags][1]) { + while ((opt = getopt(argc, argv, "Vafy")) != -1) { + switch (opt) { case 'V': version = 1; break; case 'f': force = 1; break; case 'y': yes = 1; break; case 'a': all_addrs = 1; break; - default: - fprintf(stderr, "Error: Unsupported option " - "\"%s\"!\n", argv[1+flags]); + case '?': help(); exit(1); } - flags++; } if (version) { @@ -206,20 +203,20 @@ int main(int argc, char *argv[]) exit(0); } - if (argc < flags + 3) + if (argc < optind + 2) help(); - i2cbus = lookup_i2c_bus(argv[flags+1]); + i2cbus = lookup_i2c_bus(argv[optind]); if (i2cbus < 0) help(); - address = parse_i2c_address(argv[flags+2], all_addrs); + address = parse_i2c_address(argv[optind+1], all_addrs); if (address < 0) help(); - if (argc > flags + 3) { + if (argc > optind + 2) { size = I2C_SMBUS_BYTE_DATA; - daddress = strtol(argv[flags+3], &end, 0); + daddress = strtol(argv[optind+2], &end, 0); if (*end || daddress < 0 || daddress > 0xff) { fprintf(stderr, "Error: Data address invalid!\n"); help(); @@ -229,8 +226,8 @@ int main(int argc, char *argv[]) daddress = -1; } - if (argc > flags + 4) { - switch (argv[flags+4][0]) { + if (argc > optind + 3) { + switch (argv[optind+3][0]) { case 'b': size = I2C_SMBUS_BYTE_DATA; break; case 'w': size = I2C_SMBUS_WORD_DATA; break; case 'c': size = I2C_SMBUS_BYTE; break; @@ -240,19 +237,19 @@ int main(int argc, char *argv[]) fprintf(stderr, "Error: Invalid mode!\n"); help(); } - pec = argv[flags+4][1] == 'p'; + pec = argv[optind+3][1] == 'p'; if (size == I2C_SMBUS_I2C_BLOCK_DATA && pec) { fprintf(stderr, "Error: PEC not supported for I2C block data!\n"); help(); } } - if (argc > flags + 5) { + if (argc > optind + 4) { if (size != I2C_SMBUS_I2C_BLOCK_DATA) { fprintf(stderr, "Error: Length only valid for I2C block data!\n"); help(); } - length = strtol(argv[flags+5], &end, 0); + length = strtol(argv[optind+4], &end, 0); if (*end || length < 1 || length > I2C_SMBUS_BLOCK_MAX) { fprintf(stderr, "Error: Length invalid!\n"); help(); --- i2c-tools.orig/tools/i2cset.c 2020-09-17 14:29:28.279299308 +0200 +++ i2c-tools/tools/i2cset.c 2022-05-06 15:17:28.593522601 +0200 @@ -162,31 +162,24 @@ int main(int argc, char *argv[]) int value, daddress, vmask = 0; char filename[20]; int pec = 0; - int flags = 0; + int opt; int force = 0, yes = 0, version = 0, readback = 0, all_addrs = 0; unsigned char block[I2C_SMBUS_BLOCK_MAX]; int len; /* handle (optional) flags first */ - while (1+flags < argc && argv[1+flags][0] == '-') { - switch (argv[1+flags][1]) { + while ((opt = getopt(argc, argv, "Vafm:ry")) != -1) { + switch (opt) { case 'V': version = 1; break; case 'f': force = 1; break; case 'y': yes = 1; break; - case 'm': - if (2+flags < argc) - maskp = argv[2+flags]; - flags++; - break; + case 'm': maskp = optarg; break; case 'r': readback = 1; break; case 'a': all_addrs = 1; break; - default: - fprintf(stderr, "Error: Unsupported option " - "\"%s\"!\n", argv[1+flags]); + case '?': help(); exit(1); } - flags++; } if (version) { @@ -194,33 +187,33 @@ int main(int argc, char *argv[]) exit(0); } - if (argc < flags + 4) + if (argc < optind + 3) help(); - i2cbus = lookup_i2c_bus(argv[flags+1]); + i2cbus = lookup_i2c_bus(argv[optind]); if (i2cbus < 0) help(); - address = parse_i2c_address(argv[flags+2], all_addrs); + address = parse_i2c_address(argv[optind+1], all_addrs); if (address < 0) help(); - daddress = strtol(argv[flags+3], &end, 0); + daddress = strtol(argv[optind+2], &end, 0); if (*end || daddress < 0 || daddress > 0xff) { fprintf(stderr, "Error: Data address invalid!\n"); help(); } /* check for command/mode */ - if (argc == flags + 4) { + if (argc == optind + 3) { /* Implicit "c" */ size = I2C_SMBUS_BYTE; - } else if (argc == flags + 5) { + } else if (argc == optind + 4) { /* "c", "cp", or implicit "b" */ - if (!strcmp(argv[flags+4], "c") - || !strcmp(argv[flags+4], "cp")) { + if (!strcmp(argv[optind+3], "c") + || !strcmp(argv[optind+3], "cp")) { size = I2C_SMBUS_BYTE; - pec = argv[flags+4][1] == 'p'; + pec = argv[optind+3][1] == 'p'; } else { size = I2C_SMBUS_BYTE_DATA; } @@ -250,11 +243,11 @@ int main(int argc, char *argv[]) fprintf(stderr, "Error: Mask not supported for block writes!\n"); help(); } - if (argc > (int)sizeof(block) + flags + 5) { + if (argc > (int)sizeof(block) + optind + 4) { fprintf(stderr, "Error: Too many arguments!\n"); help(); } - } else if (argc != flags + 6) { + } else if (argc != optind + 5) { fprintf(stderr, "Error: Too many arguments!\n"); help(); } @@ -270,7 +263,7 @@ int main(int argc, char *argv[]) break; case I2C_SMBUS_BYTE_DATA: case I2C_SMBUS_WORD_DATA: - value = strtol(argv[flags+4], &end, 0); + value = strtol(argv[optind+3], &end, 0); if (*end || value < 0) { fprintf(stderr, "Error: Data value invalid!\n"); help(); @@ -283,8 +276,8 @@ int main(int argc, char *argv[]) break; case I2C_SMBUS_BLOCK_DATA: case I2C_SMBUS_I2C_BLOCK_DATA: - for (len = 0; len + flags + 5 < argc; len++) { - value = strtol(argv[flags + len + 4], &end, 0); + for (len = 0; len + optind + 4 < argc; len++) { + value = strtol(argv[optind + len + 3], &end, 0); if (*end || value < 0) { fprintf(stderr, "Error: Data value invalid!\n"); help(); From patchwork Fri May 6 14:11:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean Delvare X-Patchwork-Id: 570359 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7CB4BC433EF for ; Fri, 6 May 2022 14:11:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1442090AbiEFOPa (ORCPT ); Fri, 6 May 2022 10:15:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39226 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1391428AbiEFOP3 (ORCPT ); Fri, 6 May 2022 10:15:29 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CCEAB5F68 for ; Fri, 6 May 2022 07:11:46 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 8C1961F918 for ; Fri, 6 May 2022 14:11:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1651846305; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=771+RQkoTrI5Xa3QIqKThjCAMkU1JkYTcOHEUtF/X34=; b=wwhHNOKpkEHTHp39nry3JneNBJSi30S+/s4lCDX6Ru78Il3NrnQ/nUqdi7ZlftH/FKbTY7 4KOjjKVowdoPISMQoXJtexLcBIAJm5HTVTCDg+sUyuZrP3yth59oCYZdadZk0ICIKL2qG2 AB8Hxr7A4z9f+dPzusfmOJwRu5HMdFk= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1651846305; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=771+RQkoTrI5Xa3QIqKThjCAMkU1JkYTcOHEUtF/X34=; b=O9rTYg3t3qt0qLd/QoqA9y5aPUwgiVVC3VT60FgUb4V3nwa0vurMceZmnbX0/a7pM6p5L5 hYuQo+kqITCu3rBg== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 7435E13A1B for ; Fri, 6 May 2022 14:11:45 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id nDP0GqEsdWKgaQAAMHmgww (envelope-from ) for ; Fri, 06 May 2022 14:11:45 +0000 Date: Fri, 6 May 2022 16:11:44 +0200 From: Jean Delvare To: Linux I2C Subject: [PATCH 2/2] i2c-tools: Implement and document option -h Message-ID: <20220506161144.59a20dac@endymion.delvare> In-Reply-To: <20220506160652.61d61aa6@endymion.delvare> References: <20220506160652.61d61aa6@endymion.delvare> Organization: SUSE Linux X-Mailer: Claws Mail 3.18.0 (GTK+ 2.24.32; x86_64-suse-linux-gnu) MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Add an option -h to display the help of the tools. This is a common practice so users may expect it to work. Based on a preliminary patch from David Kerns. Signed-off-by: Jean Delvare --- tools/i2cdetect.8 | 6 ++++++ tools/i2cdetect.c | 3 ++- tools/i2cdump.8 | 6 ++++++ tools/i2cdump.c | 3 ++- tools/i2cget.8 | 6 ++++++ tools/i2cget.c | 3 ++- tools/i2cset.8 | 6 ++++++ tools/i2cset.c | 3 ++- 8 files changed, 32 insertions(+), 4 deletions(-) --- i2c-tools.orig/tools/i2cdetect.8 2020-09-17 14:29:28.275299253 +0200 +++ i2c-tools/tools/i2cdetect.8 2022-05-06 16:00:21.370647957 +0200 @@ -18,6 +18,9 @@ i2cdetect \- detect I2C chips .I -V .br .B i2cdetect +.I -h +.br +.B i2cdetect .I -l .SH DESCRIPTION @@ -78,6 +81,9 @@ Display the list of functionalities impl .B "\-V" Display the version and exit. .TP +.B "\-h" +Display the help and exit. +.TP .B "\-l" Output a list of installed busses. --- i2c-tools.orig/tools/i2cdetect.c 2022-05-06 15:53:46.597938799 +0200 +++ i2c-tools/tools/i2cdetect.c 2022-05-06 16:00:48.922977347 +0200 @@ -242,9 +242,10 @@ int main(int argc, char *argv[]) first = 0x00; last = 0x7F; break; + case 'h': case '?': help(); - exit(1); + exit(opt == '?'); } } --- i2c-tools.orig/tools/i2cdump.8 2021-07-22 16:39:29.619547310 +0200 +++ i2c-tools/tools/i2cdump.8 2022-05-06 15:59:58.930379681 +0200 @@ -14,6 +14,9 @@ i2cdump \- examine I2C registers .br .B i2cdump .B -V +.br +.B i2cdump +.B -h .SH DESCRIPTION i2cdump is a small helper program to examine registers @@ -24,6 +27,9 @@ visible through the I2C bus. .B -V Display the version and exit. .TP +.B -h +Display the help and exit. +.TP .B -f Force access to the device even if it is already busy. By default, i2cdump will refuse to access a device which is already under the control of a --- i2c-tools.orig/tools/i2cdump.c 2022-05-06 15:53:46.599938823 +0200 +++ i2c-tools/tools/i2cdump.c 2022-05-06 16:00:53.196028432 +0200 @@ -123,9 +123,10 @@ int main(int argc, char *argv[]) case 'r': range = optarg; break; case 'y': yes = 1; break; case 'a': all_addrs = 1; break; + case 'h': case '?': help(); - exit(1); + exit(opt == '?'); } } --- i2c-tools.orig/tools/i2cget.8 2022-05-03 08:04:39.334978310 +0200 +++ i2c-tools/tools/i2cget.8 2022-05-06 15:58:15.488144365 +0200 @@ -13,6 +13,9 @@ i2cget \- read from I2C/SMBus chip regis .br .B i2cget .B -V +.br +.B i2cget +.B -h .SH DESCRIPTION i2cget is a small helper program to read registers visible through the I2C @@ -23,6 +26,9 @@ bus (or SMBus). .B -V Display the version and exit. .TP +.B -h +Display the help and exit. +.TP .B -f Force access to the device even if it is already busy. By default, i2cget will refuse to access a device which is already under the control of a --- i2c-tools.orig/tools/i2cget.c 2022-05-06 15:53:46.600938834 +0200 +++ i2c-tools/tools/i2cget.c 2022-05-06 16:00:55.894060687 +0200 @@ -192,9 +192,10 @@ int main(int argc, char *argv[]) case 'f': force = 1; break; case 'y': yes = 1; break; case 'a': all_addrs = 1; break; + case 'h': case '?': help(); - exit(1); + exit(opt == '?'); } } --- i2c-tools.orig/tools/i2cset.8 2020-09-17 14:29:28.278299294 +0200 +++ i2c-tools/tools/i2cset.8 2022-05-06 15:58:41.228451225 +0200 @@ -18,6 +18,9 @@ i2cset \- set I2C registers .br .B i2cset .B -V +.br +.B i2cset +.B -h .SH DESCRIPTION i2cset is a small helper program to set registers visible through the I2C @@ -28,6 +31,9 @@ bus. .B -V Display the version and exit. .TP +.B -h +Display the help and exit. +.TP .B -f Force access to the device even if it is already busy. By default, i2cset will refuse to access a device which is already under the control of a --- i2c-tools.orig/tools/i2cset.c 2022-05-06 15:53:46.600938834 +0200 +++ i2c-tools/tools/i2cset.c 2022-05-06 16:00:43.398911306 +0200 @@ -176,9 +176,10 @@ int main(int argc, char *argv[]) case 'm': maskp = optarg; break; case 'r': readback = 1; break; case 'a': all_addrs = 1; break; + case 'h': case '?': help(); - exit(1); + exit(opt == '?'); } }