d7f1e3a
diff --exclude-from=exclude -N -u -r nsalibselinux/man/man3/freecon.3 libselinux-2.0.67/man/man3/freecon.3
d7f1e3a
--- nsalibselinux/man/man3/freecon.3	2008-06-12 23:25:12.000000000 -0400
d7f1e3a
+++ libselinux-2.0.67/man/man3/freecon.3	2008-07-09 16:52:33.000000000 -0400
d7f1e3a
@@ -15,6 +15,11 @@
d7f1e3a
 .B freeconary
d7f1e3a
 frees the memory allocated for a context array.
d7f1e3a
 
d7f1e3a
+If
d7f1e3a
+.I con
d7f1e3a
+is NULL, no operation is performed.
d7f1e3a
+
d7f1e3a
+
d7f1e3a
 .SH "SEE ALSO"
d7f1e3a
 .BR selinux "(8)"
d7f1e3a
 
d7f1e3a
diff --exclude-from=exclude -N -u -r nsalibselinux/man/man8/selinuxconlist.8 libselinux-2.0.67/man/man8/selinuxconlist.8
37a2ba5
--- nsalibselinux/man/man8/selinuxconlist.8	1969-12-31 19:00:00.000000000 -0500
d7f1e3a
+++ libselinux-2.0.67/man/man8/selinuxconlist.8	2008-07-09 16:52:33.000000000 -0400
37a2ba5
@@ -0,0 +1,18 @@
37a2ba5
+.TH "selinuxconlist" "1" "7 May 2008" "dwalsh@redhat.com" "SELinux Command Line documentation"
37a2ba5
+.SH "NAME"
37a2ba5
+selinuxconlist \- list all SELinux context reachable for user
37a2ba5
+.SH "SYNOPSIS"
37a2ba5
+.B selinuxconlist [-l level] user [context]
d87adcf
+
37a2ba5
+.SH "DESCRIPTION"
37a2ba5
+.B selinuxconlist
37a2ba5
+reports the list of context reachable for user from the current context or specified context
37a2ba5
+
37a2ba5
+.B \-l level
37a2ba5
+mcs/mls level
d87adcf
+
37a2ba5
+.SH AUTHOR	
37a2ba5
+This manual page was written by Dan Walsh <dwalsh@redhat.com>.
37a2ba5
+
37a2ba5
+.SH "SEE ALSO"
37a2ba5
+secon(8), selinuxdefcon(8)
d7f1e3a
diff --exclude-from=exclude -N -u -r nsalibselinux/man/man8/selinuxdefcon.8 libselinux-2.0.67/man/man8/selinuxdefcon.8
37a2ba5
--- nsalibselinux/man/man8/selinuxdefcon.8	1969-12-31 19:00:00.000000000 -0500
d7f1e3a
+++ libselinux-2.0.67/man/man8/selinuxdefcon.8	2008-07-09 16:52:33.000000000 -0400
37a2ba5
@@ -0,0 +1,19 @@
37a2ba5
+.TH "selinuxdefcon" "1" "7 May 2008" "dwalsh@redhat.com" "SELinux Command Line documentation"
37a2ba5
+.SH "NAME"
37a2ba5
+selinuxdefcon \- list default SELinux context for user 
37a2ba5
+
37a2ba5
+.SH "SYNOPSIS"
37a2ba5
+.B selinuxdefcon [-l level] user [fromcon]
37a2ba5
+
37a2ba5
+.SH "DESCRIPTION"
37a2ba5
+.B seconlist
37a2ba5
+reports the default context for the specified user from current context or specified context
37a2ba5
+
37a2ba5
+.B \-l level
37a2ba5
+mcs/mls level
37a2ba5
+
37a2ba5
+.SH AUTHOR	
37a2ba5
+This manual page was written by Dan Walsh <dwalsh@redhat.com>.
37a2ba5
+
37a2ba5
+.SH "SEE ALSO"
37a2ba5
+secon(8), selinuxconlist(8)
d7f1e3a
diff --exclude-from=exclude -N -u -r nsalibselinux/src/Makefile libselinux-2.0.67/src/Makefile
d7f1e3a
--- nsalibselinux/src/Makefile	2008-06-22 09:40:25.000000000 -0400
d7f1e3a
+++ libselinux-2.0.67/src/Makefile	2008-07-09 16:56:37.000000000 -0400
d7f1e3a
@@ -7,16 +7,24 @@
d7f1e3a
 PYINC ?= /usr/include/$(PYLIBVER)
d7f1e3a
 PYLIB ?= /usr/lib/$(PYLIBVER)
