selinux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] wrap char*** for user_get_roles()
@ 2005-11-28 19:13 Joshua Brindle
  2005-11-28 19:27 ` Daniel J Walsh
  0 siblings, 1 reply; 4+ messages in thread
From: Joshua Brindle @ 2005-11-28 19:13 UTC (permalink / raw)
  To: Daniel J Walsh; +Cc: Stephen Smalley, SELinux List

This adds wrappers for char*** so that semanage_user_get_roles will
work. I added the test to the user test (-u), please let me know if
there are any issues with this.


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

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

* Re: [PATCH] wrap char*** for user_get_roles()
  2005-11-28 19:13 [PATCH] wrap char*** for user_get_roles() Joshua Brindle
@ 2005-11-28 19:27 ` Daniel J Walsh
  2005-11-28 19:29   ` Joshua Brindle
  0 siblings, 1 reply; 4+ messages in thread
From: Daniel J Walsh @ 2005-11-28 19:27 UTC (permalink / raw)
  To: Joshua Brindle; +Cc: Stephen Smalley, SELinux List

Joshua Brindle wrote:
> This adds wrappers for char*** so that semanage_user_get_roles will
> work. I added the test to the user test (-u), please let me know if
> there are any issues with this.
>
>   
No patch attached.

-- 



--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

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

* Re: [PATCH] wrap char*** for user_get_roles()
  2005-11-28 19:27 ` Daniel J Walsh
@ 2005-11-28 19:29   ` Joshua Brindle
  2005-11-28 20:00     ` Stephen Smalley
  0 siblings, 1 reply; 4+ messages in thread
From: Joshua Brindle @ 2005-11-28 19:29 UTC (permalink / raw)
  To: Daniel J Walsh; +Cc: Stephen Smalley, SELinux List

