From: Alejandro Colomar <alx.manpages@gmail.com>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Alejandro Colomar <alx.manpages@gmail.com>
Subject: [PATCH 03/17] Replace some uses of memberof() by its wrappers
Date: Fri, 19 Nov 2021 12:36:31 +0100 [thread overview]
Message-ID: <20211119113644.1600-4-alx.manpages@gmail.com> (raw)
In-Reply-To: <20211119113644.1600-1-alx.manpages@gmail.com>
offsetof(), sizeof_field(), and typeof_member()
are common wrappers over memberof()
that simplify and make more consistent the code
around memberof().
Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>
---
arch/x86/include/asm/bootparam_utils.h | 4 ++--
arch/x86/kernel/signal_compat.c | 6 +++---
drivers/net/ethernet/emulex/benet/be.h | 11 +++++------
drivers/net/ethernet/i825xx/ether1.c | 6 +++---
drivers/scsi/be2iscsi/be.h | 13 ++++++-------
drivers/scsi/be2iscsi/be_cmds.h | 4 ++--
fs/btrfs/ctree.h | 6 +++---
include/acpi/actypes.h | 4 ++--
include/linux/virtio_config.h | 8 ++++----
9 files changed, 30 insertions(+), 32 deletions(-)
diff --git a/arch/x86/include/asm/bootparam_utils.h b/arch/x86/include/asm/bootparam_utils.h
index 71b28b5fb088..728c9245fe33 100644
--- a/arch/x86/include/asm/bootparam_utils.h
+++ b/arch/x86/include/asm/bootparam_utils.h
@@ -3,7 +3,7 @@
#define _ASM_X86_BOOTPARAM_UTILS_H
#include <asm/bootparam.h>
-#include <linux/container_of.h>
+#include <linux/stddef.h>
/*
* This file is included from multiple environments. Do not
@@ -20,7 +20,7 @@
* private magic, so it is better to leave it unchanged.
*/
-#define sizeof_mbr(type, member) ({ sizeof(memberof(type, member)); })
+#define sizeof_mbr(type, member) ({ sizeof_field(type, member); })
#define BOOT_PARAM_PRESERVE(struct_member) \
{ \
diff --git a/arch/x86/kernel/signal_compat.c b/arch/x86/kernel/signal_compat.c
index 28420a7df056..f8b37577d983 100644
--- a/arch/x86/kernel/signal_compat.c
+++ b/arch/x86/kernel/signal_compat.c
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: GPL-2.0
#include <linux/compat.h>
-#include <linux/container_of.h>
#include <linux/uaccess.h>
#include <linux/ptrace.h>
+#include <linux/stddef.h>
/*
* The compat_siginfo_t structure and handing code is very easy
@@ -70,8 +70,8 @@ static inline void signal_compat_build_tests(void)
* structure stays within the padding size (checked
* above).
*/
-#define CHECK_CSI_SIZE(name, size) BUILD_BUG_ON(size != sizeof(memberof(compat_siginfo_t ,_sifields.name)))
-#define CHECK_SI_SIZE(name, size) BUILD_BUG_ON(size != sizeof(memberof(siginfo_t, _sifields.name)))
+#define CHECK_CSI_SIZE(name, size) BUILD_BUG_ON(size != sizeof_field(compat_siginfo_t ,_sifields.name))
+#define CHECK_SI_SIZE(name, size) BUILD_BUG_ON(size != sizeof_field(siginfo_t, _sifields.name))
CHECK_CSI_OFFSET(_kill);
CHECK_CSI_SIZE (_kill, 2*sizeof(int));
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index dc790bae2451..1c80d19cf59f 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -14,10 +14,10 @@
#ifndef BE_H
#define BE_H
-#include <linux/container_of.h>
#include <linux/pci.h>
#include <linux/etherdevice.h>
#include <linux/delay.h>
+#include <linux/stddef.h>
#include <net/tcp.h>
#include <net/ip.h>
#include <net/ipv6.h>
@@ -824,8 +824,7 @@ extern const struct ethtool_ops be_ethtool_ops;
(size) + (PAGE_SIZE_4K - 1)) >> PAGE_SHIFT_4K))
/* Returns bit offset within a DWORD of a bitfield */
-#define AMAP_BIT_OFFSET(_struct, field) \
- (((size_t)&(memberof(_struct, field)))%32)
+#define AMAP_BIT_OFFSET(_struct, field) (offsetof(_struct, field) % 32)
/* Returns the bit mask of the field that is NOT shifted into location. */
static inline u32 amap_mask(u32 bitsize)
@@ -843,8 +842,8 @@ amap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value)
#define AMAP_SET_BITS(_struct, field, ptr, val) \
amap_set(ptr, \
- offsetof(_struct, field)/32, \
- amap_mask(sizeof(memberof(_struct, field))), \
+ offsetof(_struct, field) / 32, \
+ amap_mask(sizeof_field(_struct, field)), \
AMAP_BIT_OFFSET(_struct, field), \
val)
@@ -857,7 +856,7 @@ static inline u32 amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset)
#define AMAP_GET_BITS(_struct, field, ptr) \
amap_get(ptr, \
offsetof(_struct, field)/32, \
- amap_mask(sizeof(memberof(_struct, field))), \
+ amap_mask(sizeof_field(_struct, field)), \
AMAP_BIT_OFFSET(_struct, field))
#define GET_RX_COMPL_V0_BITS(field, ptr) \
diff --git a/drivers/net/ethernet/i825xx/ether1.c b/drivers/net/ethernet/i825xx/ether1.c
index 4dece3476d31..938b5948883c 100644
--- a/drivers/net/ethernet/i825xx/ether1.c
+++ b/drivers/net/ethernet/i825xx/ether1.c
@@ -28,7 +28,6 @@
* 1.07 RMK 13/05/2000 Updated for 2.3.99-pre8
*/
-#include <linux/containerof.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -37,6 +36,7 @@
#include <linux/ioport.h>
#include <linux/in.h>
#include <linux/slab.h>
+#include <linux/stddef.h>
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/device.h>
@@ -82,9 +82,9 @@ static char version[] = "ether1 ethernet driver (c) 2000 Russell King v1.07\n";
#define NORMALIRQS 0
#define ether1_readw(dev, addr, type, offset, svflgs) \
- ether1_inw_p(dev, addr + (int)(&(memberof(type, offset))), svflgs)
+ ether1_inw_p(dev, addr + offsetof(type, offset), svflgs)
#define ether1_writew(dev, val, addr, type, offset, svflgs) \
- ether1_outw_p(dev, val, addr + (int)(&(memberof(type, offset))), svflgs)
+ ether1_outw_p(dev, val, addr + offsetof(type, offset), svflgs)
static inline unsigned short
ether1_inw_p (struct net_device *dev, int addr, int svflgs)
diff --git a/drivers/scsi/be2iscsi/be.h b/drivers/scsi/be2iscsi/be.h
index 6830e07fd37a..ec44b0d86ae4 100644
--- a/drivers/scsi/be2iscsi/be.h
+++ b/drivers/scsi/be2iscsi/be.h
@@ -10,10 +10,10 @@
#ifndef BEISCSI_H
#define BEISCSI_H
-#include <linux/container_of.h>
#include <linux/pci.h>
#include <linux/if_vlan.h>
#include <linux/irq_poll.h>
+#include <linux/stddef.h>
#define FW_VER_LEN 32
#define MCC_Q_LEN 128
#define MCC_CQ_LEN 256
@@ -153,8 +153,7 @@ struct be_ctrl_info {
(size) + (PAGE_SIZE_4K - 1)) >> PAGE_SHIFT_4K))
/* Returns bit offset within a DWORD of a bitfield */
-#define AMAP_BIT_OFFSET(_struct, field) \
- (((size_t)&(memberof(_struct, field)))%32)
+#define AMAP_BIT_OFFSET(_struct, field) (offsetof(_struct, field) % 32)
/* Returns the bit mask of the field that is NOT shifted into location. */
static inline u32 amap_mask(u32 bitsize)
@@ -172,8 +171,8 @@ static inline void amap_set(void *ptr, u32 dw_offset, u32 mask,
#define AMAP_SET_BITS(_struct, field, ptr, val) \
amap_set(ptr, \
- offsetof(_struct, field)/32, \
- amap_mask(sizeof(memberof(_struct, field))), \
+ offsetof(_struct, field) / 32, \
+ amap_mask(sizeof_field(_struct, field)), \
AMAP_BIT_OFFSET(_struct, field), \
val)
@@ -185,8 +184,8 @@ static inline u32 amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset)
#define AMAP_GET_BITS(_struct, field, ptr) \
amap_get(ptr, \
- offsetof(_struct, field)/32, \
- amap_mask(sizeof(memberof(_struct, field))), \
+ offsetof(_struct, field) / 32, \
+ amap_mask(sizeof_field(_struct, field)), \
AMAP_BIT_OFFSET(_struct, field))
#define be_dws_cpu_to_le(wrb, len) swap_dws(wrb, len)
diff --git a/drivers/scsi/be2iscsi/be_cmds.h b/drivers/scsi/be2iscsi/be_cmds.h
index bb6ee43769d5..370ca9131090 100644
--- a/drivers/scsi/be2iscsi/be_cmds.h
+++ b/drivers/scsi/be2iscsi/be_cmds.h
@@ -11,7 +11,7 @@
#define BEISCSI_CMDS_H
-#include <linux/container_of.h>
+#include <linux/stddef.h>
/**
* The driver sends configuration and managements command requests to the
@@ -1303,7 +1303,7 @@ struct be_cmd_get_port_name {
/* Returns the number of items in the field array. */
#define BE_NUMBER_OF_FIELD(_type_, _field_) \
- (sizeof_field(_type_, _field_) / sizeof(memberof(_type_, _field_[0])))
+ (sizeof_field(_type_, _field_) / sizeof_field(_type_, _field_[0]))
/**
* Different types of iSCSI completions to host driver for both initiator
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 442b6f937b22..cbad9202f213 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -6,7 +6,6 @@
#ifndef BTRFS_CTREE_H
#define BTRFS_CTREE_H
-#include <linux/container_of.h>
#include <linux/mm.h>
#include <linux/sched/signal.h>
#include <linux/highmem.h>
@@ -29,6 +28,7 @@
#include <linux/refcount.h>
#include <linux/crc32c.h>
#include <linux/iomap.h>
+#include <linux/stddef.h>
#include "extent-io-tree.h"
#include "extent_io.h"
#include "extent_map.h"
@@ -1576,13 +1576,13 @@ static inline void put_unaligned_le8(u8 val, void *p)
read_extent_buffer(eb, (char *)(result), \
((unsigned long)(ptr)) + \
offsetof(type, member), \
- sizeof(memberof(type, member))))
+ sizeof_field(type, member)))
#define write_eb_member(eb, ptr, type, member, result) (\
write_extent_buffer(eb, (char *)(result), \
((unsigned long)(ptr)) + \
offsetof(type, member), \
- sizeof(memberof(type, member))))
+ sizeof_field(type, member)))
#define DECLARE_BTRFS_SETGET_BITS(bits) \
u##bits btrfs_get_token_##bits(struct btrfs_map_token *token, \
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
index c3b0eccb3377..e0bcfd37a005 100644
--- a/include/acpi/actypes.h
+++ b/include/acpi/actypes.h
@@ -10,7 +10,7 @@
#ifndef __ACTYPES_H__
#define __ACTYPES_H__
-#include <linux/container_of.h>
+#include <linux/stddef.h>
/* acpisrc:struct_defs -- for acpisrc conversion */
@@ -510,7 +510,7 @@ typedef u64 acpi_integer;
#define ACPI_TO_POINTER(i) ACPI_CAST_PTR (void, (acpi_size) (i))
#define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) 0)
-#define ACPI_OFFSET(d, f) ACPI_PTR_DIFF (&(memberof(d, f)), (void *) 0)
+#define ACPI_OFFSET(d, f) offsetof(d, f)
#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i)
#define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index a1e656c0d94a..4fd659e26450 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -333,7 +333,7 @@ static inline __virtio64 cpu_to_virtio64(struct virtio_device *vdev, u64 val)
/* Config space accessors. */
#define virtio_cread(vdev, structname, member, ptr) \
do { \
- typeof(memberof(structname, member)) virtio_cread_v; \
+ typeof_member(structname, member) virtio_cread_v; \
\
might_sleep(); \
/* Sanity check: must match the member's type */ \
@@ -362,7 +362,7 @@ static inline __virtio64 cpu_to_virtio64(struct virtio_device *vdev, u64 val)
/* Config space accessors. */
#define virtio_cwrite(vdev, structname, member, ptr) \
do { \
- typeof(memberof(structname, member)) virtio_cwrite_v = \
+ typeof_member(structname, member) virtio_cwrite_v = \
cpu_to_virtio(vdev, *(ptr), memberof(structname, member)); \
\
might_sleep(); \
@@ -397,7 +397,7 @@ static inline __virtio64 cpu_to_virtio64(struct virtio_device *vdev, u64 val)
/* LE (e.g. modern) Config space accessors. */
#define virtio_cread_le(vdev, structname, member, ptr) \
do { \
- typeof(memberof(structname, member)) virtio_cread_v; \
+ typeof_member(structname, member) virtio_cread_v; \
\
might_sleep(); \
/* Sanity check: must match the member's type */ \
@@ -425,7 +425,7 @@ static inline __virtio64 cpu_to_virtio64(struct virtio_device *vdev, u64 val)
#define virtio_cwrite_le(vdev, structname, member, ptr) \
do { \
- typeof(memberof(structname, member)) virtio_cwrite_v = \
+ typeof_member(structname, member) virtio_cwrite_v = \
virtio_cpu_to_le(*(ptr), memberof(structname, member)); \
\
might_sleep(); \
--
2.33.1
next prev parent reply other threads:[~2021-11-19 11:37 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-19 11:36 [PATCH 00/17] Add memberof(), split some headers, and slightly simplify code Alejandro Colomar
2021-11-19 11:36 ` [PATCH 01/17] linux/container_of.h: Add memberof(T, m) Alejandro Colomar
2021-11-19 11:36 ` [PATCH 02/17] Use memberof(T, m) instead of explicit NULL dereference Alejandro Colomar
2021-11-23 18:07 ` Rafael J. Wysocki
2021-11-19 11:36 ` Alejandro Colomar [this message]
2021-11-19 11:36 ` [PATCH 04/17] linux/memberof.h: Move memberof() to separate header Alejandro Colomar
2021-11-19 11:36 ` [PATCH 05/17] linux/typeof_member.h: Move typeof_member() to a " Alejandro Colomar
2021-11-19 11:36 ` [PATCH 06/17] Simplify sizeof(typeof_member()) to sizeof_field() Alejandro Colomar
2021-11-19 11:36 ` [PATCH 07/17] linux/NULL.h: Move NULL to a separate header Alejandro Colomar
2021-11-19 11:36 ` [PATCH 08/17] linux/offsetof.h: Move offsetof(T, m) " Alejandro Colomar
2021-11-19 11:36 ` [PATCH 09/17] linux/offsetof.h: Implement offsetof() in terms of memberof() Alejandro Colomar
2021-11-19 11:36 ` [PATCH 10/17] linux/container_of.h: Implement container_of_safe() in terms of container_of() Alejandro Colomar
2021-11-19 11:36 ` [PATCH 11/17] linux/container_of.h: Cosmetic Alejandro Colomar
2021-11-19 11:36 ` [PATCH 12/17] linux/container_of.h: Remove unnecessary cast to (void *) Alejandro Colomar
2021-11-19 11:36 ` [PATCH 13/17] linux/sizeof_field.h: Move sizeof_field(T, m) to a separate header Alejandro Colomar
2021-11-19 11:36 ` [PATCH 14/17] include/linux/: Include a smaller header if just for NULL Alejandro Colomar
2021-11-19 11:36 ` [PATCH 15/17] linux/offsetofend.h: Move offsetofend(T, m) to a separate header Alejandro Colomar
2021-11-19 11:36 ` [PATCH 16/17] linux/array_size.h: Move ARRAY_SIZE(arr) " Alejandro Colomar
2021-11-19 11:36 ` [PATCH 17/17] include/: Include <linux/array_size.h> for ARRAY_SIZE() Alejandro Colomar
2021-11-19 12:47 ` [PATCH 00/17] Add memberof(), split some headers, and slightly simplify code Jani Nikula
2021-11-19 13:16 ` Alejandro Colomar (man-pages)
2021-11-19 13:48 ` Jani Nikula
2021-11-19 14:54 ` Andy Shevchenko
2021-11-19 14:47 ` Arnd Bergmann
2021-11-19 15:06 ` Alejandro Colomar (man-pages)
2021-11-19 15:34 ` Andy Shevchenko
2021-11-19 15:38 ` Alejandro Colomar (man-pages)
2021-11-19 15:43 ` Alejandro Colomar (man-pages)
2021-11-19 15:49 ` Andy Shevchenko
2021-11-19 15:52 ` Alejandro Colomar (man-pages)
2021-11-19 16:07 ` Andy Shevchenko
2021-11-19 15:57 ` Arnd Bergmann
2021-11-19 16:10 ` Andy Shevchenko
2021-11-19 16:18 ` Arnd Bergmann
2021-11-19 16:22 ` Alejandro Colomar (man-pages)
2021-11-19 16:27 ` Arnd Bergmann
2021-11-19 16:35 ` Andy Shevchenko
2021-11-22 12:36 ` Jonathan Cameron
2021-11-19 16:12 ` Alejandro Colomar (man-pages)
2021-11-19 16:25 ` Arnd Bergmann
2021-11-19 16:37 ` Andy Shevchenko
2021-11-19 16:49 ` Alejandro Colomar (man-pages)
2021-11-20 13:00 ` [PATCH v2 00/20] Add memberof(), split headers, and " Alejandro Colomar
2021-11-20 13:00 ` [PATCH v2 01/20] linux/stddef.h, linux/offsetof.h: Split offsetof() into a separate header Alejandro Colomar
2021-11-20 16:14 ` Andy Shevchenko
2021-11-20 16:22 ` Alejandro Colomar (man-pages)
2021-11-20 13:00 ` [PATCH v2 02/20] linux/stddef.h, linux/sizeof_field.h: Split sizeof_field() " Alejandro Colomar
2021-11-20 16:16 ` Andy Shevchenko
2021-11-20 13:00 ` [PATCH v2 03/20] linux/stddef.h, linux/offsetofend.h: Split offsetofend() " Alejandro Colomar
2021-11-20 13:00 ` [PATCH v2 04/20] linux/stddef.h, linux/NULL.h: Split NULL " Alejandro Colomar
2021-11-20 13:00 ` [PATCH v2 05/20] linux/container_of.h, linux/typeof_member.h: Split typeof_member() " Alejandro Colomar
2021-11-20 13:00 ` [PATCH v2 06/20] linux/kernel.h, linux/array_size.h: Split ARRAY_SIZE() " Alejandro Colomar
2021-11-22 7:36 ` kernel test robot
2021-11-20 13:00 ` [PATCH v2 07/20] linux/memberof.h: Add memberof(T, m) macro Alejandro Colomar
2021-11-20 13:00 ` [PATCH v2 08/20] Implement container_of_safe() in terms of container_of() Alejandro Colomar
2021-11-21 13:31 ` Arnd Bergmann
2021-11-20 13:00 ` [PATCH v2 09/20] Implement offsetof(), sizeof_member(), typeof_member(), and container_of() in terms of memberof() Alejandro Colomar
2021-11-20 13:00 ` [PATCH v2 10/20] linux/container_of.h: Remove unnecessary cast Alejandro Colomar
2021-11-20 19:05 ` kernel test robot
2021-11-22 17:39 ` kernel test robot
2021-11-20 13:00 ` [PATCH v2 11/20] linux/container_of.h: Cosmetic Alejandro Colomar
2021-11-20 16:12 ` Andy Shevchenko
2021-11-20 16:33 ` Joe Perches
2021-11-20 16:44 ` Alejandro Colomar (man-pages)
2021-11-20 13:00 ` [PATCH v2 12/20] linux/must_be.h: Add must_be() to improve readability of BUILD_BUG_ON_ZERO() Alejandro Colomar
2021-11-20 15:05 ` Alexey Dobriyan
2021-11-20 15:22 ` Alejandro Colomar (man-pages)
2021-11-21 13:18 ` Arnd Bergmann
2021-11-20 13:00 ` [PATCH v2 13/20] Move BUILD_BUG_ON_ZERO to <linux/must_be.h> Alejandro Colomar
2021-11-20 13:00 ` [PATCH v2 13/20] linux/build_bug.h, linux/must_be.h: " Alejandro Colomar
2021-11-20 13:00 ` [PATCH v2 14/20] linux/compiler_types.h, linux/same_type.h: Split __same_type() to a separate header Alejandro Colomar
2021-11-21 13:26 ` Arnd Bergmann
2021-11-20 13:00 ` [PATCH v2 15/20] linux/compiler.h: Implement __must_be_array() in terms of __must_be() Alejandro Colomar
2021-11-21 13:25 ` Arnd Bergmann
2021-11-20 13:01 ` [PATCH v2 16/20] linux/compiler.h, linux/array_size.h: Move __must_be_array() into <linux/array_size.h> Alejandro Colomar
2021-11-21 13:24 ` Arnd Bergmann
2021-11-22 8:51 ` Jani Nikula
2021-11-20 13:01 ` [PATCH v2 17/20] linux/array_size.h: Add __is_array(a) to help readability Alejandro Colomar
2021-11-21 13:22 ` Arnd Bergmann
2021-11-20 13:01 ` [PATCH v2 18/20] linux/power_of_2.h: Add __IS_POWER_OF_2(n) and __IS_POWER_OF_2_OR_0(n) macros Alejandro Colomar
2021-11-21 13:20 ` Arnd Bergmann
2021-11-22 8:55 ` Jani Nikula
2021-11-20 13:01 ` [PATCH v2 19/20] linux/build_bug.h, linux/power_of_2.h: Move [__]BUILD_BUG_ON_NOT_POWER_OF_2() to <linux/power_of_2.h> Alejandro Colomar
2021-11-20 13:01 ` [PATCH v2 20/20] linux/power_of_2.h: Implement [__]BUILD_BUG_ON_NOT_POWER_OF_2() in terms of __IS_POWER_OF_2[_OR_0]() Alejandro Colomar
2021-11-22 11:17 ` [PATCH v2 00/20] Add memberof(), split headers, and simplify code Andy Shevchenko
2021-11-22 12:07 ` Alejandro Colomar (man-pages)
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=20211119113644.1600-4-alx.manpages@gmail.com \
--to=alx.manpages@gmail.com \
--cc=linux-kernel@vger.kernel.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).