rpms/libselinux/devel libselinux-rhat.patch, 1.139, 1.140 libselinux.spec, 1.298, 1.299

Daniel J Walsh (dwalsh) fedora-extras-commits at redhat.com
Thu Jan 10 18:32:59 UTC 2008


Author: dwalsh

Update of /cvs/extras/rpms/libselinux/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv5488

Modified Files:
	libselinux-rhat.patch libselinux.spec 
Log Message:
* Tue Jan 8 2008 Dan Walsh <dwalsh at redhat.com> - 2.0.46-5
- Add audit2why python bindings


libselinux-rhat.patch:

Index: libselinux-rhat.patch
===================================================================
RCS file: /cvs/extras/rpms/libselinux/devel/libselinux-rhat.patch,v
retrieving revision 1.139
retrieving revision 1.140
diff -u -r1.139 -r1.140
--- libselinux-rhat.patch	8 Jan 2008 11:07:27 -0000	1.139
+++ libselinux-rhat.patch	10 Jan 2008 18:32:52 -0000	1.140
@@ -1,6 +1,6 @@
 diff --exclude-from=exclude -N -u -r nsalibselinux/include/selinux/av_permissions.h libselinux-2.0.46/include/selinux/av_permissions.h
 --- nsalibselinux/include/selinux/av_permissions.h	2007-11-15 15:52:46.000000000 -0500
-+++ libselinux-2.0.46/include/selinux/av_permissions.h	2008-01-03 15:23:31.000000000 -0500
++++ libselinux-2.0.46/include/selinux/av_permissions.h	2008-01-10 13:25:57.000000000 -0500
 @@ -900,6 +900,8 @@
  #define PACKET__SEND                              0x00000001UL
  #define PACKET__RECV                              0x00000002UL
@@ -10,10 +10,515 @@
  #define KEY__VIEW                                 0x00000001UL
  #define KEY__READ                                 0x00000002UL
  #define KEY__WRITE                                0x00000004UL