d7f1e3a
 PYTHONLIBDIR ?= $(LIBDIR)/$(PYLIBVER)
d7f1e3a
+RUBYLIBVER ?= $(shell ruby -e 'print RUBY_VERSION.split(".")[0..1].join(".")')
d7f1e3a
+RUBYPLATFORM ?= $(shell ruby -e 'print RUBY_PLATFORM')
d7f1e3a
+RUBYINC ?= $(LIBDIR)/ruby/$(RUBYLIBVER)/$(RUBYPLATFORM)
d7f1e3a
+RUBYINSTALL ?= $(LIBDIR)/ruby/site_ruby/$(RUBYLIBVER)/$(RUBYPLATFORM)
d7f1e3a
 
d7f1e3a
 LIBVERSION = 1
d7f1e3a
 
d7f1e3a
 LIBA=libselinux.a 
d7f1e3a
 TARGET=libselinux.so
d7f1e3a
 SWIGIF= selinuxswig_python.i
d7f1e3a
+SWIGRUBYIF= selinuxswig_ruby.i
d7f1e3a
 SWIGCOUT= selinuxswig_wrap.c
d7f1e3a
+SWIGRUBYCOUT= selinuxswig_ruby_wrap.c
d7f1e3a
 SWIGLOBJ:= $(patsubst %.c,%.lo,$(SWIGCOUT)) 
d7f1e3a
+SWIGRUBYLOBJ:= $(patsubst %.c,%.lo,$(SWIGRUBYCOUT)) 
d7f1e3a
 SWIGSO=_selinux.so
d7f1e3a
 SWIGFILES=$(SWIGSO) selinux.py 
d7f1e3a
+SWIGRUBYSO=_rubyselinux.so
d7f1e3a
 LIBSO=$(TARGET).$(LIBVERSION)
d7f1e3a
 AUDIT2WHYSO=audit2why.so
d7f1e3a
 
d7f1e3a
@@ -29,7 +37,9 @@
d7f1e3a
 ifeq ($(DISABLE_RPM),y)
d7f1e3a
 	UNUSED_SRCS+=rpm.c
d7f1e3a
 endif
d7f1e3a
-SRCS= $(filter-out $(UNUSED_SRCS), $(filter-out audit2why.c $(SWIGCOUT),$(wildcard *.c)))
d7f1e3a
+
d7f1e3a
+GENERATED=$(SWIGCOUT) $(SWIGRUBYCOUT)
d7f1e3a
+SRCS= $(filter-out $(UNUSED_SRCS), $(filter-out audit2why.c $(GENERATED),$(wildcard *.c)))
d7f1e3a
 
d7f1e3a
 OBJS= $(patsubst %.c,%.o,$(SRCS))
d7f1e3a
 LOBJS= $(patsubst %.c,%.lo,$(SRCS))
d7f1e3a
@@ -44,11 +54,11 @@
d7f1e3a
 
d7f1e3a
 SWIG = swig -Wall -python -o $(SWIGCOUT) -outdir ./
d7f1e3a
 
d7f1e3a
-GENERATED=$(SWIGCOUT)
d7f1e3a
+SWIGRUBY = swig -Wall -ruby -o $(SWIGRUBYCOUT) -outdir ./
d7f1e3a
 
d7f1e3a
 all: $(LIBA) $(LIBSO) 
d7f1e3a
 
d7f1e3a
-pywrap: all $(SWIGSO) $(AUDIT2WHYSO)
d7f1e3a
+pywrap: all $(SWIGSO) $(AUDIT2WHYSO) $(SWIGRUBYSO) 
d7f1e3a
 
d7f1e3a
 $(LIBA):  $(OBJS)
d7f1e3a
 	$(AR) rcs $@ $^
d7f1e3a
@@ -57,8 +67,14 @@
d7f1e3a
 $(SWIGLOBJ): $(SWIGCOUT)
d7f1e3a
 	$(CC) $(filter-out -Werror,$(CFLAGS)) -I$(PYINC) -fPIC -DSHARED -c -o $@ $<
d7f1e3a
 
d7f1e3a
+$(SWIGRUBYLOBJ): $(SWIGRUBYCOUT)
d7f1e3a
+	$(CC) $(filter-out -Werror,$(CFLAGS)) -I$(RUBYINC) -fPIC -DSHARED -c -o $@ $<
d7f1e3a
+
d7f1e3a
 $(SWIGSO): $(SWIGLOBJ)
