kernel-janitors.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] ipvs: clean code for ip_vs_sync.c
@ 2020-07-16  1:57 zhouxudong199
  2020-07-16  2:58 ` Suraj Upadhyay
  0 siblings, 1 reply; 4+ messages in thread
From: zhouxudong199 @ 2020-07-16  1:57 UTC (permalink / raw)
  To: wensong, horms
  Cc: netdev, lvs-devel, kernel-janitors, zhouxudong8, rose.chen,
	zhaowei23

v1 -> v2:
add missing spaces after Signed-off-by and ipvs: in the subject. 
i=0 changed to i = 0.  

Signed-off-by: zhouxudong199 <zhouxudong8@huawei.com>
---
 net/netfilter/ipvs/ip_vs_sync.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
index 605e0f6..885bab4 100644
--- a/net/netfilter/ipvs/ip_vs_sync.c
+++ b/net/netfilter/ipvs/ip_vs_sync.c
@@ -1077,10 +1077,10 @@ static inline int ip_vs_proc_sync_conn(struct netns_ipvs *ipvs, __u8 *p, __u8 *m
 	struct ip_vs_protocol *pp;
 	struct ip_vs_conn_param param;
 	__u32 flags;
-	unsigned int af, state, pe_data_len=0, pe_name_len=0;
-	__u8 *pe_data=NULL, *pe_name=NULL;
-	__u32 opt_flags=0;
-	int retc=0;
+	unsigned int af, state, pe_data_len = 0, pe_name_len = 0;
+	__u8 *pe_data = NULL, *pe_name = NULL;
+	__u32 opt_flags = 0;
+	int retc = 0;
 
 	s = (union ip_vs_sync_conn *) p;
 
@@ -1089,7 +1089,7 @@ static inline int ip_vs_proc_sync_conn(struct netns_ipvs *ipvs, __u8 *p, __u8 *m
 		af = AF_INET6;
 		p += sizeof(struct ip_vs_sync_v6);
 #else
-		IP_VS_DBG(3,"BACKUP, IPv6 msg received, and IPVS is not compiled for IPv6\n");
+		IP_VS_DBG(3, "BACKUP, IPv6 msg received, and IPVS is not compiled for IPv6\n");
 		retc = 10;
 		goto out;
 #endif
@@ -1129,7 +1129,7 @@ static inline int ip_vs_proc_sync_conn(struct netns_ipvs *ipvs, __u8 *p, __u8 *m
 			break;
 
 		case IPVS_OPT_PE_NAME:
-			if (ip_vs_proc_str(p, plen,&pe_name_len, &pe_name,
+			if (ip_vs_proc_str(p, plen, &pe_name_len, &pe_name,
 					   IP_VS_PENAME_MAXLEN, &opt_flags,
 					   IPVS_OPT_F_PE_NAME))
 				return -70;
@@ -1155,7 +1155,7 @@ static inline int ip_vs_proc_sync_conn(struct netns_ipvs *ipvs, __u8 *p, __u8 *m
 	if (!(flags & IP_VS_CONN_F_TEMPLATE)) {
 		pp = ip_vs_proto_get(s->v4.protocol);
 		if (!pp) {
-			IP_VS_DBG(3,"BACKUP, Unsupported protocol %u\n",
+			IP_VS_DBG(3, "BACKUP, Unsupported protocol %u\n",
 				s->v4.protocol);
 			retc = 30;
 			goto out;
@@ -1232,7 +1232,7 @@ static void ip_vs_process_message(struct netns_ipvs *ipvs, __u8 *buffer,
 		msg_end = buffer + sizeof(struct ip_vs_sync_mesg);
 		nr_conns = m2->nr_conns;
 
-		for (i=0; i<nr_conns; i++) {
+		for (i = 0; i < nr_conns; i++) {
 			union ip_vs_sync_conn *s;
 			unsigned int size;
 			int retc;
@@ -1444,7 +1444,7 @@ static int bind_mcastif_addr(struct socket *sock, struct net_device *dev)
 	sin.sin_addr.s_addr  = addr;
 	sin.sin_port         = 0;
 
-	return sock->ops->bind(sock, (struct sockaddr*)&sin, sizeof(sin));
+	return sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
 }
 
 static void get_mcast_sockaddr(union ipvs_sockaddr *sa, int *salen,
-- 
2.6.1.windows.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] ipvs: clean code for ip_vs_sync.c
  2020-07-16  1:57 [PATCH v2] ipvs: clean code for ip_vs_sync.c zhouxudong199
@ 2020-07-16  2:58 ` Suraj Upadhyay
  2020-07-16  2:59   ` 答复: " Zhouxudong (EulerOS)
  0 siblings, 1 reply; 4+ messages in thread
From: Suraj Upadhyay @ 2020-07-16  2:58 UTC (permalink / raw)
  To: zhouxudong199
  Cc: wensong, horms, netdev, lvs-devel, kernel-janitors, rose.chen,
	zhaowei23

On Thu, Jul 16, 2020 at 01:57:51AM +0000, zhouxudong199 wrote:
> v1 -> v2:
> add missing spaces after Signed-off-by and ipvs: in the subject. 
> i=0 changed to i = 0.  
>

You should write the version changes after "---" and before the first
diff.

Also, looking at your patch I think your commit message should be
something like this :

"Use appropriate spaces around operators."

> Signed-off-by: zhouxudong199 <zhouxudong8@huawei.com>
> ---
>  net/netfilter/ipvs/ip_vs_sync.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
> index 605e0f6..885bab4 100644
> --- a/net/netfilter/ipvs/ip_vs_sync.c
> +++ b/net/netfilter/ipvs/ip_vs_sync.c
> @@ -1077,10 +1077,10 @@ static inline int ip_vs_proc_sync_conn(struct netns_ipvs *ipvs, __u8 *p, __u8 *m
>  	struct ip_vs_protocol *pp;
>  	struct ip_vs_conn_param param;
>  	__u32 flags;
> -	unsigned int af, state, pe_data_len=0, pe_name_len=0;
> -	__u8 *pe_data=NULL, *pe_name=NULL;
> -	__u32 opt_flags=0;
> -	int retc=0;
> +	unsigned int af, state, pe_data_len = 0, pe_name_len = 0;
> +	__u8 *pe_data = NULL, *pe_name = NULL;
> +	__u32 opt_flags = 0;
> +	int retc = 0;
>  
>  	s = (union ip_vs_sync_conn *) p;
>  
> @@ -1089,7 +1089,7 @@ static inline int ip_vs_proc_sync_conn(struct netns_ipvs *ipvs, __u8 *p, __u8 *m
>  		af = AF_INET6;
>  		p += sizeof(struct ip_vs_sync_v6);
>  #else
> -		IP_VS_DBG(3,"BACKUP, IPv6 msg received, and IPVS is not compiled for IPv6\n");
> +		IP_VS_DBG(3, "BACKUP, IPv6 msg received, and IPVS is not compiled for IPv6\n");
>  		retc = 10;
>  		goto out;
>  #endif
> @@ -1129,7 +1129,7 @@ static inline int ip_vs_proc_sync_conn(struct netns_ipvs *ipvs, __u8 *p, __u8 *m
>  			break;
>  
>  		case IPVS_OPT_PE_NAME:
> -			if (ip_vs_proc_str(p, plen,&pe_name_len, &pe_name,
> +			if (ip_vs_proc_str(p, plen, &pe_name_len, &pe_name,
>  					   IP_VS_PENAME_MAXLEN, &opt_flags,
>  					   IPVS_OPT_F_PE_NAME))
>  				return -70;
> @@ -1155,7 +1155,7 @@ static inline int ip_vs_proc_sync_conn(struct netns_ipvs *ipvs, __u8 *p, __u8 *m
>  	if (!(flags & IP_VS_CONN_F_TEMPLATE)) {
>  		pp = ip_vs_proto_get(s->v4.protocol);
>  		if (!pp) {
> -			IP_VS_DBG(3,"BACKUP, Unsupported protocol %u\n",
> +			IP_VS_DBG(3, "BACKUP, Unsupported protocol %u\n",
>  				s->v4.protocol);
>  			retc = 30;
>  			goto out;
> @@ -1232,7 +1232,7 @@ static void ip_vs_process_message(struct netns_ipvs *ipvs, __u8 *buffer,
>  		msg_end = buffer + sizeof(struct ip_vs_sync_mesg);
>  		nr_conns = m2->nr_conns;
>  
> -		for (i=0; i<nr_conns; i++) {
> +		for (i = 0; i < nr_conns; i++) {
>  			union ip_vs_sync_conn *s;
>  			unsigned int size;
>  			int retc;
> @@ -1444,7 +1444,7 @@ static int bind_mcastif_addr(struct socket *sock, struct net_device *dev)
>  	sin.sin_addr.s_addr  = addr;
>  	sin.sin_port         = 0;

I think you missed this one.
should be
-        sin.sin_port         = 0;
+	 sin.sin_port = 0

Thanks and Cheers,
Suraj Upadhyay.

> -	return sock->ops->bind(sock, (struct sockaddr*)&sin, sizeof(sin));
> +	return sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
>  }
>  
>  static void get_mcast_sockaddr(union ipvs_sockaddr *sa, int *salen,
> -- 
> 2.6.1.windows.1
> 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* 答复: [PATCH v2] ipvs: clean code for ip_vs_sync.c
  2020-07-16  2:58 ` Suraj Upadhyay