+diff --exclude-from=exclude -N -u -r nsalibselinux/src/audit2why.c libselinux-2.0.46/src/audit2why.c
+--- nsalibselinux/src/audit2why.c	1969-12-31 19:00:00.000000000 -0500
++++ libselinux-2.0.46/src/audit2why.c	2008-01-10 13:31:17.000000000 -0500
+@@ -0,0 +1,462 @@
++#include <unistd.h>
++#include <stdlib.h>
++#include <ctype.h>
++#include <errno.h>
++#include <getopt.h>
++#include <limits.h>
++#include <sepol/sepol.h>
++#include <sepol/policydb/services.h>
++#include <Python.h>
++#include <selinux/selinux.h>
++
++#define UNKNOWN -1
++#define BADSCON -2
++#define BADTCON -3
++#define BADTCLASS -4
++#define BADPERM -5
++#define BADCOMPUTE -6
++#define NOPOLICY -7
++#define ALLOW 0
++#define DONTAUDIT 1
++#define TERULE 2
++#define BOOLEAN 3
++#define CONSTRAINT 4
++#define RBAC 5
++
++struct boolean_t {
++	char *name;
++	int active;
++};
++
++static struct boolean_t **boollist = NULL;
++static int boolcnt = 0;
++
++struct avc_t {
++	sepol_handle_t *handle;
++	policydb_t policydb;
++	sepol_security_id_t ssid;
++	sepol_security_id_t tsid;
++	sepol_security_class_t tclass;
++	sepol_access_vector_t av;
++};
++
++static struct avc_t *avc = NULL;
++
++static sidtab_t sidtab;
++
++static int load_booleans(const sepol_bool_t * boolean,
++			 void *arg __attribute__ ((__unused__)))
++{
++	boollist[boolcnt] =
++	    (struct boolean_t *)malloc(sizeof(struct boolean_t));
++	boollist[boolcnt]->name = strdup(sepol_bool_get_name(boolean));
++	boollist[boolcnt]->active = sepol_bool_get_value(boolean);
++	boolcnt++;
++	return 0;
++}
++
++static int check_booleans(struct avc_t *avc, struct boolean_t ***bools)
++{
++	char errormsg[PATH_MAX];
++	struct sepol_av_decision avd;
++	unsigned int reason;
++	int rc;
++	int i;
++	sepol_bool_key_t *key = NULL;
++	sepol_bool_t *boolean = NULL;
++	int fcnt = 0;
++	int *foundlist = calloc(boolcnt, sizeof(int));
++	if (!foundlist) {
++		PyErr_SetString( PyExc_MemoryError, "Out of memory\n");
++		return fcnt;
++	}
++	for (i = 0; i < boolcnt; i++) {
++		char *name = boollist[i]->name;
++		int active = boollist[i]->active;
++		rc = sepol_bool_key_create(avc->handle, name, &key);
++		if (rc < 0) {
++			PyErr_SetString( PyExc_RuntimeError, 
++					 "Could not create boolean key.\n");
++			break;
++		}
++		rc = sepol_bool_query(avc->handle,
++				      (sepol_policydb_t *) & avc->policydb,
++				      key, &boolean);
++
++		if (rc < 0) {
++			snprintf(errormsg, sizeof(errormsg), 
++				 "Could not find boolean %s.\n", name);
++			PyErr_SetString( PyExc_RuntimeError, errormsg);
++			break;
++		}
++
++		sepol_bool_set_value(boolean, !active);
++
++		rc = sepol_bool_set(avc->handle,
++				    (sepol_policydb_t *) & avc->policydb,
++				    key, boolean);
++		if (rc < 0) {
++			snprintf(errormsg, sizeof(errormsg), 
++				 "Could not set boolean data %s.\n", name);
++			PyErr_SetString( PyExc_RuntimeError, errormsg);
++			break;
++		}
++
++		/* Reproduce the computation. */
++		rc = sepol_compute_av_reason(avc->ssid, avc->tsid, avc->tclass,
++					     avc->av, &avd, &reason);
++		if (rc < 0) {
++			snprintf(errormsg, sizeof(errormsg), 
++				 "Error during access vector computation, skipping...");
++			PyErr_SetString( PyExc_RuntimeError, errormsg);
++
++			sepol_bool_free(boolean);
++			break;
++		} else {
++			if (!reason) {
++				foundlist[fcnt] = i;
++				fcnt++;
++			}
++			sepol_bool_set_value((sepol_bool_t *) boolean, active);
++			rc = sepol_bool_set(avc->handle,
++					    (sepol_policydb_t *) & avc->
++					    policydb, key,
++					    (sepol_bool_t *) boolean);
++			if (rc < 0) {
++				snprintf(errormsg, sizeof(errormsg), 
++					 "Could not set boolean data %s.\n",
++					 name);
++			
++				PyErr_SetString( PyExc_RuntimeError, errormsg);
++				break;
++			}
++		}
++		sepol_bool_free(boolean);
++		sepol_bool_key_free(key);
++		key = NULL;
++		boolean = NULL;
++	}
++	if (key)
++		sepol_bool_key_free(key);
++
++	if (boolean)
++		sepol_bool_free(boolean);
++
++	if (fcnt > 0) {
++		*bools = (struct boolean_t **)
++			calloc(sizeof(struct boolean_t), fcnt + 1);
++		struct boolean_t *b = (struct boolean_t *) *bools;
++		for (i = 0; i < fcnt; i++) {
++			int ctr = foundlist[i];
++			b[i].name = strdup(boollist[ctr]->name);
++			b[i].active = !boollist[ctr]->active;
++		}
++	}
++	free(foundlist);
++	return fcnt;
++}
++
++static PyObject *finish(PyObject *self __attribute__((unused)), PyObject *args) {
++	PyObject *result = 0;
++  
++	if (PyArg_ParseTuple(args,(char *)":finish")) {
++		int i = 0;
++		for (i = 0; i < boolcnt; i++) {
++			free(boollist[i]->name);
++			free(boollist[i]);
++		}
++		free(boollist);
++		sepol_sidtab_shutdown(&sidtab);
++		sepol_sidtab_destroy(&sidtab);
++		policydb_destroy(&avc->policydb);
++		sepol_handle_destroy(avc->handle);
++		free(avc);
++		avc = NULL;
++		boollist = NULL;
++		boolcnt = 0;
++	  
++		/* Boilerplate to return "None" */
++		Py_RETURN_NONE;
++	}
++	return result;
++}
++
++
++static int __policy_init(const char *init_path)
++{
++	FILE *fp;
++	int vers = 0;
++	char path[PATH_MAX];
++	char errormsg[PATH_MAX];
++	struct policy_file pf;
++	int rc;
++	unsigned int cnt;
++
++	if (init_path) {
++		strncpy(path, init_path, PATH_MAX);
++		fp = fopen(path, "r");
++		if (!fp) {
++			snprintf(errormsg, sizeof(errormsg), 
++				 "unable to open %s:  %s\n",
++				 path, strerror(errno));
++			PyErr_SetString( PyExc_ValueError, errormsg);
++			return 0;    // trigger exception
++		}
++	} else {
++		vers = security_policyvers();
++		if (vers < 0) {
++			snprintf(errormsg, sizeof(errormsg), 
++				 "Could not get policy version:  %s\n",
++				 strerror(errno));
++			PyErr_SetString( PyExc_ValueError, errormsg);
++			return 1;
++		}
++		snprintf(path, PATH_MAX, "%s.%d",
++			 selinux_binary_policy_path(), vers);
++		fp = fopen(path, "r");
++		while (!fp && errno == ENOENT && --vers) {
++			snprintf(path, PATH_MAX, "%s.%d",
++				 selinux_binary_policy_path(), vers);
++			fp = fopen(path, "r");
++		}
++		if (!fp) {
++			snprintf(errormsg, sizeof(errormsg), 
++				 "unable to open %s.%d:  %s\n",
++				 selinux_binary_policy_path(),
++				 security_policyvers(), strerror(errno));
++			PyErr_SetString( PyExc_ValueError, errormsg);
++			return 1;
++		}
++	}
++
++	avc = calloc(sizeof(struct avc_t), 1);
++	if (!avc) {
++		PyErr_SetString( PyExc_MemoryError, "Out of memory\n");
++		return 1;
++	}
++
++	/* Set up a policydb directly so that we can mutate it later
++	   for booleans and user settings.  Otherwise we would just use
++	   sepol_set_policydb_from_file() here. */
++	pf.fp = fp;
++	pf.type = PF_USE_STDIO;
++	if (policydb_init(&avc->policydb)) {
++		snprintf(errormsg, sizeof(errormsg), 
++			 "policydb_init failed: %s\n", strerror(errno));
++		PyErr_SetString( PyExc_RuntimeError, errormsg);
++		fclose(fp);
++		return 1;
++	}
++	if (policydb_read(&avc->policydb, &pf, 0)) {
++		snprintf(errormsg, sizeof(errormsg), 
++			 "invalid binary policy %s\n", path);
++		PyErr_SetString( PyExc_ValueError, errormsg);
++		fclose(fp);
++		return 1;
++	}
++	fclose(fp);
++	sepol_set_policydb(&avc->policydb);
++	if (!init_path) {
++		/* If they didn't specify a full path of a binary policy file,
++		   then also try loading any boolean settings and user
++		   definitions from the active locations.  Otherwise,
++		   they can use genpolbools and genpolusers to build a
++		   binary policy file that includes any desired settings
++		   and then apply audit2why -p to the resulting file. 
++		   Errors are non-fatal as such settings are optional. */
++		sepol_debug(0);
++		(void)sepol_genbools_policydb(&avc->policydb,
++					      selinux_booleans_path());
++		(void)sepol_genusers_policydb(&avc->policydb,
++					      selinux_users_path());
++	}
++	avc->handle = sepol_handle_create();
++
++	rc = sepol_bool_count(avc->handle,
++			      (sepol_policydb_t *) & avc->policydb, &cnt);
++	if (rc < 0) {
++		PyErr_SetString( PyExc_RuntimeError, "unable to get bool count\n");
++		return 1;
++	}
++
++	boollist = calloc(cnt, sizeof(struct boolean_t));
++	if (!boollist) {
++		PyErr_SetString( PyExc_MemoryError, "Out of memory\n");
++		return 1;
++	}
++
++	sepol_bool_iterate(avc->handle,
++			   (const sepol_policydb_t *)&avc->policydb,
++			   load_booleans, (void *)NULL);
++
++	/* Initialize the sidtab for subsequent use by sepol_context_to_sid
++	   and sepol_compute_av_reason. */
++	rc = sepol_sidtab_init(&sidtab);
++	if (rc < 0) {
++		PyErr_SetString( PyExc_RuntimeError, "unable to init sidtab\n");
++		free(boollist);
++		return 1;
++	}
++	sepol_set_sidtab(&sidtab);
++	return 0;
++}
++
++static PyObject *init(PyObject *self __attribute__((unused)), PyObject *args) {
++  int result;
++  char *init_path=NULL;
++  if (PyArg_ParseTuple(args,(char *)"|s:policy_init",&init_path)) 
++	  result = __policy_init(init_path);
++  return Py_BuildValue("i", result);
++}
++
++#define RETURN(X) \
++	PyList_SetItem(result, 0, Py_BuildValue("i", X));	\
++	return result;						
++
++static PyObject *analyze(PyObject *self __attribute__((unused)) , PyObject *args) {
++	security_context_t scon; 
++	security_context_t tcon;
++	char *tclassstr; 
++	PyObject *listObj;
++	PyObject *strObj;
++	int numlines;
++	struct boolean_t **bools;
++	unsigned int reason;
++	sepol_security_id_t ssid, tsid;
++	sepol_security_class_t tclass;
++	sepol_access_vector_t perm, av;
++	struct sepol_av_decision avd;
++	int rc;
++	int i=0;
++	PyObject *result = PyList_New(2);
++	if (!result) return NULL;
++	Py_INCREF(Py_None);
++	PyList_SetItem(result, 1, Py_None);
++
++	if (!PyArg_ParseTuple(args,(char *)"sssO!:audit2why",&scon,&tcon,&tclassstr,&PyList_Type, &listObj)) 
++		return NULL;
++  
++	/* get the number of lines passed to us */
++	numlines = PyList_Size(listObj);
++
++	/* should raise an error here. */
++	if (numlines < 0)	return NULL; /* Not a list */
++
++	if (!avc) {
++		RETURN(NOPOLICY)
++	}
++
++	rc = sepol_context_to_sid(scon, strlen(scon) + 1, &ssid);
++	if (rc < 0) {
++		RETURN(BADSCON)
++	}
++	rc = sepol_context_to_sid(tcon, strlen(tcon) + 1, &tsid);
++	if (rc < 0) {
++		RETURN(BADTCON)
++	}
++	tclass = string_to_security_class(tclassstr);
++	if (!tclass) {
++		RETURN(BADTCLASS)
++	}
++	/* Convert the permission list to an AV. */
++	av = 0;
++
++	/* iterate over items of the list, grabbing strings, and parsing
++	   for numbers */
++	for (i=0; i<numlines; i++){
++		char *permstr;
++
++		/* grab the string object from the next element of the list */
++		strObj = PyList_GetItem(listObj, i); /* Can't fail */
++		
++		/* make it a string */
++		permstr = PyString_AsString( strObj );
++		
++		perm = string_to_av_perm(tclass, permstr);
++		if (!perm) {
++			RETURN(BADPERM)
++		}
++		av |= perm;
++	}
++
++	/* Reproduce the computation. */
++	rc = sepol_compute_av_reason(ssid, tsid, tclass, av, &avd, &reason);
++	if (rc < 0) {
++		RETURN(BADCOMPUTE)
++	}
++
++	if (!reason) {
++		RETURN(ALLOW)
++	}
++	if (reason & SEPOL_COMPUTEAV_TE) {
++		avc->ssid = ssid;
++		avc->tsid = tsid;
++		avc->tclass = tclass;
++		avc->av = av;
++		if (check_booleans(avc, &bools) == 0) {
++			if (av & ~avd.auditdeny) {
++				RETURN(DONTAUDIT)
++			} else {
++				RETURN(TERULE)
++			}
++		} else {
++			PyList_SetItem(result, 0, Py_BuildValue("i", BOOLEAN));
++			struct boolean_t *b=(struct boolean_t *) bools;
++			int len=0;
++			while (b->name) {
++				len++; b++;
++			}
++			b = (struct boolean_t *) bools;
++			PyObject *boollist = PyList_New(len);
++			len=0;
++			while(b->name) {
++				PyObject *bool = PyList_New(2);
++				PyList_SetItem(bool, 0, PyString_FromString(b->name));
++				PyList_SetItem(bool, 1, Py_BuildValue("i", b->active));
++				PyList_SetItem(boollist, len++, bool);
++				b++;
++			}
++			free(bools);
++			PyList_SetItem(result, 1, boollist);
++			return result;
++		}
++	}
++
++	if (reason & SEPOL_COMPUTEAV_CONS) {
++		RETURN(CONSTRAINT);
++	}
++
++	if (reason & SEPOL_COMPUTEAV_RBAC) {
++		RETURN(RBAC)
++	}
++        RETURN(BADCOMPUTE)
++}
++
++static PyMethodDef audit2whyMethods[] = {
++    {"init",  init, METH_VARARGS,
++     "Initialize policy database."},
++    {"analyze",  analyze, METH_VARARGS,
++     "Analyze AVC."},
++    {"finish",  finish, METH_VARARGS,
++     "Finish using policy, free memory."},
++    {NULL, NULL, 0, NULL}        /* Sentinel */
++};
++
++PyMODINIT_FUNC
++initaudit2why(void)
++{
++	PyObject *m = Py_InitModule("audit2why", audit2whyMethods);
++	PyModule_AddIntConstant(m,"UNKNOWN", UNKNOWN);
++	PyModule_AddIntConstant(m,"BADSCON", BADSCON);
++	PyModule_AddIntConstant(m,"BADTCON", BADTCON);
++	PyModule_AddIntConstant(m,"BADTCLASS", BADTCLASS);
++	PyModule_AddIntConstant(m,"BADPERM", BADPERM);
++	PyModule_AddIntConstant(m,"BADCOMPUTE", BADCOMPUTE);
++	PyModule_AddIntConstant(m,"NOPOLICY", NOPOLICY);
++	PyModule_AddIntConstant(m,"ALLOW", ALLOW);
++	PyModule_AddIntConstant(m,"DONTAUDIT", DONTAUDIT);
++	PyModule_AddIntConstant(m,"TERULE", TERULE);
++	PyModule_AddIntConstant(m,"BOOLEAN", BOOLEAN);
++	PyModule_AddIntConstant(m,"CONSTRAINT", CONSTRAINT);
++	PyModule_AddIntConstant(m,"RBAC", RBAC);
++}
 diff --exclude-from=exclude -N -u -r nsalibselinux/src/Makefile libselinux-2.0.46/src/Makefile
 --- nsalibselinux/src/Makefile	2007-09-26 19:37:45.000000000 -0400