d7f1e3a
-	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $< -L. -lselinux -L$(LIBDIR) -Wl,-soname,$@
d7f1e3a
+	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $^ -L. -lselinux -L$(LIBDIR) -Wl,-soname,$@
d7f1e3a
+
d7f1e3a
+$(SWIGRUBYSO): $(SWIGRUBYLOBJ)
d7f1e3a
+	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $^ -L. -lselinux -L$(LIBDIR) -Wl,-soname,$@
d7f1e3a
 
d7f1e3a
 $(LIBSO): $(LOBJS)
d7f1e3a
 	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $^ -ldl -L$(LIBDIR) -Wl,-soname,$(LIBSO),-z,defs,-z,relro
d7f1e3a
@@ -79,6 +95,9 @@
d7f1e3a
 $(SWIGCOUT): $(SWIGIF)
d7f1e3a
 	$(SWIG) $^
d7f1e3a
 
d7f1e3a
+$(SWIGRUBYCOUT): $(SWIGRUBYIF)
d7f1e3a
+	$(SWIGRUBY) $^
d7f1e3a
+
d7f1e3a
 swigify: $(SWIGIF)
d7f1e3a
 	$(SWIG) $^
d7f1e3a
 
d7f1e3a
@@ -95,6 +114,9 @@
d7f1e3a
 	install -m 755 $(AUDIT2WHYSO) $(PYTHONLIBDIR)/site-packages/selinux
d7f1e3a
 	install -m 644  selinux.py $(PYTHONLIBDIR)/site-packages/selinux/__init__.py
d7f1e3a
 
d7f1e3a
+	test -d $(RUBYINSTALL) || install -m 755 -d $(RUBYINSTALL) 
d7f1e3a
+	install -m 755 $(SWIGRUBYSO) $(RUBYINSTALL)/selinux.so
d7f1e3a
+
d7f1e3a
 relabel:
d7f1e3a
 	/sbin/restorecon $(SHLIBDIR)/$(LIBSO)
d7f1e3a
 
d7f1e3a
@@ -102,7 +124,7 @@
d7f1e3a
 	-rm -f $(OBJS) $(LOBJS) $(LIBA) $(LIBSO) $(SWIGLOBJ) $(SWIGSO) $(TARGET) $(AUDIT2WHYSO) *.o *.lo *~
d7f1e3a
 
d7f1e3a
 distclean: clean
d7f1e3a
-	rm -f $(SWIGCOUT) $(SWIGFILES)
d7f1e3a
+	rm -f $(GENERATED) $(SWIGFILES)
d7f1e3a
 
d7f1e3a
 indent:
d7f1e3a
 	../../scripts/Lindent $(filter-out $(GENERATED),$(wildcard *.[ch]))
d7f1e3a
diff --exclude-from=exclude -N -u -r nsalibselinux/src/audit2why.c libselinux-2.0.67/src/audit2why.c
d7f1e3a
--- nsalibselinux/src/audit2why.c	2008-06-12 23:25:14.000000000 -0400
d7f1e3a
+++ libselinux-2.0.67/src/audit2why.c	2008-07-09 16:52:33.000000000 -0400
d7f1e3a
@@ -55,7 +55,7 @@
d7f1e3a
 	return 0;
d7f1e3a
 }
d7f1e3a
 