@ 2020-07-16  2:59   ` Zhouxudong (EulerOS)
  2020-07-16 10:23     ` Dan Carpenter
  0 siblings, 1 reply; 4+ messages in thread
From: Zhouxudong (EulerOS) @ 2020-07-16  2:59 UTC (permalink / raw)
  To: Suraj Upadhyay
  Cc: wensong@linux-vs.org, horms@verge.net.au, netdev@vger.kernel.org,
	lvs-devel@vger.kernel.org, kernel-janitors@vger.kernel.org,
	Chenxiang (EulerOS), Zhaowei (EulerOS)

VGhhbmsgeW91IGZvciBzdWdnZXN0aW9uLg0KSSB3aWxsIHNlbmQgdjMgcGF0Y2guDQoNCi0tLS0t
08q8/tStvP4tLS0tLQ0Kt6K8/sjLOiBTdXJhaiBVcGFkaHlheSBbbWFpbHRvOnVzdXJhajM1QGdt
YWlsLmNvbV0gDQq3osvNyrG85DogMjAyMMTqN9TCMTbI1SAxMDo0Ng0KytW8/sjLOiBaaG91eHVk
b25nIChFdWxlck9TKSA8emhvdXh1ZG9uZzhAaHVhd2VpLmNvbT4NCrOty806IHdlbnNvbmdAbGlu
dXgtdnMub3JnOyBob3Jtc0B2ZXJnZS5uZXQuYXU7IG5ldGRldkB2Z2VyLmtlcm5lbC5vcmc7IGx2
cy1kZXZlbEB2Z2VyLmtlcm5lbC5vcmc7IGtlcm5lbC1qYW5pdG9yc0B2Z2VyLmtlcm5lbC5vcmc7
IENoZW54aWFuZyAoRXVsZXJPUykgPHJvc2UuY2hlbkBodWF3ZWkuY29tPjsgWmhhb3dlaSAoRXVs
ZXJPUykgPHpoYW93ZWkyM0BodWF3ZWkuY29tPg0K1vfM4jogUmU6IFtQQVRDSCB2Ml0gaXB2czog
Y2xlYW4gY29kZSBmb3IgaXBfdnNfc3luYy5jDQoNCk9uIFRodSwgSnVsIDE2LCAyMDIwIGF0IDAx
OjU3OjUxQU0gKzAwMDAsIHpob3V4dWRvbmcxOTkgd3JvdGU6DQo+IHYxIC0+IHYyOg0KPiBhZGQg
bWlzc2luZyBzcGFjZXMgYWZ0ZXIgU2lnbmVkLW9mZi1ieSBhbmQgaXB2czogaW4gdGhlIHN1Ympl
Y3QuIA0KPiBpPTAgY2hhbmdlZCB0byBpID0gMC4gIA0KPg0KDQpZb3Ugc2hvdWxkIHdyaXRlIHRo
ZSB2ZXJzaW9uIGNoYW5nZXMgYWZ0ZXIgIi0tLSIgYW5kIGJlZm9yZSB0aGUgZmlyc3QgZGlmZi4N
Cg0KQWxzbywgbG9va2luZyBhdCB5b3VyIHBhdGNoIEkgdGhpbmsgeW91ciBjb21taXQgbWVzc2Fn
ZSBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgdGhpcyA6DQoNCiJVc2UgYXBwcm9wcmlhdGUgc3Bh
Y2VzIGFyb3VuZCBvcGVyYXRvcnMuIg0KDQo+IFNpZ25lZC1vZmYtYnk6IHpob3V4dWRvbmcxOTkg
PHpob3V4dWRvbmc4QGh1YXdlaS5jb20+DQo+IC0tLQ0KPiAgbmV0L25ldGZpbHRlci9pcHZzL2lw
X3ZzX3N5bmMuYyB8IDE4ICsrKysrKysrKy0tLS0tLS0tLQ0KPiAgMSBmaWxlIGNoYW5nZWQsIDkg
aW5zZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9uZXQvbmV0
ZmlsdGVyL2lwdnMvaXBfdnNfc3luYy5jIA0KPiBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19z
eW5jLmMgaW5kZXggNjA1ZTBmNi4uODg1YmFiNCAxMDA2NDQNCj4gLS0tIGEvbmV0L25ldGZpbHRl
ci9pcHZzL2lwX3ZzX3N5bmMuYw0KPiArKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc3lu
Yy5jDQo+IEBAIC0xMDc3LDEwICsxMDc3LDEwIEBAIHN0YXRpYyBpbmxpbmUgaW50IGlwX3ZzX3By
b2Nfc3luY19jb25uKHN0cnVjdCBuZXRuc19pcHZzICppcHZzLCBfX3U4ICpwLCBfX3U4ICptDQo+
ICAJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsNCj4gIAlzdHJ1Y3QgaXBfdnNfY29ubl9wYXJh
bSBwYXJhbTsNCj4gIAlfX3UzMiBmbGFnczsNCj4gLQl1bnNpZ25lZCBpbnQgYWYsIHN0YXRlLCBw
ZV9kYXRhX2xlbj0wLCBwZV9uYW1lX2xlbj0wOw0KPiAtCV9fdTggKnBlX2RhdGE9TlVMTCwgKnBl
X25hbWU9TlVMTDsNCj4gLQlfX3UzMiBvcHRfZmxhZ3M9MDsNCj4gLQlpbnQgcmV0Yz0wOw0KPiAr
CXVuc2lnbmVkIGludCBhZiwgc3RhdGUsIHBlX2RhdGFfbGVuID0gMCwgcGVfbmFtZV9sZW4gPSAw
Ow0KPiArCV9fdTggKnBlX2RhdGEgPSBOVUxMLCAqcGVfbmFtZSA9IE5VTEw7DQo+ICsJX191MzIg
b3B0X2ZsYWdzID0gMDsNCj4gKwlpbnQgcmV0YyA9IDA7DQo+ICANCj4gIAlzID0gKHVuaW9uIGlw
X3ZzX3N5bmNfY29ubiAqKSBwOw0KPiAgDQo+IEBAIC0xMDg5LDcgKzEwODksNyBAQCBzdGF0aWMg
aW5saW5lIGludCBpcF92c19wcm9jX3N5bmNfY29ubihzdHJ1Y3QgbmV0bnNfaXB2cyAqaXB2cywg
X191OCAqcCwgX191OCAqbQ0KPiAgCQlhZiA9IEFGX0lORVQ2Ow0KPiAgCQlwICs9IHNpemVvZihz
dHJ1Y3QgaXBfdnNfc3luY192Nik7DQo+ICAjZWxzZQ0KPiAtCQlJUF9WU19EQkcoMywiQkFDS1VQ
LCBJUHY2IG1zZyByZWNlaXZlZCwgYW5kIElQVlMgaXMgbm90IGNvbXBpbGVkIGZvciBJUHY2XG4i
KTsNCj4gKwkJSVBfVlNfREJHKDMsICJCQUNLVVAsIElQdjYgbXNnIHJlY2VpdmVkLCBhbmQgSVBW
UyBpcyBub3QgY29tcGlsZWQgDQo+ICtmb3IgSVB2NlxuIik7DQo+ICAJCXJldGMgPSAxMDsNCj4g
IAkJZ290byBvdXQ7DQo+ICAjZW5kaWYNCj4gQEAgLTExMjksNyArMTEyOSw3IEBAIHN0YXRpYyBp
bmxpbmUgaW50IGlwX3ZzX3Byb2Nfc3luY19jb25uKHN0cnVjdCBuZXRuc19pcHZzICppcHZzLCBf
X3U4ICpwLCBfX3U4ICptDQo+ICAJCQlicmVhazsNCj4gIA0KPiAgCQljYXNlIElQVlNfT1BUX1BF
X05BTUU6DQo+IC0JCQlpZiAoaXBfdnNfcHJvY19zdHIocCwgcGxlbiwmcGVfbmFtZV9sZW4sICZw
ZV9uYW1lLA0KPiArCQkJaWYgKGlwX3ZzX3Byb2Nfc3RyKHAsIHBsZW4sICZwZV9uYW1lX2xlbiwg
JnBlX25hbWUsDQo+ICAJCQkJCSAgIElQX1ZTX1BFTkFNRV9NQVhMRU4sICZvcHRfZmxhZ3MsDQo+
ICAJCQkJCSAgIElQVlNfT1BUX0ZfUEVfTkFNRSkpDQo+ICAJCQkJcmV0dXJuIC03MDsNCj4gQEAg
LTExNTUsNyArMTE1NSw3IEBAIHN0YXRpYyBpbmxpbmUgaW50IGlwX3ZzX3Byb2Nfc3luY19jb25u
KHN0cnVjdCBuZXRuc19pcHZzICppcHZzLCBfX3U4ICpwLCBfX3U4ICptDQo+ICAJaWYgKCEoZmxh
Z3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUpKSB7DQo+ICAJCXBwID0gaXBfdnNfcHJvdG9fZ2V0
KHMtPnY0LnByb3RvY29sKTsNCj4gIAkJaWYgKCFwcCkgew0KPiAtCQkJSVBfVlNfREJHKDMsIkJB
Q0tVUCwgVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJXVcbiIsDQo+ICsJCQlJUF9WU19EQkcoMywgIkJB
Q0tVUCwgVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJXVcbiIsDQo+ICAJCQkJcy0+djQucHJvdG9jb2wp
Ow0KPiAgCQkJcmV0YyA9IDMwOw0KPiAgCQkJZ290byBvdXQ7DQo+IEBAIC0xMjMyLDcgKzEyMzIs
NyBAQCBzdGF0aWMgdm9pZCBpcF92c19wcm9jZXNzX21lc3NhZ2Uoc3RydWN0IG5ldG5zX2lwdnMg
KmlwdnMsIF9fdTggKmJ1ZmZlciwNCj4gIAkJbXNnX2VuZCA9IGJ1ZmZlciArIHNpemVvZihzdHJ1
Y3QgaXBfdnNfc3luY19tZXNnKTsNCj4gIAkJbnJfY29ubnMgPSBtMi0+bnJfY29ubnM7DQo+ICAN
Cj4gLQkJZm9yIChpPTA7IGk8bnJfY29ubnM7IGkrKykgew0KPiArCQlmb3IgKGkgPSAwOyBpIDwg
bnJfY29ubnM7IGkrKykgew0KPiAgCQkJdW5pb24gaXBfdnNfc3luY19jb25uICpzOw0KPiAgCQkJ
dW5zaWduZWQgaW50IHNpemU7DQo+ICAJCQlpbnQgcmV0YzsNCj4gQEAgLTE0NDQsNyArMTQ0NCw3
IEBAIHN0YXRpYyBpbnQgYmluZF9tY2FzdGlmX2FkZHIoc3RydWN0IHNvY2tldCAqc29jaywgc3Ry
dWN0IG5ldF9kZXZpY2UgKmRldikNCj4gIAlzaW4uc2luX2FkZHIuc19hZGRyICA9IGFkZHI7DQo+
ICAJc2luLnNpbl9wb3J0ICAgICAgICAgPSAwOw0KDQpJIHRoaW5rIHlvdSBtaXNzZWQgdGhpcyBv
bmUuDQpzaG91bGQgYmUNCi0gICAgICAgIHNpbi5zaW5fcG9ydCAgICAgICAgID0gMDsNCisJIHNp
bi5zaW5fcG9ydCA9IDANCg0KVGhhbmtzIGFuZCBDaGVlcnMsDQpTdXJhaiBVcGFkaHlheS4NCg0K
PiAtCXJldHVybiBzb2NrLT5vcHMtPmJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciopJnNpbiwg
c2l6ZW9mKHNpbikpOw0KPiArCXJldHVybiBzb2NrLT5vcHMtPmJpbmQoc29jaywgKHN0cnVjdCBz
b2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKTsNCj4gIH0NCj4gIA0KPiAgc3RhdGljIHZvaWQg
Z2V0X21jYXN0X3NvY2thZGRyKHVuaW9uIGlwdnNfc29ja2FkZHIgKnNhLCBpbnQgKnNhbGVuLA0K
PiAtLQ0KPiAyLjYuMS53aW5kb3dzLjENCj4gDQo+IA0K

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: 答复: [PATCH v2] ipvs: clean code for ip_vs_sync.c
  2020-07-16  2:59   ` 答复: " Zhouxudong (EulerOS)
@ 2020-07-16 10:23     ` Dan Carpenter
  0 siblings, 0 replies; 4+ messages in thread