-+++ libselinux-2.0.46/src/Makefile	2008-01-05 08:19:27.000000000 -0500
-@@ -77,14 +77,14 @@
++++ libselinux-2.0.46/src/Makefile	2008-01-10 13:25:57.000000000 -0500
+@@ -18,6 +18,7 @@
+ SWIGSO=_selinux.so
+ SWIGFILES=$(SWIGSO) selinux.py 
+ LIBSO=$(TARGET).$(LIBVERSION)
++AUDIT2WHYSO=audit2why.so
+ 
+ ifeq ($(DISABLE_AVC),y)
+ 	UNUSED_SRCS+=avc.c avc_internal.c avc_sidtab.c mapping.c stringrep.c checkAccess.c
+@@ -28,7 +29,7 @@
+ ifeq ($(DISABLE_RPM),y)
+ 	UNUSED_SRCS+=rpm.c
+ endif
+-SRCS= $(filter-out $(UNUSED_SRCS), $(filter-out $(SWIGCOUT),$(wildcard *.c)))
++SRCS= $(filter-out $(UNUSED_SRCS), $(filter-out audit2why.c $(SWIGCOUT),$(wildcard *.c)))
+ 
+ OBJS= $(patsubst %.c,%.o,$(SRCS))
+ LOBJS= $(patsubst %.c,%.lo,$(SRCS))
+@@ -47,7 +48,7 @@
+ 
+ all: $(LIBA) $(LIBSO) 
+ 
+-pywrap: all $(SWIGSO)
++pywrap: all $(SWIGSO) $(AUDIT2WHYSO)
+ 
+ $(LIBA):  $(OBJS)
+ 	$(AR) rcs $@ $^
+@@ -63,6 +64,12 @@
+ 	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $^ -ldl -L$(LIBDIR) -Wl,-soname,$(LIBSO),-z,defs,-z,relro
+ 	ln -sf $@ $(TARGET) 
+ 
++audit2why.lo: audit2why.c
++	$(CC) $(CFLAGS) -I$(PYINC) -fPIC -DSHARED -c -o $@ $<
++
++$(AUDIT2WHYSO): audit2why.lo
++	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $^ -L. -lselinux ${LIBDIR}/libsepol.a -L$(LIBDIR) -Wl,-soname,$@
++
+ %.o:  %.c policy.h
+ 	$(CC) $(CFLAGS) $(TLSFLAGS) -c -o $@ $<
+ 
+@@ -77,20 +84,21 @@
  
  install: all 
  	test -d $(LIBDIR) || install -m 755 -d $(LIBDIR)
