* [ SEMANAGE ] Stub record handlers
@ 2005-09-20 8:59 Ivan Gyurdiev
2005-09-20 9:22 ` [ SEMANAGE ] Fix record handlers, add status codes Ivan Gyurdiev
2005-09-21 14:41 ` [ SEMANAGE ] Stub record handlers Stephen Smalley
0 siblings, 2 replies; 6+ messages in thread
From: Ivan Gyurdiev @ 2005-09-20 8:59 UTC (permalink / raw)
To: selinux
[-- Attachment #1: Type: text/plain, Size: 128 bytes --]
The attached patch stubs out most of the record handlers, and has the
dbase_* routines fill out parts of the config structure.
[-- Attachment #2: libsemanage.record_handlers.stub.diff --]
[-- Type: text/x-patch, Size: 8695 bytes --]
diff -Naur libsemanage.new/src/database_file.c libsemanage/src/database_file.c
--- libsemanage.new/src/database_file.c 2005-09-20 02:55:29.000000000 -0400
+++ libsemanage/src/database_file.c 2005-09-20 04:51:20.000000000 -0400
@@ -2,6 +2,7 @@
#include <stddef.h>
#include "database.h"
#include "record_file.h"
+#include "record_file_handlers.h"
#include "users_file.h"
#include "ports_file.h"
@@ -42,11 +43,23 @@
record_t data) {
iterate_config_t config;
+ record_add_arg_t handler_arg;
+
+ handler_arg.rtable = dconfig->rtable;
+ handler_arg.key = key;
+ handler_arg.data = data;
+ /* handler_arg.derr_fatal = */
+
config.rtable = dconfig->rtable;
+ /* config.filename = */
+ /* config.parse_arg = */
+ /* config.perr_fatal = */
+ config.modify = 1;
+ config.handler = record_add;
+ config.handler_arg = &handler_arg;
+ /* config.merr_fatal = */
/* Stub */
- key = NULL;
- data = NULL;
return -1;
}
@@ -56,11 +69,23 @@
record_t data) {
iterate_config_t config;
+ record_modify_arg_t handler_arg;
+
+ handler_arg.rtable = dconfig->rtable;
+ handler_arg.key = key;
+ handler_arg.data = data;
+ /* handler_arg.merr_fatal = */
+
config.rtable = dconfig->rtable;
+ /* config.filename = */
+ /* config.parse_arg = */
+ /* config.perr_fatal = */
+ config.modify = 1;
+ config.handler = record_modify;
+ config.handler_arg = &handler_arg;
+ /* config.merr_fatal = */
/* Stub */
- key = NULL;
- data = NULL;
return -1;
}
@@ -69,10 +94,21 @@
record_key_t key) {
iterate_config_t config;
+ record_del_arg_t handler_arg;
+
+ handler_arg.rtable = dconfig->rtable;
+ handler_arg.key = key;
+
config.rtable = dconfig->rtable;
-
+ /* config.filename = */
+ /* config.parse_arg = */
+ /* config.perr_fatal = */
+ config.modify = 1;
+ config.handler = record_add;
+ config.handler_arg = &handler_arg;
+ /* config.merr_fatal = */
+
/* Stub */
- key = NULL;
return -1;
}
@@ -82,11 +118,22 @@
record_t* response) {
iterate_config_t config;
+ record_query_arg_t handler_arg;
+
+ handler_arg.rtable = dconfig->rtable;
+ handler_arg.key = key;
+ handler_arg.response = response;
+
config.rtable = dconfig->rtable;
-
+ /* config.filename = */
+ /* config.parse_arg = */
+ /* config.perr_fatal = */
+ config.modify = 0;
+ config.handler = record_add;
+ config.handler_arg = &handler_arg;
+ /* config.merr_fatal = */
+
/* Stub */
- key = NULL;
- response = NULL;
return -1;
}
@@ -96,11 +143,22 @@
int* response) {
iterate_config_t config;
+ record_exists_arg_t handler_arg;
+
+ handler_arg.rtable = dconfig->rtable;
+ handler_arg.key = key;
+ handler_arg.response = response;
+
config.rtable = dconfig->rtable;
-
+ /* config.filename = */
+ /* config.parse_arg = */
+ /* config.perr_fatal = */
+ config.modify = 0;
+ config.handler = record_exists;
+ config.handler_arg = &handler_arg;
+ /* config.merr_fatal = */
+
/* Stub */
- key = NULL;
- response = NULL;
return -1;
}
@@ -109,26 +167,48 @@
int* response) {
iterate_config_t config;
+ record_count_arg_t handler_arg;
+
+ handler_arg.rtable = dconfig->rtable;
+ handler_arg.response = response;
+
config.rtable = dconfig->rtable;
+ /* config.filename = */
+ /* config.parse_arg = */
+ /* config.perr_fatal = */
+ config.modify = 0;
+ config.handler = record_count;
+ config.handler_arg = &handler_arg;
+ /* config.merr_fatal = */
/* Stub */
- response = NULL;
return -1;
}
int dbase_iterate(
dbase_config_t* dconfig,
- int (*handler) (record_key_t key,
- record_t record,
- void* varg),
- void* handler_arg) {
-
- iterate_config_t config;
- config.rtable = dconfig->rtable;
+ int (*fn) (record_key_t key,
+ record_t record,
+ void* varg),
+ void* fn_arg) {
+
+ iterate_config_t config;
+ record_iterate_arg_t handler_arg;
+
+ handler_arg.rtable = dconfig->rtable;
+ handler_arg.fn = fn;
+ handler_arg.fn_arg = fn_arg;
+
+ config.rtable = dconfig->rtable;
+ /* config.filename = */
+ /* config.parse_arg = */
+ /* config.perr_fatal = */
+ config.modify = 0;
+ config.handler = record_iterate;
+ config.handler_arg = &handler_arg;
+ /* config.merr_fatal = */
/* Stub */
- handler = NULL;
- handler_arg = NULL;
return -1;
}
@@ -140,6 +220,13 @@
iterate_config_t config;
config.rtable = dconfig->rtable;
+ /* config.filename = */
+ /* config.parse_arg = */
+ /* config.perr_fatal = */
+ config.modify = 0;
+ /* config.handler = */
+ /* config.handler_arg = */
+ /* config.merr_fatal = */
/* Stub */
keyset = NULL;
diff -Naur libsemanage.new/src/database.h libsemanage/src/database.h
--- libsemanage.new/src/database.h 2005-09-14 11:44:44.000000000 -0400
+++ libsemanage/src/database.h 2005-09-20 04:49:25.000000000 -0400
@@ -47,10 +47,10 @@
extern int dbase_iterate(
dbase_config_t* dconfig,
- int (*handler) (record_key_t key,
- record_t record,
- void* varg),
- void* handler_arg);
+ int (*fn) (record_key_t key,
+ record_t record,
+ void* varg),
+ void* fn_arg);
extern int dbase_list(
dbase_config_t* dconfig,
diff -Naur libsemanage.new/src/record_file_handlers.c libsemanage/src/record_file_handlers.c
--- libsemanage.new/src/record_file_handlers.c 1969-12-31 19:00:00.000000000 -0500
+++ libsemanage/src/record_file_handlers.c 2005-09-20 04:54:00.000000000 -0400
@@ -0,0 +1,71 @@
+#include "record_file.h"
+#include "record_file_handlers.h"
+
+#ifndef RECORD_DEFINED
+typedef void* record_t;
+typedef void* record_key_t;
+#define RECORD_DEFINED
+#endif
+
+int record_query(record_t process_rec, record_t unused, void* varg) {
+
+ /* Stub */
+ process_rec = NULL;
+ unused = NULL;
+ varg = NULL;
+ return RECORD_HANDLER_SIGEXIT;
+}
+
+int record_exists(record_t process_rec, record_t unused, void* varg) {
+
+ /* Stub */
+ process_rec = NULL;
+ unused = NULL;
+ varg = NULL;
+ return RECORD_HANDLER_SIGEXIT;
+}
+
+int record_add(record_t process_rec, record_t* new_rec, void* varg) {
+
+ /* Stub */
+ process_rec = NULL;
+ new_rec = NULL;
+ varg = NULL;
+ return RECORD_HANDLER_SIGEXIT;
+}
+
+int record_modify (record_t process_rec, record_t* new_rec, void* varg) {
+
+ /* Stub */
+ process_rec = NULL;
+ new_rec = NULL;
+ varg = NULL;
+ return RECORD_HANDLER_SIGEXIT;
+}
+
+int record_del(record_t process_rec, record_t* unused, void* varg) {
+
+ /* Stub */
+ process_rec = NULL;
+ unused = NULL;
+ varg = NULL;
+ return RECORD_HANDLER_SIGEXIT;
+}
+
+int record_count(record_t process_rec, record_t* unused, void* varg) {
+
+ /* Stub */
+ process_rec = NULL;
+ unused = NULL;
+ varg = NULL;
+ return RECORD_HANDLER_SIGEXIT;
+}
+
+int record_iterate(record_t process_rec, record_t* unused, void* varg) {
+
+ /* Stub */
+ process_rec = NULL;
+ unused = NULL;
+ varg = NULL;
+ return RECORD_HANDLER_SIGEXIT;
+}
diff -Naur libsemanage.new/src/record_file_handlers.h libsemanage/src/record_file_handlers.h
--- libsemanage.new/src/record_file_handlers.h 1969-12-31 19:00:00.000000000 -0500
+++ libsemanage/src/record_file_handlers.h 2005-09-20 04:53:26.000000000 -0400
@@ -0,0 +1,62 @@
+#ifndef _SEMANAGE_RECORD_FILE_HANDLERS_H_
+#define _SEMANAGE_RECORD_FILE_HANDLERS_H_
+
+#include "record_file.h"
+
+#ifndef RECORD_DEFINED
+typedef void* record_t;
+typedef void* record_key_t;
+#define RECORD_DEFINED
+#endif
+
+typedef struct record_query_arg {
+ record_table_t* rtable;
+ record_key_t key;
+ record_t* response;
+} record_query_arg_t;
+
+typedef struct record_del_arg {
+ record_table_t* rtable;
+ record_key_t key;
+} record_del_arg_t;
+
+typedef struct record_exists_arg {
+ record_table_t* rtable;
+ record_key_t key;
+ int* response;
+} record_exists_arg_t;
+
+typedef struct record_add_arg {
+ record_table_t* rtable;
+ record_key_t key;
+ record_t data;
+ int derr_fatal;
+} record_add_arg_t;
+
+typedef struct record_modify_arg {
+ record_table_t* rtable;
+ record_key_t key;
+ record_t data;
+ int merr_fatal;
+} record_modify_arg_t;
+
+typedef struct record_count_arg {
+ record_table_t* rtable;
+ int* response;
+} record_count_arg_t;
+
+typedef struct record_iterate_arg {
+ record_table_t* rtable;
+ int (*fn) (record_key_t key, record_t rec, void* varg);
+ void* fn_arg;
+} record_iterate_arg_t;
+
+extern int record_query(record_t rec, record_t unused, void* varg);
+extern int record_exists(record_t rec, record_t unused, void* varg);
+extern int record_add(record_t rec, record_t* new_rec, void* varg);
+extern int record_modify (record_t rec, record_t* new_rec, void* varg);
+extern int record_del(record_t rec, record_t* unused, void* varg);
+extern int record_count(record_t rec, record_t* unused, void* varg);
+extern int record_iterate(record_t rec, record_t* unused, void* varg);
+
+#endif
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [ SEMANAGE ] Fix record handlers, add status codes
2005-09-20 8:59 [ SEMANAGE ] Stub record handlers Ivan Gyurdiev
@ 2005-09-20 9:22 ` Ivan Gyurdiev
2005-09-21 14:42 ` Stephen Smalley
2005-09-21 14:41 ` [ SEMANAGE ] Stub record handlers Stephen Smalley
1 sibling, 1 reply; 6+ messages in thread
From: Ivan Gyurdiev @ 2005-09-20 9:22 UTC (permalink / raw)
To: selinux
[-- Attachment #1: Type: text/plain, Size: 235 bytes --]
The attached patch applies on top of the previous one, and fixes
several bugs. It also adds a header with status codes which I need...
the debug system should go into this header IMHO, once we decide
what the debug system should be.
[-- Attachment #2: libsemanage.fixup.diff --]
[-- Type: text/x-patch, Size: 4439 bytes --]
diff -Naur libsemanage.new/src/database_file.c libsemanage/src/database_file.c
--- libsemanage.new/src/database_file.c 2005-09-20 05:11:44.000000000 -0400
+++ libsemanage/src/database_file.c 2005-09-20 05:18:12.000000000 -0400
@@ -1,5 +1,6 @@
#include <stdlib.h>
#include <stddef.h>
+#include "debug.h"
#include "database.h"
#include "record_file.h"
#include "record_file_handlers.h"
@@ -23,12 +24,12 @@
dbase[DBASE_USERS]->rtable = &RTABLE_USER;
dbase[DBASE_PORTS]->rtable = &RTABLE_PORT;
- return 0;
+ return STATUS_SUCCESS;
err:
for (i--; i >= 0; i--)
free(dbase[i]);
- return -1;
+ return STATUS_ERR;
}
void dbase_close() {
@@ -60,7 +61,7 @@
/* config.merr_fatal = */
/* Stub */
- return -1;
+ return STATUS_SUCCESS;
}
int dbase_modify(
@@ -86,7 +87,7 @@
/* config.merr_fatal = */
/* Stub */
- return -1;
+ return STATUS_SUCCESS;
}
int dbase_del(
@@ -104,12 +105,12 @@
/* config.parse_arg = */
/* config.perr_fatal = */
config.modify = 1;
- config.handler = record_add;
+ config.handler = record_del;
config.handler_arg = &handler_arg;
/* config.merr_fatal = */
/* Stub */
- return -1;
+ return STATUS_SUCCESS;
}
int dbase_query(
@@ -129,12 +130,12 @@
/* config.parse_arg = */
/* config.perr_fatal = */
config.modify = 0;
- config.handler = record_add;
+ config.handler = record_query;
config.handler_arg = &handler_arg;
/* config.merr_fatal = */
/* Stub */
- return -1;
+ return STATUS_SUCCESS;
}
int dbase_exists(
@@ -159,7 +160,7 @@
/* config.merr_fatal = */
/* Stub */
- return -1;
+ return STATUS_SUCCESS;
}
int dbase_count(
@@ -182,7 +183,7 @@
/* config.merr_fatal = */
/* Stub */
- return -1;
+ return STATUS_SUCCESS;
}
int dbase_iterate(
@@ -209,7 +210,7 @@
/* config.merr_fatal = */
/* Stub */
- return -1;
+ return STATUS_SUCCESS;
}
int dbase_list(
@@ -232,5 +233,5 @@
keyset = NULL;
dataset = NULL;
count = NULL;
- return -1;
+ return STATUS_SUCCESS;
}
diff -Naur libsemanage.new/src/debug.h libsemanage/src/debug.h
--- libsemanage.new/src/debug.h 1969-12-31 19:00:00.000000000 -0500
+++ libsemanage/src/debug.h 2005-09-20 05:08:22.000000000 -0400
@@ -0,0 +1,10 @@
+#ifndef _SEPOL_INTERNAL_DEBUG_H_
+#define _SEPOL_INTERNAL_DEBUG_H_
+
+#define STATUS_SUCCESS 0
+#define STATUS_ERR -1
+#define STATUS_NODATA 1
+
+/* Define debug system in this header */
+
+#endif
diff -Naur libsemanage.new/src/record_file.c libsemanage/src/record_file.c
--- libsemanage.new/src/record_file.c 2005-09-19 15:31:28.000000000 -0400
+++ libsemanage/src/record_file.c 2005-09-20 05:14:24.000000000 -0400
@@ -1,8 +1,9 @@
+#include "debug.h"
#include "record_file.h"
int record_iterate_file(iterate_config_t* config) {
/* Stub */
config = NULL;
- return 0;
+ return STATUS_SUCCESS;
}
diff -Naur libsemanage.new/src/record_file_handlers.c libsemanage/src/record_file_handlers.c
--- libsemanage.new/src/record_file_handlers.c 2005-09-20 05:11:44.000000000 -0400
+++ libsemanage/src/record_file_handlers.c 2005-09-20 05:18:40.000000000 -0400
@@ -1,3 +1,4 @@
+#include "debug.h"
#include "record_file.h"
#include "record_file_handlers.h"
@@ -7,7 +8,7 @@
#define RECORD_DEFINED
#endif
-int record_query(record_t process_rec, record_t unused, void* varg) {
+int record_query(record_t process_rec, record_t* unused, void* varg) {
/* Stub */
process_rec = NULL;
@@ -16,7 +17,7 @@
return RECORD_HANDLER_SIGEXIT;
}
-int record_exists(record_t process_rec, record_t unused, void* varg) {
+int record_exists(record_t process_rec, record_t* unused, void* varg) {
/* Stub */
process_rec = NULL;
diff -Naur libsemanage.new/src/record_file_handlers.h libsemanage/src/record_file_handlers.h
--- libsemanage.new/src/record_file_handlers.h 2005-09-20 05:11:44.000000000 -0400
+++ libsemanage/src/record_file_handlers.h 2005-09-20 05:17:31.000000000 -0400
@@ -51,8 +51,8 @@
void* fn_arg;
} record_iterate_arg_t;
-extern int record_query(record_t rec, record_t unused, void* varg);
-extern int record_exists(record_t rec, record_t unused, void* varg);
+extern int record_query(record_t rec, record_t* unused, void* varg);
+extern int record_exists(record_t rec, record_t* unused, void* varg);
extern int record_add(record_t rec, record_t* new_rec, void* varg);
extern int record_modify (record_t rec, record_t* new_rec, void* varg);
extern int record_del(record_t rec, record_t* unused, void* varg);
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [ SEMANAGE ] Stub record handlers
2005-09-20 8:59 [ SEMANAGE ] Stub record handlers Ivan Gyurdiev
2005-09-20 9:22 ` [ SEMANAGE ] Fix record handlers, add status codes Ivan Gyurdiev
@ 2005-09-21 14:41 ` Stephen Smalley
1 sibling, 0 replies; 6+ messages in thread
From: Stephen Smalley @ 2005-09-21 14:41 UTC (permalink / raw)
To: Ivan Gyurdiev; +Cc: selinux
On Tue, 2005-09-20 at 04:59 -0400, Ivan Gyurdiev wrote:
> The attached patch stubs out most of the record handlers, and has the
> dbase_* routines fill out parts of the config structure.
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] 6+ messages in thread
* Re: [ SEMANAGE ] Fix record handlers, add status codes
2005-09-20 9:22 ` [ SEMANAGE ] Fix record handlers, add status codes Ivan Gyurdiev
@ 2005-09-21 14:42 ` Stephen Smalley
2005-09-21 15:19 ` Ivan Gyurdiev
0 siblings, 1 reply; 6+ messages in thread
From: Stephen Smalley @ 2005-09-21 14:42 UTC (permalink / raw)
To: Ivan Gyurdiev; +Cc: selinux
On Tue, 2005-09-20 at 05:22 -0400, Ivan Gyurdiev wrote:
> The attached patch applies on top of the previous one, and fixes
> several bugs. It also adds a header with status codes which I need...
> the debug system should go into this header IMHO, once we decide
> what the debug system should be.
Thanks, merged.
What do you view as still undecided for the debug system?
--
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] 6+ messages in thread
* Re: [ SEMANAGE ] Fix record handlers, add status codes
2005-09-21 14:42 ` Stephen Smalley
@ 2005-09-21 15:19 ` Ivan Gyurdiev
2005-09-21 15:36 ` Stephen Smalley
0 siblings, 1 reply; 6+ messages in thread
From: Ivan Gyurdiev @ 2005-09-21 15:19 UTC (permalink / raw)
To: Stephen Smalley; +Cc: selinux
>Thanks, merged.
>
>What do you view as still undecided for the debug system?
>
>
I need to determine what's necessary for me to introduce error reporting
in future semanage code. In particular:
- I need to pass down the semanage handle (which does not exist yet)
down for state. That's pending Joshua's patch.
- I need to decide whether to use write_error, or DEBUG, and put the
appropriate debug system in debug.h
- If (write_error) -> needs to be modified to support multiple error
messages
- If (DEBUG) -> needs to be modified to support state, and provide a
buffering callback
- Independently, I still might need to reduce the number and placement
of error messages to make the error message more suitable for the end user.
Basically, error messages a constant PITA, that I'd rather ignore for
the moment, partly because of the lack of handle object. There's more
important things to take care of... such as the justification for adding
a database-like engine in the first place. I think this will be easier
to justify once I add an avrule record, to allow policy rules to be
parsed and loaded into policy (only avtab rules, no booleans, and no
m4). This will also need some code moved (at least duplicated for now...
) from checkpolicy into sepol. The idea of this engine thing is to allow
handling of any text file that looks like a collection of records in a
consistent manner, with 90% of all code being shared (everything minus
the parsing of a single record). It should be trivial to add new
structured files, and write arbitrary handlers in C, otherwise the
objective is not accomplished.
--
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] 6+ messages in thread
* Re: [ SEMANAGE ] Fix record handlers, add status codes
2005-09-21 15:19 ` Ivan Gyurdiev
@ 2005-09-21 15:36 ` Stephen Smalley
0 siblings, 0 replies; 6+ messages in thread
From: Stephen Smalley @ 2005-09-21 15:36 UTC (permalink / raw)
To: Ivan Gyurdiev; +Cc: Karl MacMillan, Joshua Brindle, selinux
On Wed, 2005-09-21 at 11:19 -0400, Ivan Gyurdiev wrote:
> I need to determine what's necessary for me to introduce error reporting
> in future semanage code. In particular:
>
> - I need to pass down the semanage handle (which does not exist yet)
> down for state. That's pending Joshua's patch.
Or you could just drop in a stub for now, and he can fill it in later.
> - I need to decide whether to use write_error, or DEBUG, and put the
> appropriate debug system in debug.h
The earlier thread seemed to be going toward the latter, with the
modifications you mentioned below.
> - If (DEBUG) -> needs to be modified to support state, and provide a
> buffering callback
Right, caller-supplied state object and level/priority value. Callback
can implement buffering as desired.
> - Independently, I still might need to reduce the number and placement
> of error messages to make the error message more suitable for the end user.
Right, try to get to the point where the call chain DEBUG calls can be
purely debug level/priority info and can be discarded for error
reporting to the user/client.
> Basically, error messages a constant PITA, that I'd rather ignore for
> the moment, partly because of the lack of handle object. There's more
> important things to take care of... such as the justification for adding
> a database-like engine in the first place. I think this will be easier
> to justify once I add an avrule record, to allow policy rules to be
> parsed and loaded into policy (only avtab rules, no booleans, and no
> m4). This will also need some code moved (at least duplicated for now...
> ) from checkpolicy into sepol. The idea of this engine thing is to allow
> handling of any text file that looks like a collection of records in a
> consistent manner, with 90% of all code being shared (everything minus
> the parsing of a single record). It should be trivial to add new
> structured files, and write arbitrary handlers in C, otherwise the
> objective is not accomplished.
--
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] 6+ messages in thread
end of thread, other threads:[~2005-09-21 15:36 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-20 8:59 [ SEMANAGE ] Stub record handlers Ivan Gyurdiev
2005-09-20 9:22 ` [ SEMANAGE ] Fix record handlers, add status codes Ivan Gyurdiev
2005-09-21 14:42 ` Stephen Smalley
2005-09-21 15:19 ` Ivan Gyurdiev
2005-09-21 15:36 ` Stephen Smalley
2005-09-21 14:41 ` [ SEMANAGE ] Stub record handlers Stephen Smalley
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.