From: Gaetan Rivet <gaetan.rivet@6wind.com>
To: dev@dpdk.org
Cc: Gaetan Rivet <gaetan.rivet@6wind.com>
Subject: [dpdk-dev] [PATCH 07/13] pci: avoid over-complicated macro
Date: Fri, 25 Aug 2017 11:04:29 +0200 [thread overview]
Message-ID: <30a3a685f0b42f2b7b80e9c23c731c6140958cb2.1503651392.git.gaetan.rivet@6wind.com> (raw)
In-Reply-To: <cover.1503651392.git.gaetan.rivet@6wind.com>
In-Reply-To: <cover.1503651392.git.gaetan.rivet@6wind.com>
Using a macro helps writing the code to the detriment of the reader in
this case. This is backward. Write once, read many.
The few LOCs gained is not worth the opacity of the implementation.
Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
lib/librte_pci/rte_pci.c | 65 ++++++++++++++++++++++++++++++++++--------------
1 file changed, 46 insertions(+), 19 deletions(-)
diff --git a/lib/librte_pci/rte_pci.c b/lib/librte_pci/rte_pci.c
index 8584b55..cbb5359 100644
--- a/lib/librte_pci/rte_pci.c
+++ b/lib/librte_pci/rte_pci.c
@@ -53,36 +53,63 @@
#include "rte_pci.h"
-/* Macro used by pci addr parsing functions. **/
-#define GET_PCIADDR_FIELD(in, fd, lim, dlm) \
-do { \
- unsigned long val; \
- char *end; \
- errno = 0; \
- val = strtoul((in), &end, 16); \
- if (errno != 0 || end[0] != (dlm) || val > (lim)) \
- return -EINVAL; \
- (fd) = (typeof (fd))val; \
- (in) = end + 1; \
-} while(0)
+static inline const char *
+get_u8_pciaddr_field(const char *in, void *_u8, char dlm)
+{
+ unsigned long val;
+ uint8_t *u8 = _u8;
+ char *end;
+
+ errno = 0;
+ val = strtoul(in, &end, 16);
+ if (errno != 0 || end[0] != dlm || val > UINT8_MAX) {
+ errno = errno ? errno : EINVAL;
+ return NULL;
+ }
+ *u8 = (uint8_t)val;
+ return end + 1;
+}
int
eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr)
{
+ const char *in = input;
+
dev_addr->domain = 0;
- GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':');
- GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.');
- GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0);
+ in = get_u8_pciaddr_field(in, &dev_addr->bus, ':');
+ if (in == NULL)
+ return -EINVAL;
+ in = get_u8_pciaddr_field(in, &dev_addr->devid, '.');
+ if (in == NULL)
+ return -EINVAL;
+ in = get_u8_pciaddr_field(in, &dev_addr->function, '\0');
+ if (in == NULL)
+ return -EINVAL;
return 0;
}
int
eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr)
{
- GET_PCIADDR_FIELD(input, dev_addr->domain, UINT16_MAX, ':');
- GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':');
- GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.');
- GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0);
+ const char *in = input;
+ unsigned long val;
+ char *end;
+
+ errno = 0;
+ val = strtoul(in, &end, 16);
+ if (errno != 0 || end[0] != ':' || val > UINT16_MAX)
+ return -EINVAL;
+ dev_addr->domain = (uint16_t)val;
+ in = end + 1;
+ in = get_u8_pciaddr_field(in, &dev_addr->bus, ':');
+ if (in == NULL)
+ return -EINVAL;
+ in = get_u8_pciaddr_field(in, &dev_addr->devid, '.');
+ if (in == NULL)
+ return -EINVAL;
+ in = get_u8_pciaddr_field(in, &dev_addr->function, '\0');
+ if (in == NULL)
+ return -EINVAL;
return 0;
}
--
2.1.4
next prev parent reply other threads:[~2017-08-25 9:04 UTC|newest]
Thread overview: 156+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-25 9:04 [dpdk-dev] [PATCH 00/13] Move PCI away from the EAL Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 01/13] eal: expose rte_eal_using_phys_addrs Gaetan Rivet
2017-09-04 13:24 ` Burakov, Anatoly
2017-08-25 9:04 ` [dpdk-dev] [PATCH 02/13] ethdev: remove useless PCI dependency Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 03/13] bus: properly include rte_debug Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 04/13] eal: remove references to PCI Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 05/13] pci: introduce PCI lib and bus Gaetan Rivet
2017-08-25 9:31 ` Luca Boccassi
2017-08-25 9:34 ` Gaëtan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 06/13] pci: avoid inlining functions Gaetan Rivet
2017-08-25 9:04 ` Gaetan Rivet [this message]
2017-08-25 9:04 ` [dpdk-dev] [PATCH 08/13] pci: deprecate misnamed functions Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 09/13] lib: include rte_bus_pci Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 10/13] drivers: " Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 11/13] test: " Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 12/13] app/testpmd: " Gaetan Rivet
2017-08-25 9:04 ` [dpdk-dev] [PATCH 13/13] cryptodev: move PCI specific helpers to drivers/crypto Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 00/14] Move PCI away from the EAL Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 01/14] eal: expose rte_eal_using_phys_addrs Gaetan Rivet
2017-09-18 10:47 ` Shreyansh Jain
2017-09-18 11:37 ` Gaëtan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 02/14] ethdev: remove useless PCI dependency Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 03/14] bus: properly include rte_debug Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 04/14] eal: remove references to PCI Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 05/14] pci: introduce PCI lib and bus Gaetan Rivet
2017-09-18 11:53 ` Shreyansh Jain
2017-09-18 11:51 ` Gaëtan Rivet
2017-09-18 12:18 ` Shreyansh Jain
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 06/14] lib: include rte_bus_pci Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 07/14] drivers: " Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 08/14] test: " Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 09/14] app/testpmd: " Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 10/14] cryptodev: move PCI specific helpers to drivers/crypto Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 11/14] pci: avoid inlining functions Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 12/14] pci: avoid over-complicated macro Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 13/14] pci: deprecate misnamed functions Gaetan Rivet
2017-09-18 9:31 ` [dpdk-dev] [PATCH v2 14/14] doc: add notes on EAL PCI API update Gaetan Rivet
2017-09-18 11:22 ` Mcnamara, John
2017-09-25 15:23 ` [dpdk-dev] [PATCH v3 00/13] Move PCI away from the EAL Gaetan Rivet
2017-09-25 15:23 ` [dpdk-dev] [PATCH v3 01/13] eal: expose rte_eal_using_phys_addrs Gaetan Rivet
2017-09-25 15:23 ` [dpdk-dev] [PATCH v3 02/13] ethdev: remove useless PCI dependency Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 03/13] bus: properly include rte_debug Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 04/13] pci: introduce PCI lib and bus Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 05/13] lib: include rte_bus_pci Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 06/13] drivers: " Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 07/13] test: " Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 08/13] app/testpmd: " Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 09/13] cryptodev: move PCI specific helpers to drivers/crypto Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 10/13] pci: avoid inlining functions Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 11/13] pci: avoid over-complicated macro Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 12/13] pci: deprecate misnamed functions Gaetan Rivet
2017-09-25 15:24 ` [dpdk-dev] [PATCH v3 13/13] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 00/16] Move PCI away from the EAL Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 01/16] eal: include debug header in bus source Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 02/16] ethdev: remove useless PCI dependency Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 03/16] pci: introduce PCI lib and bus Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 04/16] lib: include PCI bus header Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 05/16] drivers: " Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 06/16] test: " Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 07/16] app/testpmd: " Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 08/16] cryptodev: move PCI specific helpers to drivers/crypto Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 09/16] net/bonding: use local prefix for local function Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 10/16] pci: avoid inlining functions Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 11/16] pci: avoid over-complicated macro Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 12/16] pci: deprecate misnamed functions Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 13/16] pci: introduce PCI address parsing function Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 14/16] pci: make specialized parsing functions private Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 15/16] bus/pci: use new PCI addr parsing function Gaetan Rivet
2017-10-12 8:17 ` [dpdk-dev] [PATCH v4 16/16] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 00/20] Move PCI away from the EAL Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 01/20] eal: include debug header in bus source Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 02/20] ethdev: remove useless PCI dependency Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 03/20] pci: introduce PCI lib and bus Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 04/20] lib: include PCI bus header Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 05/20] drivers: " Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 06/20] test: " Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 07/20] app/testpmd: " Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 08/20] cryptodev: move PCI specific helpers to drivers/crypto Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 09/20] net/bonding: use local prefix for local function Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 10/20] pci: avoid inlining functions Gaetan Rivet
2017-10-17 18:20 ` Aaron Conole
2017-10-18 8:54 ` Gaëtan Rivet
2017-10-18 14:30 ` Aaron Conole
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 11/20] pci: avoid over-complicated macro Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 12/20] pci: deprecate misnamed functions Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 13/20] pci: introduce PCI address parsing function Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 14/20] pci: make specialized parsing functions private Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 15/20] bus/pci: use new PCI addr parsing function Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 16/20] bus/pci: do not expose private functions Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 17/20] bus/pci: do not expose PCI match function Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 18/20] bus/pci: do not expose IOVA mode getter Gaetan Rivet
2017-10-12 10:54 ` Gaëtan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 19/20] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-12 10:45 ` [dpdk-dev] [PATCH v5 20/20] bus: rename scan policy as probe policy Gaetan Rivet
2017-10-12 10:55 ` Gaëtan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 00/25] Move PCI away from the EAL Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 01/25] ethdev: remove useless PCI dependency Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 02/25] eal: include debug header in bus source Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 03/25] eal: include stdint in private header Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 04/25] eal: include common header Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 05/25] eal: expose rte_eal_using_phys_addrs Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 06/25] eal: expose internal config elements Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 07/25] eal: expose vfio symbols Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 08/25] vfio: remove useless PCI headers and add vfio one Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 09/25] vfio: check PCI dependency from within PCI code Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 10/25] vfio: move PCI-related functions out of vfio header Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 11/25] pci: avoid inlining functions Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 12/25] pci: avoid over-complicated macro Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 13/25] pci: deprecate misnamed functions Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 14/25] pci: introduce PCI address parsing function Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 15/25] pci: make specialized parsing functions private Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 16/25] pci: use new PCI addr comparison function Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 17/25] pci: use new PCI addr parsing function Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 18/25] pci: do not expose private functions Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 19/25] pci: do not expose PCI match function Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 20/25] pci: do not expose IOVA mode getter Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 21/25] pci: use EAL exposed configuration Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 22/25] net/bonding: use local prefix for local function Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 23/25] pci: introduce PCI lib and bus Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 24/25] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-25 22:38 ` [dpdk-dev] [PATCH v7 25/25] maintainers: claim maintainership of PCI lib Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 00/25] Move PCI away from the EAL Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 01/25] ethdev: remove useless PCI dependency Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 02/25] eal: include debug header in bus source Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 03/25] eal: include stdint in private header Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 04/25] eal: include common header Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 05/25] eal: expose rte_eal_using_phys_addrs Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 06/25] eal: expose internal config elements Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 07/25] eal: expose vfio symbols Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 08/25] vfio: remove useless PCI headers Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 09/25] vfio: check PCI dependency from within PCI code Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 10/25] vfio: move PCI-related symbols out of vfio header Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 11/25] pci: avoid inlining functions Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 12/25] pci: avoid over-complicated macro Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 13/25] pci: deprecate misnamed functions Gaetan Rivet
2017-10-26 10:05 ` [dpdk-dev] [PATCH v8 14/25] pci: introduce PCI address parsing function Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 15/25] pci: make specialized parsing functions private Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 16/25] pci: use new PCI addr comparison function Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 17/25] pci: use new PCI addr parsing function Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 18/25] pci: do not expose private functions Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 19/25] pci: do not expose PCI match function Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 20/25] pci: do not expose IOVA mode getter Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 21/25] pci: use EAL exposed configuration Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 22/25] net/bonding: use local prefix for local function Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 23/25] pci: introduce PCI lib and bus Gaetan Rivet
2017-10-26 15:56 ` Thomas Monjalon
2017-10-26 17:44 ` Thomas Monjalon
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 24/25] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-26 10:06 ` [dpdk-dev] [PATCH v8 25/25] maintainers: claim maintainership of PCI lib Gaetan Rivet
2017-10-26 21:23 ` [dpdk-dev] [PATCH v8 00/25] Move PCI away from the EAL Thomas Monjalon
2017-10-29 16:47 ` Andrew Rybchenko
2017-10-30 5:16 ` Gaëtan Rivet
2017-10-11 14:19 ` [dpdk-dev] [PATCH v2 00/14] " Doherty, Declan
2017-10-11 14:32 ` Gaëtan Rivet
2017-10-23 8:44 ` De Lara Guarch, Pablo
2017-10-23 8:49 ` Gaëtan Rivet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=30a3a685f0b42f2b7b80e9c23c731c6140958cb2.1503651392.git.gaetan.rivet@6wind.com \
--to=gaetan.rivet@6wind.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).