@@ -23,16 +528,25 @@
  	cd $(LIBDIR) && ln -sf ../../`basename $(SHLIBDIR)`/$(LIBSO) $(TARGET)
  
  install-pywrap: pywrap
- 	test -d $(PYTHONLIBDIR)/site-packages || install -m 755 -d $(PYTHONLIBDIR)/site-packages
+-	test -d $(PYTHONLIBDIR)/site-packages || install -m 755 -d $(PYTHONLIBDIR)/site-packages
 -	install -m 755 $(SWIGFILES) $(PYTHONLIBDIR)/site-packages
-+	install -m 755 $(SWIGSO) $(PYTHONLIBDIR)/site-packages
-+	install -m 644  selinux.py $(PYTHONLIBDIR)/site-packages
++	test -d $(PYTHONLIBDIR)/site-packages || install -m 755 -d $(PYTHONLIBDIR)/site-packages/selinux
++	install -m 755 $(SWIGSO) $(PYTHONLIBDIR)/site-packages/selinux
++	install -m 755 $(AUDIT2WHYSO) $(PYTHONLIBDIR)/site-packages/selinux
++	install -m 644  selinux.py $(PYTHONLIBDIR)/site-packages/selinux/__init_.py
  
  relabel:
  	/sbin/restorecon $(SHLIBDIR)/$(LIBSO)