d7f1e3a
-static int check_booleans(struct avc_t *avc, struct boolean_t **bools)
d7f1e3a
+static int check_booleans(struct boolean_t **bools)
d7f1e3a
 {
d7f1e3a
 	char errormsg[PATH_MAX];
d7f1e3a
 	struct sepol_av_decision avd;
d7f1e3a
@@ -376,7 +376,7 @@
d7f1e3a
 		avc->tsid = tsid;
d7f1e3a
 		avc->tclass = tclass;
d7f1e3a
 		avc->av = av;
d7f1e3a
-		if (check_booleans(avc, &bools) == 0) {
d7f1e3a
+		if (check_booleans(&bools) == 0) {
d7f1e3a
 			if (av & ~avd.auditdeny) {
d7f1e3a
 				RETURN(DONTAUDIT)
d7f1e3a
 			} else {
d7f1e3a
@@ -390,15 +390,15 @@
d7f1e3a
 				len++; b++;
d7f1e3a
 			}
d7f1e3a
 			b = bools;
d7f1e3a
-			PyObject *boollist = PyTuple_New(len);
d7f1e3a
+			PyObject *outboollist = PyTuple_New(len);
d7f1e3a
 			len=0;
d7f1e3a
 			while(b->name) {
d7f1e3a
 				PyObject *bool = Py_BuildValue("(si)", b->name, b->active);
d7f1e3a
-				PyTuple_SetItem(boollist, len++, bool);
d7f1e3a
+				PyTuple_SetItem(outboollist, len++, bool);
d7f1e3a
 				b++;
d7f1e3a
 			}
d7f1e3a
 			free(bools);
d7f1e3a
-			PyTuple_SetItem(result, 1, boollist);
d7f1e3a
+			PyTuple_SetItem(result, 1, outboollist);
d7f1e3a
 			return result;
d7f1e3a
 		}
d7f1e3a
 	}
d7f1e3a
diff --exclude-from=exclude -N -u -r nsalibselinux/src/matchpathcon.c libselinux-2.0.67/src/matchpathcon.c
d7f1e3a
--- nsalibselinux/src/matchpathcon.c	2008-06-12 23:25:14.000000000 -0400
d7f1e3a
+++ libselinux-2.0.67/src/matchpathcon.c	2008-07-09 16:52:33.000000000 -0400
71cd138
@@ -2,6 +2,7 @@
71cd138
 #include <string.h>
71cd138
 #include <errno.h>
71cd138
 #include <stdio.h>
71cd138
+#include <syslog.h>
71cd138
 #include "selinux_internal.h"
71cd138
 #include "label_internal.h"
71cd138
 #include "callbacks.h"
0fa749d
@@ -57,7 +58,7 @@
71cd138
 {
71cd138
 	va_list ap;
71cd138
 	va_start(ap, fmt);
71cd138
-	vfprintf(stderr, fmt, ap);
0fa749d
+	vsyslog(LOG_ERR, fmt, ap);
71cd138
 	va_end(ap);
71cd138
 }
71cd138
 
d7f1e3a
diff --exclude-from=exclude -N -u -r nsalibselinux/src/selinuxswig_ruby.i libselinux-2.0.67/src/selinuxswig_ruby.i
d7f1e3a
--- nsalibselinux/src/selinuxswig_ruby.i	1969-12-31 19:00:00.000000000 -0500
d7f1e3a
+++ libselinux-2.0.67/src/selinuxswig_ruby.i	2008-07-09 16:52:33.000000000 -0400
d7f1e3a
@@ -0,0 +1,147 @@
d7f1e3a
+/* Author: James Athey
d7f1e3a
+ */
d7f1e3a
+
d7f1e3a
+%module selinux
d7f1e3a
+%{
d7f1e3a
+	#include "selinux/selinux.h"
d7f1e3a
+%}
d7f1e3a
+
d7f1e3a
+/* security_get_boolean_names() typemap */
d7f1e3a
+/*
d7f1e3a
+%typemap(argout) (char ***names, int *len) {
d7f1e3a
+	PyObject* list = PyList_New(*$2);
d7f1e3a
+	int i;
d7f1e3a
+	for (i = 0; i < *$2; i++) {
d7f1e3a
+		PyList_SetItem(list, i, PyString_FromString((*$1)[i]));
d7f1e3a
+	}
d7f1e3a
+	$result = SWIG_Python_AppendOutput($result, list);
d7f1e3a
+}
d7f1e3a
+*/
37a2ba5
+/* return a sid along with the result */
37a2ba5
+%typemap(argout) (security_id_t * sid) {
37a2ba5
+	if (*$1) {
37a2ba5
+                %append_output(SWIG_NewPointerObj(*$1, $descriptor(security_id_t), 0));
d7f1e3a
+	} 
d7f1e3a
+/*	else {
37a2ba5
+		Py_INCREF(Py_None);
37a2ba5
+		%append_output(Py_None);
37a2ba5
+	}
d7f1e3a
+*/
37a2ba5
+}
37a2ba5
+
37a2ba5
+%typemap(in,numinputs=0) security_id_t *(security_id_t temp) {
37a2ba5
+  $1 = &tem;;
37a2ba5
+}
37a2ba5
+
d7f1e3a
+/* Makes security_compute_user() return a Python list of contexts */
d7f1e3a
+/*
d7f1e3a
+%typemap(argout) (security_context_t **con) {
d7f1e3a
+	PyObject* plist;
d7f1e3a
+	int i, len = 0;
d7f1e3a
+	
d7f1e3a
+	if (*$1) {
d7f1e3a
+		while((*$1)[len])
d7f1e3a
+			len++;
d7f1e3a
+		plist = PyList_New(len);
d7f1e3a
+		for (i = 0; i < len; i++) {
d7f1e3a
+			PyList_SetItem(plist, i, PyString_FromString((*$1)[i]));
d7f1e3a
+		}
d7f1e3a
+	} else {
d7f1e3a
+		plist = PyList_New(0);
d7f1e3a
+	}
d87adcf
+
d7f1e3a
+	$result = SWIG_Python_AppendOutput($result, plist);
d87adcf
+}
d7f1e3a
+*/
d7f1e3a
+/* Makes functions in get_context_list.h return a Python list of contexts */
d87adcf
+
d7f1e3a
+#ifdef fixme
d7f1e3a
+%typemap(argout) (security_context_t **list) {
d7f1e3a
+	PyObject* plist;
d7f1e3a
+	int i;
d7f1e3a
+	
d7f1e3a
+	if (*$1) {
d7f1e3a
+		plist = PyList_New(result);
d7f1e3a
+		for (i = 0; i < result; i++) {
d7f1e3a
+			PyList_SetItem(plist, i, PyString_FromString((*$1)[i]));
d7f1e3a
+		}
d7f1e3a
+	} else {
d7f1e3a
+		plist = PyList_New(0);
d7f1e3a
+	}
d7f1e3a
+	/* Only return the Python list, don't need to return the length anymore */
d7f1e3a
+	$result = plist;
d87adcf
+}
d7f1e3a
+#endif
d87adcf
+
d7f1e3a
+%typemap(in,noblock=1,numinputs=0) security_context_t * (security_context_t temp = 0) {
d7f1e3a
+	$1 = &tem;;
d87adcf
+}
d7f1e3a
+%typemap(freearg,match="in") security_context_t * "";
d7f1e3a
+%typemap(argout,noblock=1) security_context_t * {
d7f1e3a
+	if (*$1) {
d7f1e3a
+		%append_output(SWIG_FromCharPtr(*$1));
d7f1e3a
+		freecon(*$1);
d7f1e3a
+	}
d7f1e3a
+/*
d7f1e3a
+	else {
d7f1e3a
+		Py_INCREF(Py_None);
d7f1e3a
+		%append_output(Py_None);
d7f1e3a
+	}
d7f1e3a
+*/
d87adcf
+}
d87adcf
+
d7f1e3a
+%typemap(in,noblock=1,numinputs=0) char ** (char * temp = 0) {
d7f1e3a
+	$1 = &tem;;
d87adcf
+}
d7f1e3a
+%typemap(freearg,match="in") char ** "";
d7f1e3a
+%typemap(argout,noblock=1) char ** {
d7f1e3a
+	if (*$1) {
d7f1e3a
+		%append_output(SWIG_FromCharPtr(*$1));
d7f1e3a
+		free(*$1);
d7f1e3a
+	}
d7f1e3a
+/*
d7f1e3a
+	else {
d7f1e3a
+		Py_INCREF(Py_None);
d7f1e3a
+		%append_output(Py_None);
d7f1e3a
+	}
d7f1e3a
+*/
d87adcf
+}
d7f1e3a
+/*
d7f1e3a
+%typemap(in) char * const [] {
d7f1e3a
+	int i, size;
d7f1e3a
+	PyObject * s;
d87adcf
+
d7f1e3a
+	if (!PySequence_Check($input)) {
d7f1e3a
+		PyErr_SetString(PyExc_ValueError, "Expected a sequence");
d7f1e3a
+		return NULL;
d7f1e3a
+	}
d87adcf
+
d7f1e3a
+	size = PySequence_Size($input);
d7f1e3a
+	
d7f1e3a
+	$1 = (char**) malloc(size + 1);
d7f1e3a
+	for(i = 0; i < size; i++) {
d7f1e3a
+		if (!PyString_Check(PySequence_GetItem($input, i))) {
d7f1e3a
+			PyErr_SetString(PyExc_ValueError, "Sequence must contain only strings");
d7f1e3a
+			return NULL;
d7f1e3a
+		}
d7f1e3a
+	}
d7f1e3a
+		
d7f1e3a
+	for(i = 0; i < size; i++) {
d7f1e3a
+		s = PySequence_GetItem($input, i);
d7f1e3a
+		$1[i] = (char*) malloc(PyString_Size(s) + 1);
d7f1e3a
+		strcpy($1[i], PyString_AsString(s));
d7f1e3a
+	}
d7f1e3a
+	$1[size] = NULL;
d87adcf
+}
d7f1e3a
+*/
d87adcf
+
d7f1e3a
+%typemap(freearg,match="in") char * const [] {
d7f1e3a
+	int i = 0;
d7f1e3a
+	while($1[i]) {
d7f1e3a
+		free($1[i]);
d7f1e3a
+		i++;
d7f1e3a
+	}
d7f1e3a
+	free($1);
d87adcf
+}
d87adcf
+
d7f1e3a
+%include "selinuxswig.i"