From: Dan Carpenter @ 2020-07-16 10:23 UTC (permalink / raw)
  To: Zhouxudong (EulerOS)
  Cc: Suraj Upadhyay, wensong@linux-vs.org, horms@verge.net.au,
	netdev@vger.kernel.org, lvs-devel@vger.kernel.org,
	kernel-janitors@vger.kernel.org, Chenxiang (EulerOS),
	Zhaowei (EulerOS)

It's probably better to start somewhere like drivers/staging for clean
up work.  Networking people are pretty busy with their own things but
staging is happy to take clean up patches.

You need to use a proper legal name (like you would for signing
documents for your From and Signed-off-by.

> > @@ -1444,7 +1444,7 @@ static int bind_mcastif_addr(struct socket *sock, struct net_device *dev)
> >  	sin.sin_addr.s_addr  = addr;
> >  	sin.sin_port         = 0;
> 
> I think you missed this one.
> should be
> -        sin.sin_port         = 0;
> +	 sin.sin_port = 0

That was done deliberately.  Just leave that one as-is, please.

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-07-16 10:23 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-07-16  1:57 [PATCH v2] ipvs: clean code for ip_vs_sync.c zhouxudong199
2020-07-16  2:58 ` Suraj Upadhyay
2020-07-16  2:59   ` 答复: " Zhouxudong (EulerOS)
2020-07-16 10:23     ` Dan Carpenter

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).