+ 
+ clean: 
+-	-rm -f $(OBJS) $(LOBJS) $(LIBA) $(LIBSO) $(SWIGLOBJ) $(SWIGSO) $(TARGET) 
++	-rm -f $(OBJS) $(LOBJS) $(LIBA) $(LIBSO) $(SWIGLOBJ) $(SWIGSO) $(TARGET) $(AUDIT2WHYSO) *.o *.lo *~
+ 
+ distclean: clean
+ 	rm -f $(SWIGCOUT) $(SWIGFILES)
 diff --exclude-from=exclude -N -u -r nsalibselinux/src/matchpathcon.c libselinux-2.0.46/src/matchpathcon.c
 --- nsalibselinux/src/matchpathcon.c	2007-09-28 09:48:58.000000000 -0400
-+++ libselinux-2.0.46/src/matchpathcon.c	2008-01-03 15:23:32.000000000 -0500
++++ libselinux-2.0.46/src/matchpathcon.c	2008-01-10 13:25:57.000000000 -0500
 @@ -2,6 +2,7 @@
  #include <string.h>
  #include <errno.h>
@@ -52,7 +566,7 @@
  
 diff --exclude-from=exclude -N -u -r nsalibselinux/src/selinux.py libselinux-2.0.46/src/selinux.py
 --- nsalibselinux/src/selinux.py	2007-10-05 13:09:54.000000000 -0400