[-- Attachment #1: Type: text/plain, Size: 303 bytes --]

On Mon, 2005-11-28 at 14:27 -0500, Daniel J Walsh wrote:
> Joshua Brindle wrote:
> > This adds wrappers for char*** so that semanage_user_get_roles will
> > work. I added the test to the user test (-u), please let me know if
> > there are any issues with this.
> >
> >   
> No patch attached.
> 

oops.

[-- Attachment #2: wrap-char-for-roles.patch --]
[-- Type: text/x-patch, Size: 14463 bytes --]

diff -purN -x .svn trunk/libsemanage/src/pywrap-test.py branch/swigifymore/libsemanage/src/pywrap-test.py
--- trunk/libsemanage/src/pywrap-test.py	2005-11-28 13:44:37.000000000 -0500
+++ branch/swigifymore/libsemanage/src/pywrap-test.py	2005-11-28 13:41:56.000000000 -0500
@@ -98,6 +98,7 @@ class Tests:
 		print "User list size: ", list_size
 		if self.verbose: print "List reference: ",  list
 
+
 		if (list_size == 0):
 			print "No users found!"
 			print "This is not necessarily a test failure."
@@ -110,6 +111,10 @@ class Tests:
 			print "   User mls range: ", semanage.semanage_user_get_mlsrange(user)
 			print "   User number of roles: ", semanage.semanage_user_get_num_roles(user)
 			print "   User default role: ", semanage.semanage_user_get_defrole(user)
+			print "   User roles: "
+			(status, rlist, rlist_size) = semanage.semanage_user_get_roles(sh, user)
+			for ridx in range (rlist_size):
+				print "      ", semanage.char_by_idx(rlist, ridx) 
 
 	def test_writeuser(self,sh):
                 print "Testing user write..."
diff -purN -x .svn trunk/libsemanage/src/semanage.py branch/swigifymore/libsemanage/src/semanage.py
--- trunk/libsemanage/src/semanage.py	2005-11-28 13:44:37.000000000 -0500
+++ branch/swigifymore/libsemanage/src/semanage.py	2005-11-28 13:41:56.000000000 -0500
@@ -43,6 +43,8 @@ semanage_seuser_by_idx = _semanage.seman
 
 semanage_port_by_idx = _semanage.semanage_port_by_idx
 
+char_by_idx = _semanage.char_by_idx
+
 semanage_bool_key_create = _semanage.semanage_bool_key_create
 
 semanage_bool_key_extract = _semanage.semanage_bool_key_extract
Binary files trunk/libsemanage/src/semanage.pyc and branch/swigifymore/libsemanage/src/semanage.pyc differ
diff -purN -x .svn trunk/libsemanage/src/semanageswig.i branch/swigifymore/libsemanage/src/semanageswig.i
--- trunk/libsemanage/src/semanageswig.i	2005-11-28 13:44:37.000000000 -0500
+++ branch/swigifymore/libsemanage/src/semanageswig.i	2005-11-28 13:41:56.000000000 -0500
@@ -44,18 +44,19 @@
 	#include "semanage/ports_policy.h"
 %}
 
-%include <carrays.i>
-
 %inline {
-	semanage_user_t *semanage_user_by_idx(semanage_user_t **list, int n){
+	semanage_user_t *semanage_user_by_idx(semanage_user_t **list, int n) {
 		return list[n];
 	}	
-	semanage_seuser_t *semanage_seuser_by_idx(semanage_seuser_t **list, int n){
+	semanage_seuser_t *semanage_seuser_by_idx(semanage_seuser_t **list, int n) {
 		return list[n];
 	}	
-	semanage_port_t *semanage_port_by_idx(semanage_port_t **list, int n){
+	semanage_port_t *semanage_port_by_idx(semanage_port_t **list, int n) {
 		return list[n];
 	}	
+	char *char_by_idx(char **list, int n) {
+		return list[n];
+	}
 }
 
 
@@ -68,6 +69,14 @@
 %apply int *OUTPUT { int * };
 %apply int *OUTPUT { size_t * };
 
+%typemap(in, numinputs=0) char ***(char **temp) {
+	$1 = &temp;
+}
+
+%typemap(argout) char*** {
+	$result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_char, 0));
+}
+
 /** module typemaps**/
 
 /* the wrapper will setup this parameter for passing... the resulting python functions
diff -purN -x .svn trunk/libsemanage/src/semanageswig_wrap.c branch/swigifymore/libsemanage/src/semanageswig_wrap.c
--- trunk/libsemanage/src/semanageswig_wrap.c	2005-11-28 13:44:37.000000000 -0500
+++ branch/swigifymore/libsemanage/src/semanageswig_wrap.c	2005-11-28 13:41:56.000000000 -0500
@@ -1323,9 +1323,9 @@ SWIG_Python_GetTypeList() {
 
 #define  SWIGTYPE_p_f_p_struct_semanage_bool_p_void__int swig_types[0] 
 #define  SWIGTYPE_p_f_p_struct_semanage_iface_p_void__int swig_types[1] 
-#define  SWIGTYPE_p_p_char swig_types[2] 
-#define  SWIGTYPE_p_p_p_char swig_types[3] 
-#define  SWIGTYPE_p_char swig_types[4] 
+#define  SWIGTYPE_p_p_p_char swig_types[2] 
+#define  SWIGTYPE_p_char swig_types[3] 
+#define  SWIGTYPE_p_p_char swig_types[4] 
 #define  SWIGTYPE_p_f_p_struct_semanage_user_p_void__int swig_types[5] 
 #define  SWIGTYPE_p_f_p_struct_semanage_seuser_p_void__int swig_types[6] 
 #define  SWIGTYPE_p_p_semanage_port_t swig_types[7] 
@@ -1334,8 +1334,8 @@ SWIG_Python_GetTypeList() {
 #define  SWIGTYPE_p_semanage_seuser swig_types[10] 
 #define  SWIGTYPE_p_p_p_semanage_seuser swig_types[11] 
 #define  SWIGTYPE_p_p_p_semanage_bool swig_types[12] 
-#define  SWIGTYPE_p_semanage_bool swig_types[13] 
-#define  SWIGTYPE_p_p_semanage_bool swig_types[14] 
+#define  SWIGTYPE_p_p_semanage_bool swig_types[13] 
+#define  SWIGTYPE_p_semanage_bool swig_types[14] 
 #define  SWIGTYPE_p_p_semanage_user swig_types[15] 
 #define  SWIGTYPE_p_semanage_user swig_types[16] 
 #define  SWIGTYPE_p_size_t swig_types[17] 
@@ -1397,15 +1397,18 @@ static swig_type_info *swig_types[41];
 	#include "semanage/ports_policy.h"
 
 
-	semanage_user_t *semanage_user_by_idx(semanage_user_t **list, int n){
+	semanage_user_t *semanage_user_by_idx(semanage_user_t **list, int n) {
 		return list[n];
 	}	
-	semanage_seuser_t *semanage_seuser_by_idx(semanage_seuser_t **list, int n){
+	semanage_seuser_t *semanage_seuser_by_idx(semanage_seuser_t **list, int n) {
 		return list[n];
 	}	
-	semanage_port_t *semanage_port_by_idx(semanage_port_t **list, int n){
+	semanage_port_t *semanage_port_by_idx(semanage_port_t **list, int n) {
 		return list[n];
 	}	
+	char *char_by_idx(char **list, int n) {
+		return list[n];
+	}
 
 
 #include <limits.h>
@@ -1508,6 +1511,27 @@ SWIG_Check_int(PyObject* obj)
   return SWIG_AsVal_int(obj, (int*)0);
 }
 
+
+SWIGINTERN PyObject *
+SWIG_FromCharPtr(const char* cptr)
+{ 
+  if (cptr) {
+    size_t size = strlen(cptr);
+    if (size > INT_MAX) {
+      return SWIG_NewPointerObj((char*)(cptr), 
+				SWIG_TypeQuery("char *"), 0);
+    } else {
+      if (size != 0) {
+	return PyString_FromStringAndSize(cptr, size);
+      } else {
+	return PyString_FromString(cptr);
+      }
+    }
+  }
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
 int semanage_bool_key_create(semanage_handle_t *,char const *,semanage_bool_key_t **);
 
 /* returns SWIG_OLDOBJ if the input is a raw char*, SWIG_PYSTR if is a PyString */
@@ -1562,27 +1586,6 @@ int semanage_bool_key_extract(semanage_h
 void semanage_bool_key_free(semanage_bool_key_t *);
 int semanage_bool_compare(semanage_bool_t *,semanage_bool_key_t *);
 char const *semanage_bool_get_name(semanage_bool_t *);
-
-SWIGINTERN PyObject *
-SWIG_FromCharPtr(const char* cptr)
-{ 
-  if (cptr) {
-    size_t size = strlen(cptr);
-    if (size > INT_MAX) {
-      return SWIG_NewPointerObj((char*)(cptr), 
-				SWIG_TypeQuery("char *"), 0);
-    } else {
-      if (size != 0) {
-	return PyString_FromStringAndSize(cptr, size);
-      } else {
-	return PyString_FromString(cptr);
-      }
-    }
-  }
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
 int semanage_bool_set_name(semanage_handle_t *,semanage_bool_t *,char const *);
 int semanage_bool_get_value(semanage_bool_t *);
 void semanage_bool_set_value(semanage_bool_t *,int);
@@ -1847,6 +1850,30 @@ static PyObject *_wrap_semanage_port_by_
 }
 
 
+static PyObject *_wrap_char_by_idx(PyObject *self, PyObject *args) {
+    PyObject *resultobj;
+    char **arg1 = (char **) 0 ;
+    int arg2 ;
+    char *result;
+    PyObject * obj0 = 0 ;
+    PyObject * obj1 = 0 ;
+    
+    if(!PyArg_ParseTuple(args,(char *)"OO:char_by_idx",&obj0,&obj1)) goto fail;
+    SWIG_Python_ConvertPtr(obj0, (void **)&arg1, SWIGTYPE_p_p_char, SWIG_POINTER_EXCEPTION | 0);
+    if (SWIG_arg_fail(1)) SWIG_fail;
+    {
+        arg2 = (int)(SWIG_As_int(obj1)); 
+        if (SWIG_arg_fail(2)) SWIG_fail;
+    }
+    result = (char *)char_by_idx(arg1,arg2);
+    
+    resultobj = SWIG_FromCharPtr(result);
+    return resultobj;
+    fail:
+    return NULL;
+}
+
+
 static PyObject *_wrap_semanage_bool_key_create(PyObject *self, PyObject *args) {
     PyObject *resultobj;
     semanage_handle_t *arg1 = (semanage_handle_t *) 0 ;
@@ -3417,25 +3444,29 @@ static PyObject *_wrap_semanage_user_get
     char ***arg3 = (char ***) 0 ;
     size_t *arg4 = (size_t *) 0 ;
     int result;
+    char **temp3 ;
     size_t temp4 ;
     int res4 = 0 ;
     PyObject * obj0 = 0 ;
     PyObject * obj1 = 0 ;
-    PyObject * obj2 = 0 ;
     
+    {
+        arg3 = &temp3;
+    }
     arg4 = &temp4; res4 = SWIG_NEWOBJ;
-    if(!PyArg_ParseTuple(args,(char *)"OOO:semanage_user_get_roles",&obj0,&obj1,&obj2)) goto fail;
+    if(!PyArg_ParseTuple(args,(char *)"OO:semanage_user_get_roles",&obj0,&obj1)) goto fail;
     SWIG_Python_ConvertPtr(obj0, (void **)&arg1, SWIGTYPE_p_semanage_handle, SWIG_POINTER_EXCEPTION | 0);
     if (SWIG_arg_fail(1)) SWIG_fail;
     SWIG_Python_ConvertPtr(obj1, (void **)&arg2, SWIGTYPE_p_semanage_user, SWIG_POINTER_EXCEPTION | 0);
     if (SWIG_arg_fail(2)) SWIG_fail;
-    SWIG_Python_ConvertPtr(obj2, (void **)&arg3, SWIGTYPE_p_p_p_char, SWIG_POINTER_EXCEPTION | 0);
-    if (SWIG_arg_fail(3)) SWIG_fail;
     result = (int)semanage_user_get_roles(arg1,arg2,(char const ***)arg3,arg4);
     
     {
         resultobj = SWIG_From_int((int)(result)); 
     }
+    {
+        resultobj = t_output_helper(resultobj, SWIG_NewPointerObj(*arg3, SWIGTYPE_p_p_char, 0));
+    }
     resultobj = t_output_helper(resultobj, ((res4 == SWIG_NEWOBJ) ?
     SWIG_From_int((*arg4)) : SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_size_t, 0)));
     return resultobj;
@@ -5552,6 +5583,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"semanage_user_by_idx", _wrap_semanage_user_by_idx, METH_VARARGS, NULL},
 	 { (char *)"semanage_seuser_by_idx", _wrap_semanage_seuser_by_idx, METH_VARARGS, NULL},
 	 { (char *)"semanage_port_by_idx", _wrap_semanage_port_by_idx, METH_VARARGS, NULL},
+	 { (char *)"char_by_idx", _wrap_char_by_idx, METH_VARARGS, NULL},
 	 { (char *)"semanage_bool_key_create", _wrap_semanage_bool_key_create, METH_VARARGS, NULL},
 	 { (char *)"semanage_bool_key_extract", _wrap_semanage_bool_key_extract, METH_VARARGS, NULL},
 	 { (char *)"semanage_bool_key_free", _wrap_semanage_bool_key_free, METH_VARARGS, NULL},
@@ -5705,9 +5737,9 @@ static PyMethodDef SwigMethods[] = {
 
 static swig_type_info _swigt__p_f_p_struct_semanage_bool_p_void__int[] = {{"_p_f_p_struct_semanage_bool_p_void__int", 0, "int (*)(struct semanage_bool *,void *)|int (*)(semanage_bool_t *,void *)", 0, 0, 0, 0},{"_p_f_p_struct_semanage_bool_p_void__int", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_f_p_struct_semanage_iface_p_void__int[] = {{"_p_f_p_struct_semanage_iface_p_void__int", 0, "int (*)(struct semanage_iface *,void *)|int (*)(semanage_iface_t *,void *)", 0, 0, 0, 0},{"_p_f_p_struct_semanage_iface_p_void__int", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
-static swig_type_info _swigt__p_p_char[] = {{"_p_p_char", 0, "char **", 0, 0, 0, 0},{"_p_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_p_p_char[] = {{"_p_p_p_char", 0, "char ***", 0, 0, 0, 0},{"_p_p_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_char[] = {{"_p_char", 0, "char *", 0, 0, 0, 0},{"_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
+static swig_type_info _swigt__p_p_char[] = {{"_p_p_char", 0, "char **", 0, 0, 0, 0},{"_p_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_f_p_struct_semanage_user_p_void__int[] = {{"_p_f_p_struct_semanage_user_p_void__int", 0, "int (*)(struct semanage_user *,void *)|int (*)(semanage_user_t *,void *)", 0, 0, 0, 0},{"_p_f_p_struct_semanage_user_p_void__int", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_f_p_struct_semanage_seuser_p_void__int[] = {{"_p_f_p_struct_semanage_seuser_p_void__int", 0, "int (*)(struct semanage_seuser *,void *)|int (*)(semanage_seuser_t *,void *)", 0, 0, 0, 0},{"_p_f_p_struct_semanage_seuser_p_void__int", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_p_semanage_port_t[] = {{"_p_p_semanage_port_t", 0, "semanage_port_t **", 0, 0, 0, 0},{"_p_p_semanage_port_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
@@ -5716,8 +5748,8 @@ static swig_type_info _swigt__p_p_semana
 static swig_type_info _swigt__p_semanage_seuser[] = {{"_p_semanage_seuser", 0, "struct semanage_seuser *|semanage_seuser_t *", 0, 0, 0, 0},{"_p_semanage_seuser", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_p_p_semanage_seuser[] = {{"_p_p_p_semanage_seuser", 0, "struct semanage_seuser ***|semanage_seuser_t ***", 0, 0, 0, 0},{"_p_p_p_semanage_seuser", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_p_p_semanage_bool[] = {{"_p_p_p_semanage_bool", 0, "struct semanage_bool ***|semanage_bool_t ***", 0, 0, 0, 0},{"_p_p_p_semanage_bool", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
-static swig_type_info _swigt__p_semanage_bool[] = {{"_p_semanage_bool", 0, "struct semanage_bool *|semanage_bool_t *", 0, 0, 0, 0},{"_p_semanage_bool", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_p_semanage_bool[] = {{"_p_p_semanage_bool", 0, "struct semanage_bool **|semanage_bool_t **", 0, 0, 0, 0},{"_p_p_semanage_bool", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
+static swig_type_info _swigt__p_semanage_bool[] = {{"_p_semanage_bool", 0, "struct semanage_bool *|semanage_bool_t *", 0, 0, 0, 0},{"_p_semanage_bool", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_p_semanage_user[] = {{"_p_p_semanage_user", 0, "struct semanage_user **|semanage_user_t **", 0, 0, 0, 0},{"_p_p_semanage_user", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_semanage_user[] = {{"_p_semanage_user", 0, "struct semanage_user *|semanage_user_t *", 0, 0, 0, 0},{"_p_semanage_user", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
 static swig_type_info _swigt__p_size_t[] = {{"_p_size_t", 0, "size_t *", 0, 0, 0, 0},{"_p_size_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}};
@@ -5747,9 +5779,9 @@ static swig_type_info _swigt__p_semanage
 static swig_type_info *swig_types_initial[] = {
 _swigt__p_f_p_struct_semanage_bool_p_void__int, 
 _swigt__p_f_p_struct_semanage_iface_p_void__int, 
-_swigt__p_p_char, 
 _swigt__p_p_p_char, 
 _swigt__p_char, 
+_swigt__p_p_char, 
 _swigt__p_f_p_struct_semanage_user_p_void__int, 
 _swigt__p_f_p_struct_semanage_seuser_p_void__int, 
 _swigt__p_p_semanage_port_t, 
@@ -5758,8 +5790,8 @@ _swigt__p_p_semanage_seuser, 
 _swigt__p_semanage_seuser, 
 _swigt__p_p_p_semanage_seuser, 
 _swigt__p_p_p_semanage_bool, 
-_swigt__p_semanage_bool, 
 _swigt__p_p_semanage_bool, 
+_swigt__p_semanage_bool, 
 _swigt__p_p_semanage_user, 
 _swigt__p_semanage_user, 
 _swigt__p_size_t, 

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

* Re: [PATCH] wrap char*** for user_get_roles()
  2005-11-28 19:29   ` Joshua Brindle
@ 2005-11-28 20:00     ` Stephen Smalley
  0 siblings, 0 replies; 4+ messages in thread
From: Stephen Smalley @ 2005-11-28 20:00 UTC (permalink / raw)
  To: Joshua Brindle; +Cc: Daniel J Walsh, SELinux List

On Mon, 2005-11-28 at 14:29 -0500, Joshua Brindle wrote:
> On Mon, 2005-11-28 at 14:27 -0500, Daniel J Walsh wrote:
> > Joshua Brindle wrote:
> > > This adds wrappers for char*** so that semanage_user_get_roles will
> > > work. I added the test to the user test (-u), please let me know if
> > > there are any issues with this.
> > >
> > >   
> > No patch attached.
> > 
> 
> oops.

Thanks, merged.  

-- 
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

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

end of thread, other threads:[~2005-11-28 20:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-11-28 19:13 [PATCH] wrap char*** for user_get_roles() Joshua Brindle
2005-11-28 19:27 ` Daniel J Walsh
2005-11-28 19:29   ` Joshua Brindle
2005-11-28 20:00     ` Stephen Smalley

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