-+++ libselinux-2.0.46/src/selinux.py	2008-01-08 05:00:39.000000000 -0500
++++ libselinux-2.0.46/src/selinux.py	2008-01-10 13:26:25.000000000 -0500
 @@ -1,5 +1,5 @@
  # This file was automatically generated by SWIG (http://www.swig.org).
 -# Version 1.3.31
@@ -60,21 +574,29 @@
  #
  # Don't modify this file, modify the SWIG interface instead.
  # This file is compatible with both classic and new-style classes.
-Binary files nsalibselinux/src/selinux.pyc and libselinux-2.0.46/src/selinux.pyc differ
 diff --exclude-from=exclude -N -u -r nsalibselinux/src/selinuxswig.i libselinux-2.0.46/src/selinuxswig.i
 --- nsalibselinux/src/selinuxswig.i	2007-10-01 09:54:35.000000000 -0400
-+++ libselinux-2.0.46/src/selinuxswig.i	2008-01-08 05:00:22.000000000 -0500
-@@ -10,6 +10,7 @@
++++ libselinux-2.0.46/src/selinuxswig.i	2008-01-10 13:25:57.000000000 -0500
+@@ -5,11 +5,16 @@
+ %module selinux
+ %{
+ 	#include "selinux/selinux.h"
++	#include "../include/selinux/selinux.h"
++	#include "../include/selinux/get_default_type.h"
++	#include "../include/selinux/get_context_list.h"
+ %}
+ %apply int *OUTPUT { int *enforce };
  %apply int *OUTPUT { size_t * };
  
  %typedef unsigned mode_t;
 +%typedef unsigned pid_t;
++%typedef char * security_contextx_t;
  
  %typemap(in, numinputs=0) (char ***names, int *len) (char **temp1, int temp2) {
  	$1 = &temp1;
 diff --exclude-from=exclude -N -u -r nsalibselinux/src/selinuxswig_wrap.c libselinux-2.0.46/src/selinuxswig_wrap.c
 --- nsalibselinux/src/selinuxswig_wrap.c	2007-10-05 13:09:54.000000000 -0400
-+++ libselinux-2.0.46/src/selinuxswig_wrap.c	2008-01-08 05:00:39.000000000 -0500
++++ libselinux-2.0.46/src/selinuxswig_wrap.c	2008-01-10 13:26:25.000000000 -0500
 @@ -1,6 +1,6 @@
  /* ----------------------------------------------------------------------------
   * This file was automatically generated by SWIG (http://www.swig.org).
@@ -208,7 +730,17 @@
  #define SWIG_VERSION SWIGVERSION
  
  
-@@ -2577,14 +2584,12 @@
+@@ -2496,6 +2503,9 @@
+ 
+ 
+ 	#include "selinux/selinux.h"
++	#include "../include/selinux/selinux.h"
++	#include "../include/selinux/get_default_type.h"
++	#include "../include/selinux/get_context_list.h"
+ 
+ 
+   #define SWIG_From_long   PyInt_FromLong 
+@@ -2577,14 +2587,12 @@
  
  
  #include <limits.h>
@@ -229,7 +761,7 @@
  #endif
  
  
-@@ -2669,13 +2674,18 @@
+@@ -2669,13 +2677,18 @@
  
  
  SWIGINTERN int
@@ -252,7 +784,7 @@
      if (!PyErr_Occurred()) {
        if (val) *val = v;
        return SWIG_OK;
-@@ -2686,7 +2696,7 @@
+@@ -2686,7 +2699,7 @@
  #ifdef SWIG_PYTHON_CAST_MODE
    {
      int dispatch = 0;
@@ -261,7 +793,7 @@
      if (!PyErr_Occurred()) {
        if (val) *val = v;
        return SWIG_AddCast(SWIG_OK);
-@@ -2696,8 +2706,8 @@
+@@ -2696,8 +2709,8 @@
      if (!dispatch) {
        double d;
        int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
@@ -272,7 +804,7 @@
  	return res;
        }
      }
-@@ -2708,15 +2718,15 @@
+@@ -2708,15 +2721,15 @@
  
  
  SWIGINTERN int
@@ -293,7 +825,7 @@
      }
    }  
    return res;
-@@ -2724,18 +2734,13 @@
+@@ -2724,18 +2737,13 @@
  
  
  SWIGINTERN int
@@ -316,7 +848,7 @@
      if (!PyErr_Occurred()) {
        if (val) *val = v;
        return SWIG_OK;
-@@ -2746,7 +2751,7 @@
+@@ -2746,7 +2754,7 @@
  #ifdef SWIG_PYTHON_CAST_MODE
    {
      int dispatch = 0;
@@ -325,7 +857,7 @@
      if (!PyErr_Occurred()) {
        if (val) *val = v;
        return SWIG_AddCast(SWIG_OK);
-@@ -2756,8 +2761,8 @@
+@@ -2756,8 +2764,8 @@
      if (!dispatch) {
        double d;
        int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
@@ -336,7 +868,7 @@
  	return res;
        }
      }
-@@ -2768,15 +2773,15 @@
+@@ -2768,15 +2776,15 @@
  
  
  SWIGINTERN int
@@ -357,7 +889,7 @@
      }
    }  
    return res;
-@@ -2986,24 +2991,18 @@
+@@ -2986,24 +2994,18 @@
    pid_t arg1 ;
    security_context_t *arg2 = (security_context_t *) 0 ;
    int result;
@@ -389,7 +921,7 @@
    result = (int)getpidcon(arg1,arg2);
    resultobj = SWIG_From_int((int)(result));
    if (*arg2) {
-@@ -3025,24 +3024,18 @@
+@@ -3025,24 +3027,18 @@
    pid_t arg1 ;
    security_context_t *arg2 = (security_context_t *) 0 ;
    int result;
@@ -421,7 +953,7 @@
    result = (int)getpidcon_raw(arg1,arg2);
    resultobj = SWIG_From_int((int)(result));
    if (*arg2) {
-@@ -8149,7 +8142,7 @@
+@@ -8149,7 +8145,7 @@
  /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
  
  static swig_type_info _swigt__p_SELboolean = {"_p_SELboolean", "SELboolean *", 0, 0, (void*)0, 0};
@@ -430,7 +962,7 @@
  static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
  static swig_type_info _swigt__p_f_int_p_q_const__char_v_______int = {"_p_f_int_p_q_const__char_v_______int", "int (*)(int,char const *,...)", 0, 0, (void*)0, 0};
  static swig_type_info _swigt__p_f_p_p_char__int = {"_p_f_p_p_char__int", "int (*)(char **)|int (*)(security_context_t *)", 0, 0, (void*)0, 0};
-@@ -8158,12 +8151,11 @@
+@@ -8158,12 +8154,11 @@
  static swig_type_info _swigt__p_int = {"_p_int", "int *", 0, 0, (void*)0, 0};
  static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **|security_context_t *", 0, 0, (void*)0, 0};
  static swig_type_info _swigt__p_p_p_char = {"_p_p_p_char", "char ***|security_context_t **", 0, 0, (void*)0, 0};
@@ -448,7 +980,7 @@
  
  static swig_type_info *swig_type_initial[] = {
    &_swigt__p_SELboolean,
-@@ -8176,7 +8168,6 @@
+@@ -8176,7 +8171,6 @@
    &_swigt__p_int,
    &_swigt__p_p_char,
    &_swigt__p_p_p_char,
@@ -456,7 +988,7 @@
    &_swigt__p_security_class_mapping,
    &_swigt__p_selinux_callback,
    &_swigt__p_selinux_opt,
-@@ -8194,7 +8185,6 @@
+@@ -8194,7 +8188,6 @@
  static swig_cast_info _swigc__p_int[] = {  {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
  static swig_cast_info _swigc__p_p_char[] = {  {&_swigt__p_p_char, 0, 0, 0},{0, 0, 0, 0}};
  static swig_cast_info _swigc__p_p_p_char[] = {  {&_swigt__p_p_p_char, 0, 0, 0},{0, 0, 0, 0}};
@@ -464,7 +996,7 @@
  static swig_cast_info _swigc__p_security_class_mapping[] = {  {&_swigt__p_security_class_mapping, 0, 0, 0},{0, 0, 0, 0}};
  static swig_cast_info _swigc__p_selinux_callback[] = {  {&_swigt__p_selinux_callback, 0, 0, 0},{0, 0, 0, 0}};
  static swig_cast_info _swigc__p_selinux_opt[] = {  {&_swigt__p_selinux_opt, 0, 0, 0},{0, 0, 0, 0}};
-@@ -8212,7 +8202,6 @@
+@@ -8212,7 +8205,6 @@
    _swigc__p_int,
    _swigc__p_p_char,
    _swigc__p_p_p_char,
@@ -472,32 +1004,3 @@
    _swigc__p_security_class_mapping,
    _swigc__p_selinux_callback,
    _swigc__p_selinux_opt,
-diff --exclude-from=exclude -N -u -r nsalibselinux/utils/matchpathcon.c libselinux-2.0.46/utils/matchpathcon.c
---- nsalibselinux/utils/matchpathcon.c	2007-07-16 14:20:45.000000000 -0400
-+++ libselinux-2.0.46/utils/matchpathcon.c	2008-01-03 15:23:32.000000000 -0500
-@@ -17,10 +17,24 @@
- 	exit(1);
- }
- 
-+static void
-+#ifdef __GNUC__
-+    __attribute__ ((format(printf, 1, 2)))
-+#endif
-+    myprintf(const char *fmt, ...)
-+{
-+	va_list ap;
-+	va_start(ap, fmt);
-+	vfprintf(stderr, fmt, ap);
-+	va_end(ap);
-+}
-+
- int printmatchpathcon(char *path, int header, int mode)
- {
- 	char *buf;
--	int rc = matchpathcon(path, mode, &buf);
-+	int rc;
-+	set_matchpathcon_printf(myprintf);
-+	rc = matchpathcon(path, mode, &buf);
- 	if (rc < 0) {
- 		fprintf(stderr, "matchpathcon(%s) failed: %s\n", path,
- 			strerror(errno));


Index: libselinux.spec
===================================================================
RCS file: /cvs/extras/rpms/libselinux/devel/libselinux.spec,v
retrieving revision 1.298
retrieving revision 1.299
diff -u -r1.298 -r1.299
--- libselinux.spec	8 Jan 2008 10:25:03 -0000	1.298
+++ libselinux.spec	10 Jan 2008 18:32:52 -0000	1.299
@@ -2,7 +2,7 @@
 Summary: SELinux library and simple utilities
 Name: libselinux
 Version: 2.0.46
-Release: 4%{?dist}
+Release: 5%{?dist}
 License: Public Domain
 Group: System Environment/Libraries
 Source: http://www.nsa.gov/selinux/archives/%{name}-%{version}.tgz
@@ -119,10 +119,13 @@
 
 %files python
 %defattr(-,root,root,0755)
-%{_libdir}/python*/site-packages/_selinux.so
-%{_libdir}/python*/site-packages/selinux.py*
+%dir %{_libdir}/python*/site-packages/selinux
+%{_libdir}/python*/site-packages/selinux/*
 
 %changelog
+* Tue Jan 8 2008 Dan Walsh <dwalsh at redhat.com> - 2.0.46-5
+- Add audit2why python bindings
+
 * Tue Jan 8 2008 Dan Walsh <dwalsh at redhat.com> - 2.0.46-4
 - Add pid_t typemap for swig bindings
 




More information about the fedora-extras-commits mailing list