* [SEMANAGE][UTILS] Use PyList in bindings
@ 2006-02-02 20:45 Ivan Gyurdiev
2006-02-02 21:16 ` Ivan Gyurdiev
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Ivan Gyurdiev @ 2006-02-02 20:45 UTC (permalink / raw)
To: SELinux List; +Cc: Stephen Smalley, Joshua Brindle
[-- Attachment #1: Type: text/plain, Size: 1520 bytes --]
Okay, this patch is being the subject of controversy on IRC, so I wanted
to continue discussion on-list.
It's an API change in the python bindings only, which converts out-bound
arrays of objects (port, iface, boolean, etc..) to a PyList, which makes
them easier to work with, and better integrated with the target
language. Also, it fixes memory leak of the list structure (otherwise we
have to expose free() to address that). It eliminates the need for
get_by_idx functions, which are not really part of the libsemanage API.
Some problems w/ patch - it relies on some internal swig things - like
the output variable being called result (swig provides $result, but
that's in python, and I don't want to unpack it). Not sure if that's a
problem, I'm not sure this t_output_helper business is part of the
official API either. Also, swig is not very intelligent, and wants all
the argument names to match (despite the docs saying otherwise).
Joshua doesn't like it..says semanage.i should be portable to other
languages. However, I like better integration w/ python, so I think in
that case maybe it makes sense to have several .i files. Also, I'm not
sure the .i file is language portable right now - what will happen in a
language that doesn't support an output vector, so adding things to
result w/ t_output_helper doesn't necessarily make sense?
Also, how do I implement a binding for set_roles()? I want to unpack a
PyList into a char** array - requires understanding of python in the .i
file.
[-- Attachment #2: libsemanage.utils.pylist.diff --]
[-- Type: text/x-patch, Size: 17807 bytes --]
diff -Naurp --exclude-from excludes old/libsemanage/include/semanage/booleans_policy.h new/libsemanage/include/semanage/booleans_policy.h
--- old/libsemanage/include/semanage/booleans_policy.h 2006-01-13 08:37:09.000000000 -0500
+++ new/libsemanage/include/semanage/booleans_policy.h 2006-02-02 14:13:37.000000000 -0500
@@ -30,6 +30,6 @@ extern int semanage_bool_iterate(
extern int semanage_bool_list(
semanage_handle_t* handle,
semanage_bool_t*** records,
- unsigned int* size);
+ unsigned int* count);
#endif
diff -Naurp --exclude-from excludes old/libsemanage/src/pywrap-test.py new/libsemanage/src/pywrap-test.py
--- old/libsemanage/src/pywrap-test.py 2006-02-02 10:01:02.000000000 -0500
+++ new/libsemanage/src/pywrap-test.py 2006-02-02 14:58:04.000000000 -0500
@@ -114,7 +114,7 @@ class Tests:
print "Testing modules..."
(trans_cnt, mlist, mlist_size) = semanage.semanage_module_list(sh)
-
+
print "Transaction number: ", trans_cnt
print "Module list size: ", mlist_size
if self.verbose: print "List reference: ", mlist
@@ -125,27 +125,23 @@ class Tests:
return
for idx in range(mlist_size):
module = semanage.semanage_module_list_nth(mlist, idx)
- if self.verbose: print "Module reference: ", module
+ if self.verbose: print "Module reference: ", module
print "Module name: ", semanage.semanage_module_get_name(module)
print " Module version: ", semanage.semanage_module_get_version(module)
def test_seusers(self,sh):
print "Testing seusers..."
- (status, slist, slist_size) = semanage.semanage_seuser_list(sh)
+ (status, slist) = semanage.semanage_seuser_list(sh)
if status < 0:
raise Error("Could not list seusers")
print "Query status (commit number): ", status
- print "SEUser list size: ", slist_size
- if self.verbose: print "List reference: ", slist
-
- if (slist_size == 0):
+ if ( len(slist) == 0):
print "No seusers found!"
print "This is not necessarily a test failure."
return
- for idx in range(slist_size):
- seuser = semanage.semanage_seuser_by_idx(slist, idx)
+ for seuser in slist:
if self.verbose: print "seseuser reference: ", seuser
print "seuser name: ", semanage.semanage_seuser_get_name(seuser)
print " seuser mls range: ", semanage.semanage_seuser_get_mlsrange(seuser)
@@ -155,20 +151,16 @@ class Tests:
def test_users(self,sh):
print "Testing users..."
- (status, ulist, ulist_size) = semanage.semanage_user_list(sh)
+ (status, ulist) = semanage.semanage_user_list(sh)
if status < 0:
raise Error("Could not list users")
print "Query status (commit number): ", status
- print "User list size: ", ulist_size
- if self.verbose: print "List reference: ", ulist
-
- if (ulist_size == 0):
+ if ( len(ulist) == 0):
print "No users found!"
print "This is not necessarily a test failure."
return
- for idx in range(ulist_size):
- user = semanage.semanage_user_by_idx(ulist, idx)
+ for user in ulist:
if self.verbose: print "User reference: ", user
print "User name: ", semanage.semanage_user_get_name(user)
print " User labeling prefix: ", semanage.semanage_user_get_prefix(user)
@@ -187,20 +179,16 @@ class Tests:
def test_ports(self,sh):
print "Testing ports..."
- (status, plist, plist_size) = semanage.semanage_port_list(sh)
+ (status, plist) = semanage.semanage_port_list(sh)
if status < 0:
raise Error("Could not list ports")
print "Query status (commit number): ", status
- print "Port list size: ", plist_size
- if self.verbose: print "List reference: ", plist
-
- if (plist_size == 0):
+ if ( len(plist) == 0):
print "No ports found!"
print "This is not necessarily a test failure."
return
- for idx in range(plist_size):
- port = semanage.semanage_port_by_idx(plist, idx)
+ for port in plist:
if self.verbose: print "Port reference: ", port
low = semanage.semanage_port_get_low(port)
high = semanage.semanage_port_get_high(port)
@@ -219,20 +207,16 @@ class Tests:
def test_fcontexts(self,sh):
print "Testing file contexts..."
- (status, flist, flist_size) = semanage.semanage_fcontext_list(sh)
+ (status, flist) = semanage.semanage_fcontext_list(sh)
if status < 0:
raise Error("Could not list file contexts")
print "Query status (commit number): ", status
- print "File Context list size: ", flist_size
- if self.verbose: print "List reference: ", flist
-
- if (flist_size == 0):
+ if (len(flist) == 0):
print "No file contexts found!"
print "This is not necessarily a test failure."
return
- for idx in range(flist_size):
- fcon = semanage.semanage_fcontext_by_idx(flist, idx)
+ for fcon in flist:
if self.verbose: print "File Context reference: ", fcon
expr = semanage.semanage_fcontext_get_expr(fcon)
type = semanage.semanage_fcontext_get_type(fcon)
@@ -249,20 +233,16 @@ class Tests:
def test_interfaces(self,sh):
print "Testing network interfaces..."
- (status, ilist, ilist_size) = semanage.semanage_iface_list(sh)
+ (status, ilist) = semanage.semanage_iface_list(sh)
if status < 0:
raise Error("Could not list interfaces")
print "Query status (commit number): ", status
- print "Interfaces list size: ", ilist_size
- if self.verbose: print "List reference: ", ilist
-
- if (ilist_size == 0):
+ if (len(ilist) == 0):
print "No network interfaces found!"
print "This is not necessarily a test failure."
return
- for idx in range(ilist_size):
- iface = semanage.semanage_iface_by_idx(ilist, idx)
+ for iface in ilist:
if self.verbose: print "Interface reference: ", iface
name = semanage.semanage_iface_get_name(iface)
msg_con = semanage.semanage_iface_get_msgcon(iface)
@@ -277,20 +257,16 @@ class Tests:
def test_booleans(self,sh):
print "Testing booleans..."
- (status, blist, blist_size) = semanage.semanage_bool_list(sh)
+ (status, blist) = semanage.semanage_bool_list(sh)
if status < 0:
raise Error("Could not list booleans")
print "Query status (commit number): ", status
- print "Booleans list size: ", blist_size
- if self.verbose: print "List reference: ", blist
-
- if (blist_size == 0):
+ if (len(blist) == 0):
print "No booleans found!"
print "This is not necessarily a test failure."
return
- for idx in range(blist_size):
- pbool = semanage.semanage_bool_by_idx(blist, idx)
+ for pbool in blist:
if self.verbose: print "Boolean reference: ", pbool
name = semanage.semanage_bool_get_name(pbool)
value = semanage.semanage_bool_get_value(pbool)
@@ -300,20 +276,16 @@ class Tests:
def test_abooleans(self,sh):
print "Testing active booleans..."
- (status, ablist, ablist_size) = semanage.semanage_bool_list_active(sh)
+ (status, ablist) = semanage.semanage_bool_list_active(sh)
if status < 0:
raise Error("Could not list active booleans")
print "Query status (commit number): ", status
- print "Active Booleans list size: ", ablist_size
- if self.verbose: print "List reference: ", ablist
-
- if (ablist_size == 0):
+ if (len(ablist) == 0):
print "No active booleans found!"
print "This is not necessarily a test failure."
return
- for idx in range(ablist_size):
- abool = semanage.semanage_bool_by_idx(ablist, idx)
+ for abool in ablist:
if self.verbose: print "Active boolean reference: ", abool
name = semanage.semanage_bool_get_name(abool)
value = semanage.semanage_bool_get_value(abool)
diff -Naurp --exclude-from excludes old/libsemanage/src/semanageswig.i new/libsemanage/src/semanageswig.i
--- old/libsemanage/src/semanageswig.i 2006-01-30 15:05:58.000000000 -0500
+++ new/libsemanage/src/semanageswig.i 2006-02-02 14:45:35.000000000 -0500
@@ -47,24 +47,6 @@
%}
%inline {
- 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) {
- return list[n];
- }
- semanage_port_t *semanage_port_by_idx(semanage_port_t **list, int n) {
- return list[n];
- }
- semanage_iface_t *semanage_iface_by_idx(semanage_iface_t **list, int n) {
- return list[n];
- }
- semanage_bool_t *semanage_bool_by_idx(semanage_bool_t **list, int n) {
- return list[n];
- }
- semanage_fcontext_t *semanage_fcontext_by_idx(semanage_fcontext_t **list, int n) {
- return list[n];
- }
char *char_by_idx(char **list, int n) {
return list[n];
}
@@ -129,8 +111,21 @@
$1 = &temp;
}
-%typemap(argout) semanage_bool_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_bool, 0));
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_bool_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_bool, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
}
%typemap(in, numinputs=0) semanage_bool_t **(semanage_bool_t *temp) {
@@ -157,8 +152,21 @@
$1 = &temp;
}
-%typemap(argout) semanage_fcontext_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_fcontext, 0));
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_fcontext_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_fcontext, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
}
%typemap(in, numinputs=0) semanage_fcontext_t **(semanage_fcontext_t *temp) {
@@ -185,9 +193,22 @@
$1 = &temp;
}
-%typemap(argout) semanage_iface_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_iface, 0));
-}
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_iface_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_iface, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
%typemap(in, numinputs=0) semanage_iface_t **(semanage_iface_t *temp) {
$1 = &temp;
@@ -213,9 +234,22 @@
$1 = &temp;
}
-%typemap(argout) semanage_seuser_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_seuser, 0));
-}
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_seuser_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_seuser, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
%typemap(in, numinputs=0) semanage_seuser_t **(semanage_seuser_t *temp) {
$1 = &temp;
@@ -241,10 +275,23 @@
$1 = &temp;
}
-%typemap(argout) semanage_user_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_user, 0));
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_user_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_user, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
}
-
+
%typemap(in, numinputs=0) semanage_user_t **(semanage_user_t *temp) {
$1 = &temp;
}
@@ -269,9 +316,22 @@
$1 = &temp;
}
-%typemap(argout) semanage_port_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_port, 0));
-}
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_port_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_port, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
%typemap(in, numinputs=0) semanage_port_t **(semanage_port_t *temp) {
$1 = &temp;
diff -Naurp --exclude-from excludes old/policycoreutils/scripts/genhomedircon new/policycoreutils/scripts/genhomedircon
--- old/policycoreutils/scripts/genhomedircon 2006-01-30 15:29:09.000000000 -0500
+++ new/policycoreutils/scripts/genhomedircon 2006-02-02 15:16:20.000000000 -0500
@@ -135,7 +135,7 @@ class selinuxConfig:
self.semanaged=semanage_is_managed(self.semanageHandle)
if self.semanaged:
semanage_connect(self.semanageHandle)
- (status, self.ulist, self.usize) = semanage_user_list(self.semanageHandle)
+ (status, self.ulist) = semanage_user_list(self.semanageHandle)
self.type=type
self.selinuxdir=selinuxdir +"/"
self.contextdir="/contexts"
@@ -176,8 +176,7 @@ class selinuxConfig:
return ret
def defaultrole(self, name):
- for idx in range(self.usize):
- user = semanage_user_by_idx(self.ulist, idx)
+ for user in self.ulist:
if semanage_user_get_name(user) == name:
if name == "staff_u" or name == "root" and self.type != "targeted":
return "staff_r"
@@ -224,10 +223,9 @@ class selinuxConfig:
def getUsers(self):
udict = {}
if self.semanaged:
- (status, list, lsize) = semanage_seuser_list(self.semanageHandle)
- for idx in range(lsize):
+ (status, list) = semanage_seuser_list(self.semanageHandle)
+ for seuser in list:
user=[]
- seuser = semanage_seuser_by_idx(list, idx)
seusername=semanage_seuser_get_sename(seuser)
self.adduser(udict, semanage_seuser_get_name(seuser), seusername, self.defaultrole(seusername))
diff -Naurp --exclude-from excludes old/policycoreutils/semanage/seobject.py new/policycoreutils/semanage/seobject.py
--- old/policycoreutils/semanage/seobject.py 2006-02-02 10:01:02.000000000 -0500
+++ new/policycoreutils/semanage/seobject.py 2006-02-02 15:03:34.000000000 -0500
@@ -288,12 +288,11 @@ class loginRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.ulist, self.usize) = semanage_seuser_list(self.sh)
+ (rc, self.ulist) = semanage_seuser_list(self.sh)
if rc < 0:
raise ValueError("Could not list login mappings")
- for idx in range(self.usize):
- u = semanage_seuser_by_idx(self.ulist, idx)
+ for u in self.ulist:
name = semanage_seuser_get_name(u)
ddict[name]=(semanage_seuser_get_sename(u), semanage_seuser_get_mlsrange(u))
return ddict
@@ -447,12 +446,11 @@ class seluserRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.ulist, self.usize) = semanage_user_list(self.sh)
+ (rc, self.ulist) = semanage_user_list(self.sh)
if rc < 0:
raise ValueError("Could not list SELinux users")
- for idx in range(self.usize):
- u = semanage_user_by_idx(self.ulist, idx)
+ for u in self.ulist:
name = semanage_user_get_name(u)
(rc, rlist, rlist_size) = semanage_user_get_roles(self.sh, u)
if rc < 0:
@@ -637,12 +635,11 @@ class portRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.plist, self.psize) = semanage_port_list(self.sh)
+ (rc, self.plist) = semanage_port_list(self.sh)
if rc < 0:
raise ValueError("Could not list ports")
- for idx in range(self.psize):
- port = semanage_port_by_idx(self.plist, idx)
+ for port in self.plist:
con = semanage_port_get_con(port)
ctype = semanage_context_get_type(con)
if ctype == "reserved_port_t":
@@ -657,12 +654,11 @@ class portRecords(semanageRecords):
def get_all_by_type(self):
ddict={}
- (rc, self.plist, self.psize) = semanage_port_list(self.sh)
+ (rc, self.plist) = semanage_port_list(self.sh)
if rc < 0:
raise ValueError("Could not list ports")
- for idx in range(self.psize):
- port = semanage_port_by_idx(self.plist, idx)
+ for port in self.plist:
con = semanage_port_get_con(port)
ctype = semanage_context_get_type(con)
if ctype == "reserved_port_t":
@@ -837,12 +833,11 @@ class interfaceRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.plist, self.psize) = semanage_iface_list(self.sh)
+ (rc, self.ilist) = semanage_iface_list(self.sh)
if rc < 0:
raise ValueError("Could not list interfaces")
- for idx in range(self.psize):
- interface = semanage_iface_by_idx(self.plist, idx)
+ for interface in self.ilist:
con = semanage_iface_get_ifcon(interface)
ddict[semanage_iface_get_name(interface)]=(semanage_context_get_user(con), semanage_context_get_role(con), semanage_context_get_type(con), semanage_context_get_mls(con))
@@ -1022,12 +1017,11 @@ class fcontextRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.plist, self.psize) = semanage_fcontext_list(self.sh)
+ (rc, self.flist) = semanage_fcontext_list(self.sh)
if rc < 0:
raise ValueError("Could not list file contexts")
- for idx in range(self.psize):
- fcontext = semanage_fcontext_by_idx(self.plist, idx)
+ for fcontext in self.flist:
expr = semanage_fcontext_get_expr(fcontext)
ftype = semanage_fcontext_get_type(fcontext)
ftype_str = semanage_fcontext_get_type_str(ftype)
@@ -1124,12 +1118,11 @@ class booleanRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.blist, self.bsize) = semanage_bool_list(self.sh)
+ (rc, self.blist) = semanage_bool_list(self.sh)
if rc < 0:
raise ValueError("Could not list booleans")
- for idx in range(self.bsize):
- boolean = semanage_bool_by_idx(self.blist, idx)
+ for boolean in self.blist:
name = semanage_bool_get_name(boolean)
value = semanage_bool_get_value(boolean)
ddict[name] = value
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [SEMANAGE][UTILS] Use PyList in bindings
2006-02-02 20:45 [SEMANAGE][UTILS] Use PyList in bindings Ivan Gyurdiev
@ 2006-02-02 21:16 ` Ivan Gyurdiev
2006-02-03 14:00 ` Stephen Smalley
2006-02-14 10:59 ` Ivan Gyurdiev
2 siblings, 0 replies; 10+ messages in thread
From: Ivan Gyurdiev @ 2006-02-02 21:16 UTC (permalink / raw)
To: SELinux List; +Cc: Stephen Smalley, Joshua Brindle
[-- Attachment #1: Type: text/plain, Size: 192 bytes --]
On the same note, this patch fixes a memory leak in the wrapper for
things like:
semanage_context_to_string.
It's most likely language-portable (SWIG_FromCharPtr marks argument as
const).
[-- Attachment #2: libsemanage.python_string_leak.diff --]
[-- Type: text/x-patch, Size: 433 bytes --]
diff -Naurp --exclude-from excludes old/libsemanage/src/semanageswig.i new/libsemanage/src/semanageswig.i
--- old/libsemanage/src/semanageswig.i 2006-02-02 16:12:36.000000000 -0500
+++ new/libsemanage/src/semanageswig.i 2006-02-02 15:53:40.000000000 -0500
@@ -69,6 +69,7 @@
%typemap(argout) char** {
$result = t_output_helper($result, SWIG_FromCharPtr(*$1));
+ free(*$1);
}
%typemap(in, numinputs=0) char ***(char **temp) {
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [SEMANAGE][UTILS] Use PyList in bindings
2006-02-02 20:45 [SEMANAGE][UTILS] Use PyList in bindings Ivan Gyurdiev
2006-02-02 21:16 ` Ivan Gyurdiev
@ 2006-02-03 14:00 ` Stephen Smalley
2006-02-03 14:36 ` Joshua Brindle
2006-02-14 10:59 ` Ivan Gyurdiev
2 siblings, 1 reply; 10+ messages in thread
From: Stephen Smalley @ 2006-02-03 14:00 UTC (permalink / raw)
To: Ivan Gyurdiev; +Cc: SELinux List, Joshua Brindle
On Thu, 2006-02-02 at 15:45 -0500, Ivan Gyurdiev wrote:
> Okay, this patch is being the subject of controversy on IRC, so I wanted
> to continue discussion on-list.
>
> It's an API change in the python bindings only, which converts out-bound
> arrays of objects (port, iface, boolean, etc..) to a PyList, which makes
> them easier to work with, and better integrated with the target
> language. Also, it fixes memory leak of the list structure (otherwise we
> have to expose free() to address that). It eliminates the need for
> get_by_idx functions, which are not really part of the libsemanage API.
>
> Some problems w/ patch - it relies on some internal swig things - like
> the output variable being called result (swig provides $result, but
> that's in python, and I don't want to unpack it). Not sure if that's a
> problem, I'm not sure this t_output_helper business is part of the
> official API either. Also, swig is not very intelligent, and wants all
> the argument names to match (despite the docs saying otherwise).
>
> Joshua doesn't like it..says semanage.i should be portable to other
> languages. However, I like better integration w/ python, so I think in
> that case maybe it makes sense to have several .i files. Also, I'm not
> sure the .i file is language portable right now - what will happen in a
> language that doesn't support an output vector, so adding things to
> result w/ t_output_helper doesn't necessarily make sense?
>
> Also, how do I implement a binding for set_roles()? I want to unpack a
> PyList into a char** array - requires understanding of python in the .i
> file.
Abstractly (while confessing total ignorance of swig), I would agree
that we shouldn't cripple the python bindings for libsemanage just to
allow a single interface file to be re-useable for other bindings. That
said, I'm a little hesitant to merge without greater consensus and FC5
is very close to devel freeze. Not sure what expectations are for
stability of python bindings API...
--
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] 10+ messages in thread
* Re: [SEMANAGE][UTILS] Use PyList in bindings
2006-02-03 14:00 ` Stephen Smalley
@ 2006-02-03 14:36 ` Joshua Brindle
0 siblings, 0 replies; 10+ messages in thread
From: Joshua Brindle @ 2006-02-03 14:36 UTC (permalink / raw)
To: Stephen Smalley; +Cc: Ivan Gyurdiev, SELinux List
Stephen Smalley wrote:
> On Thu, 2006-02-02 at 15:45 -0500, Ivan Gyurdiev wrote:
>> Okay, this patch is being the subject of controversy on IRC, so I wanted
>> to continue discussion on-list.
>>
>> It's an API change in the python bindings only, which converts out-bound
>> arrays of objects (port, iface, boolean, etc..) to a PyList, which makes
>> them easier to work with, and better integrated with the target
>> language. Also, it fixes memory leak of the list structure (otherwise we
>> have to expose free() to address that). It eliminates the need for
>> get_by_idx functions, which are not really part of the libsemanage API.
>>
>> Some problems w/ patch - it relies on some internal swig things - like
>> the output variable being called result (swig provides $result, but
>> that's in python, and I don't want to unpack it). Not sure if that's a
>> problem, I'm not sure this t_output_helper business is part of the
>> official API either. Also, swig is not very intelligent, and wants all
>> the argument names to match (despite the docs saying otherwise).
>>
>> Joshua doesn't like it..says semanage.i should be portable to other
>> languages. However, I like better integration w/ python, so I think in
>> that case maybe it makes sense to have several .i files. Also, I'm not
>> sure the .i file is language portable right now - what will happen in a
>> language that doesn't support an output vector, so adding things to
>> result w/ t_output_helper doesn't necessarily make sense?
>>
>> Also, how do I implement a binding for set_roles()? I want to unpack a
>> PyList into a char** array - requires understanding of python in the .i
>> file.
>
> Abstractly (while confessing total ignorance of swig), I would agree
> that we shouldn't cripple the python bindings for libsemanage just to
> allow a single interface file to be re-useable for other bindings. That
> said, I'm a little hesitant to merge without greater consensus and FC5
> is very close to devel freeze. Not sure what expectations are for
> stability of python bindings API...
>
I don't disagree, my points were that 1) we don't want to totally
eliminate the ability to build bindings for other languages and 2) we
don't want to make maintenance of the bindings more difficult. If the
python bindings are much better now (I'm no python developer so I don't
know what pylists give us) then I don't have a problem merging it into a
seperate .i file. I think we should reuse as much as possible so that
it's easier to maintain if we ever want to support another binding.
--
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] 10+ messages in thread
* Re: [SEMANAGE][UTILS] Use PyList in bindings
2006-02-02 20:45 [SEMANAGE][UTILS] Use PyList in bindings Ivan Gyurdiev
2006-02-02 21:16 ` Ivan Gyurdiev
2006-02-03 14:00 ` Stephen Smalley
@ 2006-02-14 10:59 ` Ivan Gyurdiev
2006-02-14 12:08 ` Move python bindings into semanageswig_python.i Ivan Gyurdiev
2006-02-14 18:57 ` [SEMANAGE][UTILS] Use PyList in bindings Stephen Smalley
2 siblings, 2 replies; 10+ messages in thread
From: Ivan Gyurdiev @ 2006-02-14 10:59 UTC (permalink / raw)
To: SELinux List; +Cc: Stephen Smalley
[-- Attachment #1: Type: text/plain, Size: 67 bytes --]
Attached is a resync of this patch against current genhomedircon.
[-- Attachment #2: libsemanage.utils.pylist2.diff --]
[-- Type: text/x-patch, Size: 17926 bytes --]
diff -Naurp --exclude-from excludes old/libsemanage/include/semanage/booleans_policy.h new/libsemanage/include/semanage/booleans_policy.h
--- old/libsemanage/include/semanage/booleans_policy.h 2006-02-14 05:41:35.000000000 -0500
+++ new/libsemanage/include/semanage/booleans_policy.h 2006-02-02 14:13:37.000000000 -0500
@@ -30,6 +30,6 @@ extern int semanage_bool_iterate(
extern int semanage_bool_list(
semanage_handle_t* handle,
semanage_bool_t*** records,
- unsigned int* size);
+ unsigned int* count);
#endif
diff -Naurp --exclude-from excludes old/libsemanage/src/pywrap-test.py new/libsemanage/src/pywrap-test.py
--- old/libsemanage/src/pywrap-test.py 2006-02-14 05:41:35.000000000 -0500
+++ new/libsemanage/src/pywrap-test.py 2006-02-05 01:30:04.000000000 -0500
@@ -124,7 +124,7 @@ class Tests:
print "Testing modules..."
(trans_cnt, mlist, mlist_size) = semanage.semanage_module_list(sh)
-
+
print "Transaction number: ", trans_cnt
print "Module list size: ", mlist_size
if self.verbose: print "List reference: ", mlist
@@ -135,27 +135,23 @@ class Tests:
return
for idx in range(mlist_size):
module = semanage.semanage_module_list_nth(mlist, idx)
- if self.verbose: print "Module reference: ", module
+ if self.verbose: print "Module reference: ", module
print "Module name: ", semanage.semanage_module_get_name(module)
print " Module version: ", semanage.semanage_module_get_version(module)
def test_seusers(self,sh):
print "Testing seusers..."
- (status, slist, slist_size) = semanage.semanage_seuser_list(sh)
+ (status, slist) = semanage.semanage_seuser_list(sh)
if status < 0:
raise Error("Could not list seusers")
print "Query status (commit number): ", status
- print "SEUser list size: ", slist_size
- if self.verbose: print "List reference: ", slist
-
- if (slist_size == 0):
+ if ( len(slist) == 0):
print "No seusers found!"
print "This is not necessarily a test failure."
return
- for idx in range(slist_size):
- seuser = semanage.semanage_seuser_by_idx(slist, idx)
+ for seuser in slist:
if self.verbose: print "seseuser reference: ", seuser
print "seuser name: ", semanage.semanage_seuser_get_name(seuser)
print " seuser mls range: ", semanage.semanage_seuser_get_mlsrange(seuser)
@@ -165,20 +161,16 @@ class Tests:
def test_users(self,sh):
print "Testing users..."
- (status, ulist, ulist_size) = semanage.semanage_user_list(sh)
+ (status, ulist) = semanage.semanage_user_list(sh)
if status < 0:
raise Error("Could not list users")
print "Query status (commit number): ", status
- print "User list size: ", ulist_size
- if self.verbose: print "List reference: ", ulist
-
- if (ulist_size == 0):
+ if ( len(ulist) == 0):
print "No users found!"
print "This is not necessarily a test failure."
return
- for idx in range(ulist_size):
- user = semanage.semanage_user_by_idx(ulist, idx)
+ for user in ulist:
if self.verbose: print "User reference: ", user
print "User name: ", semanage.semanage_user_get_name(user)
print " User labeling prefix: ", semanage.semanage_user_get_prefix(user)
@@ -197,20 +189,16 @@ class Tests:
def test_ports(self,sh):
print "Testing ports..."
- (status, plist, plist_size) = semanage.semanage_port_list(sh)
+ (status, plist) = semanage.semanage_port_list(sh)
if status < 0:
raise Error("Could not list ports")
print "Query status (commit number): ", status
- print "Port list size: ", plist_size
- if self.verbose: print "List reference: ", plist
-
- if (plist_size == 0):
+ if ( len(plist) == 0):
print "No ports found!"
print "This is not necessarily a test failure."
return
- for idx in range(plist_size):
- port = semanage.semanage_port_by_idx(plist, idx)
+ for port in plist:
if self.verbose: print "Port reference: ", port
low = semanage.semanage_port_get_low(port)
high = semanage.semanage_port_get_high(port)
@@ -229,20 +217,16 @@ class Tests:
def test_fcontexts(self,sh):
print "Testing file contexts..."
- (status, flist, flist_size) = semanage.semanage_fcontext_list(sh)
+ (status, flist) = semanage.semanage_fcontext_list(sh)
if status < 0:
raise Error("Could not list file contexts")
print "Query status (commit number): ", status
- print "File Context list size: ", flist_size
- if self.verbose: print "List reference: ", flist
-
- if (flist_size == 0):
+ if (len(flist) == 0):
print "No file contexts found!"
print "This is not necessarily a test failure."
return
- for idx in range(flist_size):
- fcon = semanage.semanage_fcontext_by_idx(flist, idx)
+ for fcon in flist:
if self.verbose: print "File Context reference: ", fcon
expr = semanage.semanage_fcontext_get_expr(fcon)
type = semanage.semanage_fcontext_get_type(fcon)
@@ -259,20 +243,16 @@ class Tests:
def test_interfaces(self,sh):
print "Testing network interfaces..."
- (status, ilist, ilist_size) = semanage.semanage_iface_list(sh)
+ (status, ilist) = semanage.semanage_iface_list(sh)
if status < 0:
raise Error("Could not list interfaces")
print "Query status (commit number): ", status
- print "Interfaces list size: ", ilist_size
- if self.verbose: print "List reference: ", ilist
-
- if (ilist_size == 0):
+ if (len(ilist) == 0):
print "No network interfaces found!"
print "This is not necessarily a test failure."
return
- for idx in range(ilist_size):
- iface = semanage.semanage_iface_by_idx(ilist, idx)
+ for iface in ilist:
if self.verbose: print "Interface reference: ", iface
name = semanage.semanage_iface_get_name(iface)
msg_con = semanage.semanage_iface_get_msgcon(iface)
@@ -287,20 +267,16 @@ class Tests:
def test_booleans(self,sh):
print "Testing booleans..."
- (status, blist, blist_size) = semanage.semanage_bool_list(sh)
+ (status, blist) = semanage.semanage_bool_list(sh)
if status < 0:
raise Error("Could not list booleans")
print "Query status (commit number): ", status
- print "Booleans list size: ", blist_size
- if self.verbose: print "List reference: ", blist
-
- if (blist_size == 0):
+ if (len(blist) == 0):
print "No booleans found!"
print "This is not necessarily a test failure."
return
- for idx in range(blist_size):
- pbool = semanage.semanage_bool_by_idx(blist, idx)
+ for pbool in blist:
if self.verbose: print "Boolean reference: ", pbool
name = semanage.semanage_bool_get_name(pbool)
value = semanage.semanage_bool_get_value(pbool)
@@ -310,20 +286,16 @@ class Tests:
def test_abooleans(self,sh):
print "Testing active booleans..."
- (status, ablist, ablist_size) = semanage.semanage_bool_list_active(sh)
+ (status, ablist) = semanage.semanage_bool_list_active(sh)
if status < 0:
raise Error("Could not list active booleans")
print "Query status (commit number): ", status
- print "Active Booleans list size: ", ablist_size
- if self.verbose: print "List reference: ", ablist
-
- if (ablist_size == 0):
+ if (len(ablist) == 0):
print "No active booleans found!"
print "This is not necessarily a test failure."
return
- for idx in range(ablist_size):
- abool = semanage.semanage_bool_by_idx(ablist, idx)
+ for abool in ablist:
if self.verbose: print "Active boolean reference: ", abool
name = semanage.semanage_bool_get_name(abool)
value = semanage.semanage_bool_get_value(abool)
diff -Naurp --exclude-from excludes old/libsemanage/src/semanageswig.i new/libsemanage/src/semanageswig.i
--- old/libsemanage/src/semanageswig.i 2006-02-14 05:41:35.000000000 -0500
+++ new/libsemanage/src/semanageswig.i 2006-02-03 20:59:05.000000000 -0500
@@ -50,24 +50,6 @@
%}
%inline {
- 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) {
- return list[n];
- }
- semanage_port_t *semanage_port_by_idx(semanage_port_t **list, int n) {
- return list[n];
- }
- semanage_iface_t *semanage_iface_by_idx(semanage_iface_t **list, int n) {
- return list[n];
- }
- semanage_bool_t *semanage_bool_by_idx(semanage_bool_t **list, int n) {
- return list[n];
- }
- semanage_fcontext_t *semanage_fcontext_by_idx(semanage_fcontext_t **list, int n) {
- return list[n];
- }
char *char_by_idx(char **list, int n) {
return list[n];
}
@@ -133,8 +115,21 @@
$1 = &temp;
}
-%typemap(argout) semanage_bool_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_bool, 0));
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_bool_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_bool, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
}
%typemap(in, numinputs=0) semanage_bool_t **(semanage_bool_t *temp) {
@@ -161,8 +156,21 @@
$1 = &temp;
}
-%typemap(argout) semanage_fcontext_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_fcontext, 0));
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_fcontext_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_fcontext, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
}
%typemap(in, numinputs=0) semanage_fcontext_t **(semanage_fcontext_t *temp) {
@@ -189,9 +197,22 @@
$1 = &temp;
}
-%typemap(argout) semanage_iface_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_iface, 0));
-}
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_iface_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_iface, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
%typemap(in, numinputs=0) semanage_iface_t **(semanage_iface_t *temp) {
$1 = &temp;
@@ -217,9 +238,22 @@
$1 = &temp;
}
-%typemap(argout) semanage_seuser_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_seuser, 0));
-}
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_seuser_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_seuser, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
%typemap(in, numinputs=0) semanage_seuser_t **(semanage_seuser_t *temp) {
$1 = &temp;
@@ -245,10 +279,23 @@
$1 = &temp;
}
-%typemap(argout) semanage_user_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_user, 0));
-}
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_user_t*** records,
+ unsigned int* count) {
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_user, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
+
%typemap(in, numinputs=0) semanage_user_t **(semanage_user_t *temp) {
$1 = &temp;
}
@@ -273,9 +320,22 @@
$1 = &temp;
}
-%typemap(argout) semanage_port_t *** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_semanage_port, 0));
-}
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_port_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_port, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
%typemap(in, numinputs=0) semanage_port_t **(semanage_port_t *temp) {
$1 = &temp;
diff -Naurp --exclude-from excludes old/policycoreutils/scripts/genhomedircon new/policycoreutils/scripts/genhomedircon
--- old/policycoreutils/scripts/genhomedircon 2006-02-14 05:42:08.000000000 -0500
+++ new/policycoreutils/scripts/genhomedircon 2006-02-14 05:57:04.000000000 -0500
@@ -133,7 +133,7 @@ class selinuxConfig:
self.semanaged=semanage_is_managed(self.semanageHandle)
if self.semanaged:
semanage_connect(self.semanageHandle)
- (status, self.ulist, self.usize) = semanage_user_list(self.semanageHandle)
+ (status, self.ulist) = semanage_user_list(self.semanageHandle)
self.type=type
self.selinuxdir=selinuxdir +"/"
self.contextdir="/contexts"
@@ -174,11 +174,11 @@ class selinuxConfig:
return ret
def get_default_prefix(self, name):
- for idx in range(self.usize):
- user = semanage_user_by_idx(self.ulist, idx)
+ for user in self.ulist:
if semanage_user_get_name(user) == name:
return semanage_user_get_prefix(user)
return name
+
def get_old_prefix(self, user):
rc=grep(self.selinuxdir+self.type+"/users/system.users", "^user %s" % user)
if rc == "":
@@ -219,10 +219,9 @@ class selinuxConfig:
def getUsers(self):
udict = {}
if self.semanaged:
- (status, list, lsize) = semanage_seuser_list(self.semanageHandle)
- for idx in range(lsize):
+ (status, list) = semanage_seuser_list(self.semanageHandle)
+ for seuser in list:
user=[]
- seuser = semanage_seuser_by_idx(list, idx)
seusername=semanage_seuser_get_sename(seuser)
self.adduser(udict, semanage_seuser_get_name(seuser), seusername, self.get_default_prefix(seusername))
diff -Naurp --exclude-from excludes old/policycoreutils/semanage/seobject.py new/policycoreutils/semanage/seobject.py
--- old/policycoreutils/semanage/seobject.py 2006-02-14 05:41:35.000000000 -0500
+++ new/policycoreutils/semanage/seobject.py 2006-02-02 15:03:34.000000000 -0500
@@ -288,12 +288,11 @@ class loginRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.ulist, self.usize) = semanage_seuser_list(self.sh)
+ (rc, self.ulist) = semanage_seuser_list(self.sh)
if rc < 0:
raise ValueError("Could not list login mappings")
- for idx in range(self.usize):
- u = semanage_seuser_by_idx(self.ulist, idx)
+ for u in self.ulist:
name = semanage_seuser_get_name(u)
ddict[name]=(semanage_seuser_get_sename(u), semanage_seuser_get_mlsrange(u))
return ddict
@@ -447,12 +446,11 @@ class seluserRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.ulist, self.usize) = semanage_user_list(self.sh)
+ (rc, self.ulist) = semanage_user_list(self.sh)
if rc < 0:
raise ValueError("Could not list SELinux users")
- for idx in range(self.usize):
- u = semanage_user_by_idx(self.ulist, idx)
+ for u in self.ulist:
name = semanage_user_get_name(u)
(rc, rlist, rlist_size) = semanage_user_get_roles(self.sh, u)
if rc < 0:
@@ -637,12 +635,11 @@ class portRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.plist, self.psize) = semanage_port_list(self.sh)
+ (rc, self.plist) = semanage_port_list(self.sh)
if rc < 0:
raise ValueError("Could not list ports")
- for idx in range(self.psize):
- port = semanage_port_by_idx(self.plist, idx)
+ for port in self.plist:
con = semanage_port_get_con(port)
ctype = semanage_context_get_type(con)
if ctype == "reserved_port_t":
@@ -657,12 +654,11 @@ class portRecords(semanageRecords):
def get_all_by_type(self):
ddict={}
- (rc, self.plist, self.psize) = semanage_port_list(self.sh)
+ (rc, self.plist) = semanage_port_list(self.sh)
if rc < 0:
raise ValueError("Could not list ports")
- for idx in range(self.psize):
- port = semanage_port_by_idx(self.plist, idx)
+ for port in self.plist:
con = semanage_port_get_con(port)
ctype = semanage_context_get_type(con)
if ctype == "reserved_port_t":
@@ -837,12 +833,11 @@ class interfaceRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.plist, self.psize) = semanage_iface_list(self.sh)
+ (rc, self.ilist) = semanage_iface_list(self.sh)
if rc < 0:
raise ValueError("Could not list interfaces")
- for idx in range(self.psize):
- interface = semanage_iface_by_idx(self.plist, idx)
+ for interface in self.ilist:
con = semanage_iface_get_ifcon(interface)
ddict[semanage_iface_get_name(interface)]=(semanage_context_get_user(con), semanage_context_get_role(con), semanage_context_get_type(con), semanage_context_get_mls(con))
@@ -1022,12 +1017,11 @@ class fcontextRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.plist, self.psize) = semanage_fcontext_list(self.sh)
+ (rc, self.flist) = semanage_fcontext_list(self.sh)
if rc < 0:
raise ValueError("Could not list file contexts")
- for idx in range(self.psize):
- fcontext = semanage_fcontext_by_idx(self.plist, idx)
+ for fcontext in self.flist:
expr = semanage_fcontext_get_expr(fcontext)
ftype = semanage_fcontext_get_type(fcontext)
ftype_str = semanage_fcontext_get_type_str(ftype)
@@ -1124,12 +1118,11 @@ class booleanRecords(semanageRecords):
def get_all(self):
ddict={}
- (rc, self.blist, self.bsize) = semanage_bool_list(self.sh)
+ (rc, self.blist) = semanage_bool_list(self.sh)
if rc < 0:
raise ValueError("Could not list booleans")
- for idx in range(self.bsize):
- boolean = semanage_bool_by_idx(self.blist, idx)
+ for boolean in self.blist:
name = semanage_bool_get_name(boolean)
value = semanage_bool_get_value(boolean)
ddict[name] = value
^ permalink raw reply [flat|nested] 10+ messages in thread
* Move python bindings into semanageswig_python.i
2006-02-14 10:59 ` Ivan Gyurdiev
@ 2006-02-14 12:08 ` Ivan Gyurdiev
2006-02-14 18:51 ` Improve bindings, add PyList(String) for roles array Ivan Gyurdiev
2006-02-14 19:01 ` Move python bindings into semanageswig_python.i Stephen Smalley
2006-02-14 18:57 ` [SEMANAGE][UTILS] Use PyList in bindings Stephen Smalley
1 sibling, 2 replies; 10+ messages in thread
From: Ivan Gyurdiev @ 2006-02-14 12:08 UTC (permalink / raw)
To: SELinux List; +Cc: Stephen Smalley, Joshua Brindle
[-- Attachment #1: Type: text/plain, Size: 1052 bytes --]
Ivan Gyurdiev wrote:
> Attached is a resync of this patch against current genhomedircon.
Now move python stuff into semanageswig_python.i. Trim #include list to
semanage/semanage.h, which is sufficient. Actually, I doubt that's
needed at all, since swig seems to prototype all wrapped functions itself.
I define "python stuff" as any typemaps, which are overriding the normal
SWIG-generated output with custom code - things that re-direct pointers
to output, as well as list-to-array conversions. There should be no need
to override swig in the language independent .i file. Also move the lone
char_by_idx function. Other by_idx functions should be kept out, because
they might not be needed in other languages. In fact, I should look at
char_by_idx too, it's probably not needed.
Patch requires resync-ed pylist patch above, as well as the small
free-leak patch I sent earlier.
It doesn't attempt to make the Makefile language independent - it just
renames the current .i file being used (it's already hardcoded to use
-python anyways).
[-- Attachment #2: libsemanage.split_swig.diff --]
[-- Type: text/x-patch, Size: 22443 bytes --]
diff -Naurp --exclude-from excludes old/libsemanage/src/Makefile new/libsemanage/src/Makefile
--- old/libsemanage/src/Makefile 2006-01-27 10:00:53.000000000 -0500
+++ new/libsemanage/src/Makefile 2006-02-14 06:52:03.000000000 -0500
@@ -23,7 +23,7 @@ LIBVERSION = 1
LIBA=libsemanage.a
TARGET=libsemanage.so
-SWIGIF= semanageswig.i
+SWIGIF= semanageswig_python.i
SWIGCOUT= semanageswig_wrap.c
SWIGLOBJ:= $(patsubst %.c,%.lo,$(SWIGCOUT))
SWIGSO=_semanage.so
diff -Naurp --exclude-from excludes old/libsemanage/src/semanageswig.i new/libsemanage/src/semanageswig.i
--- old/libsemanage/src/semanageswig.i 2006-02-14 06:48:05.000000000 -0500
+++ new/libsemanage/src/semanageswig.i 2006-02-14 06:56:05.000000000 -0500
@@ -1,6 +1,7 @@
/* Author: Spencer Shimko <sshimko@tresys.com>
*
* Copyright (C) 2004-2005 Tresys Technology, LLC
+ * Copyright (C) 2006 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,381 +21,9 @@
%module semanage
%{
- #include "semanage/debug.h"
- #include "semanage/handle.h"
- #include "semanage/modules.h"
- #include "semanage/context_record.h"
- #include "semanage/boolean_record.h"
- #include "semanage/booleans_policy.h"
- #include "semanage/booleans_local.h"
- #include "semanage/booleans_active.h"
- #include "semanage/iface_record.h"
- #include "semanage/node_record.h"
- #include "semanage/interfaces_local.h"
- #include "semanage/interfaces_policy.h"
- #include "semanage/user_record.h"
- #include "semanage/users_local.h"
- #include "semanage/users_policy.h"
- #include "semanage/port_record.h"
- #include "semanage/ports_local.h"
- #include "semanage/ports_policy.h"
- #include "semanage/seuser_record.h"
- #include "semanage/fcontext_record.h"
- #include "semanage/fcontexts_local.h"
- #include "semanage/fcontexts_policy.h"
- #include "semanage/seusers_local.h"
- #include "semanage/seusers_policy.h"
- #include "semanage/nodes_local.h"
- #include "semanage/nodes_policy.h"
#include "semanage/semanage.h"
%}
-%inline {
- char *char_by_idx(char **list, int n) {
- return list[n];
- }
-}
-
-
-/** standard typemaps **/
-
-/* a few helpful typemaps are available in this library */
-%include <typemaps.i>
-/* wrap all int*'s so they can be used for results
- if it becomes necessary to send in data this should be changed to INOUT */
-%apply int *OUTPUT { int * };
-%apply int *OUTPUT { size_t * };
-%apply int *OUTPUT { unsigned int * };
-
-%typemap(in, numinputs=0) char **(char *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) char** {
- $result = t_output_helper($result, SWIG_FromCharPtr(*$1));
- free(*$1);
-}
-
-%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
- will not take the semanage_module_info_t ** parameter */
-%typemap(in, numinputs=0) semanage_module_info_t **(semanage_module_info_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_module_info_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_module_info, 0));
-}
-
-/** context typemaps **/
-
-/* the wrapper will setup this parameter for passing... the resulting python functions
- will not take the semanage_context_t ** parameter */
-%typemap(in, numinputs=0) semanage_context_t **(semanage_context_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_context_t** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_context, 0));
-}
-
-/** boolean typemaps **/
-
-/* the wrapper will setup this parameter for passing... the resulting python functions
- will not take the semanage_bool_t *** parameter */
-%typemap(in, numinputs=0) semanage_bool_t ***(semanage_bool_t **temp) {
- $1 = &temp;
-}
-
-%typemap(argout) (
- semanage_handle_t* handle,
- semanage_bool_t*** records,
- unsigned int* count) {
-
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_bool, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
- }
-}
-
-%typemap(in, numinputs=0) semanage_bool_t **(semanage_bool_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_bool_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_bool, 0));
-}
-
-%typemap(argout) semanage_bool_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_bool_key, 0));
-}
-
-%typemap(in, numinputs=0) semanage_bool_key_t **(semanage_bool_key_t *temp) {
- $1 = &temp;
-}
-
-/** fcontext typemaps **/
-
-/* the wrapper will setup this parameter for passing... the resulting python functions
- will not take the semanage_fcontext_t *** parameter */
-%typemap(in, numinputs=0) semanage_fcontext_t ***(semanage_fcontext_t **temp) {
- $1 = &temp;
-}
-
-%typemap(argout) (
- semanage_handle_t* handle,
- semanage_fcontext_t*** records,
- unsigned int* count) {
-
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_fcontext, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
- }
-}
-
-%typemap(in, numinputs=0) semanage_fcontext_t **(semanage_fcontext_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_fcontext_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_fcontext, 0));
-}
-
-%typemap(argout) semanage_fcontext_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_fcontext_key, 0));
-}
-
-%typemap(in, numinputs=0) semanage_fcontext_key_t **(semanage_fcontext_key_t *temp) {
- $1 = &temp;
-}
-
-/** interface typemaps **/
-
-/* the wrapper will setup this parameter for passing... the resulting python functions
- will not take the semanage_iface_t *** parameter */
-%typemap(in, numinputs=0) semanage_iface_t ***(semanage_iface_t **temp) {
- $1 = &temp;
-}
-
-%typemap(argout) (
- semanage_handle_t* handle,
- semanage_iface_t*** records,
- unsigned int* count) {
-
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_iface, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
- }
-}
-
-%typemap(in, numinputs=0) semanage_iface_t **(semanage_iface_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_iface_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_iface, 0));
-}
-
-%typemap(argout) semanage_iface_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_iface_key, 0));
-}
-
-%typemap(in, numinputs=0) semanage_iface_key_t **(semanage_iface_key_t *temp) {
- $1 = &temp;
-}
-
-/** seuser typemaps **/
-
-/* the wrapper will setup this parameter for passing... the resulting python functions
- will not take the semanage_seuser_t *** parameter */
-%typemap(in, numinputs=0) semanage_seuser_t ***(semanage_seuser_t **temp) {
- $1 = &temp;
-}
-
-%typemap(argout) (
- semanage_handle_t* handle,
- semanage_seuser_t*** records,
- unsigned int* count) {
-
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_seuser, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
- }
-}
-
-%typemap(in, numinputs=0) semanage_seuser_t **(semanage_seuser_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_seuser_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_seuser, 0));
-}
-
-%typemap(argout) semanage_seuser_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_seuser_key, 0));
-}
-
-%typemap(in, numinputs=0) semanage_seuser_key_t **(semanage_seuser_key_t *temp) {
- $1 = &temp;
-}
-
-/** user typemaps **/
-
-/* the wrapper will setup this parameter for passing... the resulting python functions
- will not take the semanage_user_t *** parameter */
-%typemap(in, numinputs=0) semanage_user_t ***(semanage_user_t **temp) {
- $1 = &temp;
-}
-
-%typemap(argout) (
- semanage_handle_t* handle,
- semanage_user_t*** records,
- unsigned int* count) {
-
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_user, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
- }
-}
-
-%typemap(in, numinputs=0) semanage_user_t **(semanage_user_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_user_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_user, 0));
-}
-
-%typemap(argout) semanage_user_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_user_key, 0));
-}
-
-%typemap(in, numinputs=0) semanage_user_key_t **(semanage_user_key_t *temp) {
- $1 = &temp;
-}
-
-/** port typemaps **/
-
-/* the wrapper will setup this parameter for passing... the resulting python functions
- will not take the semanage_port_t *** parameter */
-%typemap(in, numinputs=0) semanage_port_t ***(semanage_port_t **temp) {
- $1 = &temp;
-}
-
-%typemap(argout) (
- semanage_handle_t* handle,
- semanage_port_t*** records,
- unsigned int* count) {
-
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_port, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
- }
-}
-
-%typemap(in, numinputs=0) semanage_port_t **(semanage_port_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_port_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_port, 0));
-}
-
-%typemap(argout) semanage_port_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_port_key, 0));
-}
-
-%typemap(in, numinputs=0) semanage_port_key_t **(semanage_port_key_t *temp) {
- $1 = &temp;
-}
-
-/** node typemaps **/
-
-/* the wrapper will setup this parameter for passing... the resulting python functions
- will not take the semanage_node_t *** parameter */
-%typemap(in, numinputs=0) semanage_node_t ***(semanage_node_t **temp) {
- $1 = &temp;
-}
-
-%typemap(argout) (
- semanage_handle_t* handle,
- semanage_node_t*** records,
- unsigned int* count) {
-
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_node, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
- }
-}
-
-%typemap(in, numinputs=0) semanage_node_t **(semanage_node_t *temp) {
- $1 = &temp;
-}
-
-%typemap(argout) semanage_node_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_node, 0));
-}
-
-
-%typemap(argout) semanage_node_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_node_key, 0));
-}
-
-%typemap(in, numinputs=0) semanage_node_key_t **(semanage_node_key_t *temp) {
- $1 = &temp;
-}
-
/* pull in the headers */
%include "../include/semanage/debug.h"
%include "../include/semanage/handle.h"
diff -Naurp --exclude-from excludes old/libsemanage/src/semanageswig_python.i new/libsemanage/src/semanageswig_python.i
--- old/libsemanage/src/semanageswig_python.i 1969-12-31 19:00:00.000000000 -0500
+++ new/libsemanage/src/semanageswig_python.i 2006-02-14 06:56:10.000000000 -0500
@@ -0,0 +1,366 @@
+/* Author: Spencer Shimko <sshimko@tresys.com>
+ *
+ * Copyright (C) 2004-2005 Tresys Technology, LLC
+ * Copyright (C) 2006 Red Hat, Inc
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/** standard typemaps **/
+
+/* a few helpful typemaps are available in this library */
+%include <typemaps.i>
+/* wrap all int*'s so they can be used for results
+ if it becomes necessary to send in data this should be changed to INOUT */
+%apply int *OUTPUT { int * };
+%apply int *OUTPUT { size_t * };
+%apply int *OUTPUT { unsigned int * };
+
+%inline {
+ char *char_by_idx(char **list, int n) {
+ return list[n];
+ }
+}
+
+%typemap(in, numinputs=0) char **(char *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) char** {
+ $result = t_output_helper($result, SWIG_FromCharPtr(*$1));
+ free(*$1);
+}
+
+%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
+ will not take the semanage_module_info_t ** parameter */
+%typemap(in, numinputs=0) semanage_module_info_t **(semanage_module_info_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_module_info_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_module_info, 0));
+}
+
+/** context typemaps **/
+
+/* the wrapper will setup this parameter for passing... the resulting python functions
+ will not take the semanage_context_t ** parameter */
+%typemap(in, numinputs=0) semanage_context_t **(semanage_context_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_context_t** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_context, 0));
+}
+
+/** boolean typemaps **/
+
+/* the wrapper will setup this parameter for passing... the resulting python functions
+ will not take the semanage_bool_t *** parameter */
+%typemap(in, numinputs=0) semanage_bool_t ***(semanage_bool_t **temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_bool_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_bool, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
+
+%typemap(in, numinputs=0) semanage_bool_t **(semanage_bool_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_bool_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_bool, 0));
+}
+
+%typemap(argout) semanage_bool_key_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_bool_key, 0));
+}
+
+%typemap(in, numinputs=0) semanage_bool_key_t **(semanage_bool_key_t *temp) {
+ $1 = &temp;
+}
+
+/** fcontext typemaps **/
+
+/* the wrapper will setup this parameter for passing... the resulting python functions
+ will not take the semanage_fcontext_t *** parameter */
+%typemap(in, numinputs=0) semanage_fcontext_t ***(semanage_fcontext_t **temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_fcontext_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_fcontext, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
+
+%typemap(in, numinputs=0) semanage_fcontext_t **(semanage_fcontext_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_fcontext_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_fcontext, 0));
+}
+
+%typemap(argout) semanage_fcontext_key_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_fcontext_key, 0));
+}
+
+%typemap(in, numinputs=0) semanage_fcontext_key_t **(semanage_fcontext_key_t *temp) {
+ $1 = &temp;
+}
+
+/** interface typemaps **/
+
+/* the wrapper will setup this parameter for passing... the resulting python functions
+ will not take the semanage_iface_t *** parameter */
+%typemap(in, numinputs=0) semanage_iface_t ***(semanage_iface_t **temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_iface_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_iface, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
+
+%typemap(in, numinputs=0) semanage_iface_t **(semanage_iface_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_iface_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_iface, 0));
+}
+
+%typemap(argout) semanage_iface_key_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_iface_key, 0));
+}
+
+%typemap(in, numinputs=0) semanage_iface_key_t **(semanage_iface_key_t *temp) {
+ $1 = &temp;
+}
+
+/** seuser typemaps **/
+
+/* the wrapper will setup this parameter for passing... the resulting python functions
+ will not take the semanage_seuser_t *** parameter */
+%typemap(in, numinputs=0) semanage_seuser_t ***(semanage_seuser_t **temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_seuser_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_seuser, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
+
+%typemap(in, numinputs=0) semanage_seuser_t **(semanage_seuser_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_seuser_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_seuser, 0));
+}
+
+%typemap(argout) semanage_seuser_key_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_seuser_key, 0));
+}
+
+%typemap(in, numinputs=0) semanage_seuser_key_t **(semanage_seuser_key_t *temp) {
+ $1 = &temp;
+}
+
+/** user typemaps **/
+
+/* the wrapper will setup this parameter for passing... the resulting python functions
+ will not take the semanage_user_t *** parameter */
+%typemap(in, numinputs=0) semanage_user_t ***(semanage_user_t **temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_user_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_user, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
+
+%typemap(in, numinputs=0) semanage_user_t **(semanage_user_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_user_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_user, 0));
+}
+
+%typemap(argout) semanage_user_key_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_user_key, 0));
+}
+
+%typemap(in, numinputs=0) semanage_user_key_t **(semanage_user_key_t *temp) {
+ $1 = &temp;
+}
+
+/** port typemaps **/
+
+/* the wrapper will setup this parameter for passing... the resulting python functions
+ will not take the semanage_port_t *** parameter */
+%typemap(in, numinputs=0) semanage_port_t ***(semanage_port_t **temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_port_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_port, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
+
+%typemap(in, numinputs=0) semanage_port_t **(semanage_port_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_port_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_port, 0));
+}
+
+%typemap(argout) semanage_port_key_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_port_key, 0));
+}
+
+%typemap(in, numinputs=0) semanage_port_key_t **(semanage_port_key_t *temp) {
+ $1 = &temp;
+}
+
+/** node typemaps **/
+
+/* the wrapper will setup this parameter for passing... the resulting python functions
+ will not take the semanage_node_t *** parameter */
+%typemap(in, numinputs=0) semanage_node_t ***(semanage_node_t **temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) (
+ semanage_handle_t* handle,
+ semanage_node_t*** records,
+ unsigned int* count) {
+
+ if (result >= 0) {
+ PyObject* plist = PyList_New(*$3);
+ unsigned int i;
+
+ for (i = 0; i < *$3; i++)
+ PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_node, 0));
+
+ $result = t_output_helper($result, plist);
+ free(*$2);
+ }
+}
+
+%typemap(in, numinputs=0) semanage_node_t **(semanage_node_t *temp) {
+ $1 = &temp;
+}
+
+%typemap(argout) semanage_node_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_node, 0));
+}
+
+
+%typemap(argout) semanage_node_key_t ** {
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_node_key, 0));
+}
+
+%typemap(in, numinputs=0) semanage_node_key_t **(semanage_node_key_t *temp) {
+ $1 = &temp;
+}
+
+%include "semanageswig.i"
^ permalink raw reply [flat|nested] 10+ messages in thread
* Improve bindings, add PyList(String) for roles array
2006-02-14 12:08 ` Move python bindings into semanageswig_python.i Ivan Gyurdiev
@ 2006-02-14 18:51 ` Ivan Gyurdiev
2006-02-14 20:12 ` Stephen Smalley
2006-02-14 19:01 ` Move python bindings into semanageswig_python.i Stephen Smalley
1 sibling, 1 reply; 10+ messages in thread
From: Ivan Gyurdiev @ 2006-02-14 18:51 UTC (permalink / raw)
To: SELinux List; +Cc: Stephen Smalley
[-- Attachment #1: Type: text/plain, Size: 1392 bytes --]
ChangeLog:
- Split out PyList building code and put it in a common function. In
that function:
- audit failure in PyNew
- audit failure in PyAppend (used to be SetItem)
- audit failure in SWIG_NewPointerObj
- on failure, call the object destructor function on the entire list,
and return STATUS_ERR.
I'm not sure if that accomplishes much. I suspect the swig wrappers
have a million ways in which they can fail internally. Yet, I feel like
it is wrong to not audit errors in code that I write, so this corrects
that mistake. I also like the idea of the list building code being in a
common function.
- Add more PyLists..... convert semanage_user_get_roles() to using
PyList, instead of character arrays.
- Remove char_by_idx.
- fix dependency in seobject.py
- unlike other wrappers, this one also converts the string itself,
from char* to a python string
(see semanage2plist, which can be called in two ways)
- Use fewer SWIG internal conventions
- don't use the result variable - use the $result python variable,
which is documented. Use SWIG_As_int to get the integer out of it.
- do not use SWIGTYPE_...* where possible. Use special variables
that provide access to the descriptor without writing out the type.
Next:
- make the opposite conversion, and make set_roles() work properly
- try to get rid of usage of t_output_helper()
[-- Attachment #2: libsemanage.improve_bindings.diff --]
[-- Type: text/x-patch, Size: 15635 bytes --]
diff -Naurp --exclude-from excludes old/libsemanage/src/pywrap-test.py new/libsemanage/src/pywrap-test.py
--- old/libsemanage/src/pywrap-test.py 2006-02-14 05:59:03.000000000 -0500
+++ new/libsemanage/src/pywrap-test.py 2006-02-14 11:08:01.000000000 -0500
@@ -178,12 +178,13 @@ 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 roles: "
- (status, rlist, rlist_size) = semanage.semanage_user_get_roles(sh, user)
+ (status, rlist) = semanage.semanage_user_get_roles(sh, user)
if status < 0:
raise Error("Could not get user roles")
+
+ for role in rlist:
+ print " ", role
- for ridx in range (rlist_size):
- print " ", semanage.char_by_idx(rlist, ridx)
semanage.semanage_user_free(user)
def test_ports(self,sh):
diff -Naurp --exclude-from excludes old/libsemanage/src/semanageswig.i new/libsemanage/src/semanageswig.i
--- old/libsemanage/src/semanageswig.i 2006-02-14 11:16:51.000000000 -0500
+++ new/libsemanage/src/semanageswig.i 2006-02-14 09:11:19.000000000 -0500
@@ -20,9 +20,6 @@
%module semanage
-%{
- #include "semanage/semanage.h"
-%}
/* pull in the headers */
%include "../include/semanage/debug.h"
diff -Naurp --exclude-from excludes old/libsemanage/src/semanageswig_python.i new/libsemanage/src/semanageswig_python.i
--- old/libsemanage/src/semanageswig_python.i 2006-02-14 11:16:51.000000000 -0500
+++ new/libsemanage/src/semanageswig_python.i 2006-02-14 13:46:29.000000000 -0500
@@ -20,6 +20,77 @@
/** standard typemaps **/
+%header %{
+ #include <stdlib.h>
+ #include <semanage/semanage.h>
+
+ #define STATUS_SUCCESS 0
+ #define STATUS_ERR -1
+%}
+
+%wrapper %{
+
+
+ /* There are two ways to call this function:
+ * One is with a valid swig_type and destructor.
+ * Two is with a NULL swig_type and NULL destructor.
+ *
+ * In the first mode, the function converts
+ * an array of *cloned* objects [of the given pointer swig type]
+ * into a PyList, and destroys the array in the process
+ * (the objects pointers are preserved).
+ *
+ * In the second mode, the function converts
+ * an array of *constant* strings into a PyList, and destroys
+ * the array in the process
+ * (the strings are copied, originals not freed). */
+
+ static int semanage_array2plist(
+ semanage_handle_t* handle,
+ void** arr,
+ unsigned int asize,
+ swig_type_info* swig_type,
+ void (*destructor) (void*),
+ PyObject** result) {
+
+ PyObject* plist = PyList_New(0);
+ unsigned int i;
+
+ if (!plist)
+ goto err;
+
+ for (i = 0; i < asize; i++) {
+
+ PyObject* obj = NULL;
+
+ /* NULL indicates string conversion,
+ * otherwise create an opaque pointer */
+ if (!swig_type)
+ obj = SWIG_FromCharPtr(arr[i]);
+ else
+ obj = SWIG_NewPointerObj(arr[i], swig_type, 0);
+
+ if (!obj)
+ goto err;
+
+ if (PyList_Append(plist, obj) < 0)
+ goto err;
+ }
+
+ free(arr);
+
+ *result = plist;
+ return STATUS_SUCCESS;
+
+ err:
+ for (i = 0; i < asize; i++)
+ if (destructor)
+ destructor(arr[i]);
+ free(arr);
+ return STATUS_ERR;
+ }
+%}
+
/* a few helpful typemaps are available in this library */
%include <typemaps.i>
/* wrap all int*'s so they can be used for results
@@ -28,12 +99,6 @@
%apply int *OUTPUT { size_t * };
%apply int *OUTPUT { unsigned int * };
-%inline {
- char *char_by_idx(char **list, int n) {
- return list[n];
- }
-}
-
%typemap(in, numinputs=0) char **(char *temp) {
$1 = &temp;
}
@@ -47,8 +112,23 @@
$1 = &temp;
}
-%typemap(argout) char*** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_p_char, 0));
+%typemap(argout) (
+ semanage_handle_t* handle,
+ const semanage_user_t* user,
+ const char*** roles_arr,
+ unsigned int* num_roles) {
+
+ if ($result) {
+ int value = SWIG_As_int($result);
+ if (value >= 0) {
+ PyObject* plist = NULL;
+ if (semanage_array2plist($1, (void**) *$3, *$4,
+ NULL, NULL, &plist) < 0)
+ $result = SWIG_From_int(STATUS_ERR);
+ else
+ $result = t_output_helper($result, plist);
+ }
+ }
}
/** module typemaps**/
@@ -60,7 +140,7 @@
}
%typemap(argout) semanage_module_info_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_module_info, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
/** context typemaps **/
@@ -72,7 +152,7 @@
}
%typemap(argout) semanage_context_t** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_context, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
/** boolean typemaps **/
@@ -84,19 +164,20 @@
}
%typemap(argout) (
- semanage_handle_t* handle,
- semanage_bool_t*** records,
+ semanage_handle_t* handle,
+ semanage_bool_t*** records,
unsigned int* count) {
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_bool, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
+ if ($result) {
+ int value = SWIG_As_int($result);
+ if (value >= 0) {
+ PyObject* plist = NULL;
+ if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_bool,
+ (void (*) (void*)) &semanage_bool_free, &plist) < 0)
+ $result = SWIG_From_int(STATUS_ERR);
+ else
+ $result = t_output_helper($result, plist);
+ }
}
}
@@ -105,11 +186,11 @@
}
%typemap(argout) semanage_bool_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_bool, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(argout) semanage_bool_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_bool_key, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(in, numinputs=0) semanage_bool_key_t **(semanage_bool_key_t *temp) {
@@ -125,19 +206,20 @@
}
%typemap(argout) (
- semanage_handle_t* handle,
- semanage_fcontext_t*** records,
+ semanage_handle_t* handle,
+ semanage_fcontext_t*** records,
unsigned int* count) {
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_fcontext, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
+ if ($result) {
+ int value = SWIG_As_int($result);
+ if (value >= 0) {
+ PyObject* plist = NULL;
+ if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_fcontext,
+ (void (*) (void*)) &semanage_fcontext_free, &plist) < 0)
+ $result = SWIG_From_int(STATUS_ERR);
+ else
+ $result = t_output_helper($result, plist);
+ }
}
}
@@ -146,11 +228,11 @@
}
%typemap(argout) semanage_fcontext_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_fcontext, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(argout) semanage_fcontext_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_fcontext_key, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(in, numinputs=0) semanage_fcontext_key_t **(semanage_fcontext_key_t *temp) {
@@ -165,33 +247,35 @@
$1 = &temp;
}
+
%typemap(argout) (
- semanage_handle_t* handle,
- semanage_iface_t*** records,
+ semanage_handle_t* handle,
+ semanage_iface_t*** records,
unsigned int* count) {
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_iface, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
+ if ($result) {
+ int value = SWIG_As_int($result);
+ if (value >= 0) {
+ PyObject* plist = NULL;
+ if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_iface,
+ (void (*) (void*)) &semanage_iface_free, &plist) < 0)
+ $result = SWIG_From_int(STATUS_ERR);
+ else
+ $result = t_output_helper($result, plist);
+ }
}
-}
+}
%typemap(in, numinputs=0) semanage_iface_t **(semanage_iface_t *temp) {
$1 = &temp;
}
%typemap(argout) semanage_iface_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_iface, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(argout) semanage_iface_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_iface_key, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(in, numinputs=0) semanage_iface_key_t **(semanage_iface_key_t *temp) {
@@ -206,33 +290,35 @@
$1 = &temp;
}
+
%typemap(argout) (
- semanage_handle_t* handle,
- semanage_seuser_t*** records,
+ semanage_handle_t* handle,
+ semanage_seuser_t*** records,
unsigned int* count) {
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_seuser, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
+ if ($result) {
+ int value = SWIG_As_int($result);
+ if (value >= 0) {
+ PyObject* plist = NULL;
+ if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_seuser,
+ (void (*) (void*)) &semanage_seuser_free, &plist) < 0)
+ $result = SWIG_From_int(STATUS_ERR);
+ else
+ $result = t_output_helper($result, plist);
+ }
}
-}
+}
%typemap(in, numinputs=0) semanage_seuser_t **(semanage_seuser_t *temp) {
$1 = &temp;
}
%typemap(argout) semanage_seuser_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_seuser, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(argout) semanage_seuser_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_seuser_key, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(in, numinputs=0) semanage_seuser_key_t **(semanage_seuser_key_t *temp) {
@@ -248,32 +334,33 @@
}
%typemap(argout) (
- semanage_handle_t* handle,
- semanage_user_t*** records,
+ semanage_handle_t* handle,
+ semanage_user_t*** records,
unsigned int* count) {
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_user, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
+ if ($result) {
+ int value = SWIG_As_int($result);
+ if (value >= 0) {
+ PyObject* plist = NULL;
+ if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_user,
+ (void (*) (void*)) &semanage_user_free, &plist) < 0)
+ $result = SWIG_From_int(STATUS_ERR);
+ else
+ $result = t_output_helper($result, plist);
+ }
}
}
-
+
%typemap(in, numinputs=0) semanage_user_t **(semanage_user_t *temp) {
$1 = &temp;
}
%typemap(argout) semanage_user_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_user, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(argout) semanage_user_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_user_key, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(in, numinputs=0) semanage_user_key_t **(semanage_user_key_t *temp) {
@@ -289,32 +376,33 @@
}
%typemap(argout) (
- semanage_handle_t* handle,
- semanage_port_t*** records,
+ semanage_handle_t* handle,
+ semanage_port_t*** records,
unsigned int* count) {
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_port, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
+ if ($result) {
+ int value = SWIG_As_int($result);
+ if (value >= 0) {
+ PyObject* plist = NULL;
+ if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_port,
+ (void (*) (void*)) &semanage_port_free, &plist) < 0)
+ $result = SWIG_From_int(STATUS_ERR);
+ else
+ $result = t_output_helper($result, plist);
+ }
}
-}
+}
%typemap(in, numinputs=0) semanage_port_t **(semanage_port_t *temp) {
$1 = &temp;
}
%typemap(argout) semanage_port_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_port, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(argout) semanage_port_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_port_key, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(in, numinputs=0) semanage_port_key_t **(semanage_port_key_t *temp) {
@@ -330,19 +418,20 @@
}
%typemap(argout) (
- semanage_handle_t* handle,
- semanage_node_t*** records,
+ semanage_handle_t* handle,
+ semanage_node_t*** records,
unsigned int* count) {
- if (result >= 0) {
- PyObject* plist = PyList_New(*$3);
- unsigned int i;
-
- for (i = 0; i < *$3; i++)
- PyList_SetItem(plist, i, SWIG_NewPointerObj((*$2)[i], SWIGTYPE_p_semanage_node, 0));
-
- $result = t_output_helper($result, plist);
- free(*$2);
+ if ($result) {
+ int value = SWIG_As_int($result);
+ if (value >= 0) {
+ PyObject* plist = NULL;
+ if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_node,
+ (void (*) (void*)) &semanage_node_free, &plist) < 0)
+ $result = SWIG_From_int(STATUS_ERR);
+ else
+ $result = t_output_helper($result, plist);
+ }
}
}
@@ -351,12 +440,12 @@
}
%typemap(argout) semanage_node_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_node, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(argout) semanage_node_key_t ** {
- $result = t_output_helper($result, SWIG_NewPointerObj(*$1, SWIGTYPE_p_semanage_node_key, 0));
+ $result = t_output_helper($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
}
%typemap(in, numinputs=0) semanage_node_key_t **(semanage_node_key_t *temp) {
diff -Naurp --exclude-from excludes old/policycoreutils/semanage/seobject.py new/policycoreutils/semanage/seobject.py
--- old/policycoreutils/semanage/seobject.py 2006-02-14 05:59:03.000000000 -0500
+++ new/policycoreutils/semanage/seobject.py 2006-02-14 07:40:43.000000000 -0500
@@ -452,16 +452,11 @@ class seluserRecords(semanageRecords):
for u in self.ulist:
name = semanage_user_get_name(u)
- (rc, rlist, rlist_size) = semanage_user_get_roles(self.sh, u)
+ (rc, rlist) = semanage_user_get_roles(self.sh, u)
if rc < 0:
raise ValueError("Could not list roles for user %s" % name)
- roles = ""
-
- if rlist_size:
- roles += char_by_idx(rlist, 0)
- for ridx in range (1,rlist_size):
- roles += " " + char_by_idx(rlist, ridx)
+ roles = string.join(rlist, ' ');
ddict[semanage_user_get_name(u)] = (semanage_user_get_mlslevel(u), semanage_user_get_mlsrange(u), roles)
return ddict
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [SEMANAGE][UTILS] Use PyList in bindings
2006-02-14 10:59 ` Ivan Gyurdiev
2006-02-14 12:08 ` Move python bindings into semanageswig_python.i Ivan Gyurdiev
@ 2006-02-14 18:57 ` Stephen Smalley
1 sibling, 0 replies; 10+ messages in thread
From: Stephen Smalley @ 2006-02-14 18:57 UTC (permalink / raw)
To: Ivan Gyurdiev; +Cc: SELinux List
On Tue, 2006-02-14 at 05:59 -0500, Ivan Gyurdiev wrote:
> Attached is a resync of this patch against current genhomedircon.
Merged as of libsemanage 1.5.24 and policycoreutils 1.29.24.
--
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] 10+ messages in thread
* Re: Move python bindings into semanageswig_python.i
2006-02-14 12:08 ` Move python bindings into semanageswig_python.i Ivan Gyurdiev
2006-02-14 18:51 ` Improve bindings, add PyList(String) for roles array Ivan Gyurdiev
@ 2006-02-14 19:01 ` Stephen Smalley
1 sibling, 0 replies; 10+ messages in thread
From: Stephen Smalley @ 2006-02-14 19:01 UTC (permalink / raw)
To: Ivan Gyurdiev; +Cc: SELinux List, Joshua Brindle
On Tue, 2006-02-14 at 07:08 -0500, Ivan Gyurdiev wrote:
> Ivan Gyurdiev wrote:
> > Attached is a resync of this patch against current genhomedircon.
> Now move python stuff into semanageswig_python.i. Trim #include list to
> semanage/semanage.h, which is sufficient. Actually, I doubt that's
> needed at all, since swig seems to prototype all wrapped functions itself.
>
> I define "python stuff" as any typemaps, which are overriding the normal
> SWIG-generated output with custom code - things that re-direct pointers
> to output, as well as list-to-array conversions. There should be no need
> to override swig in the language independent .i file. Also move the lone
> char_by_idx function. Other by_idx functions should be kept out, because
> they might not be needed in other languages. In fact, I should look at
> char_by_idx too, it's probably not needed.
>
> Patch requires resync-ed pylist patch above, as well as the small
> free-leak patch I sent earlier.
> It doesn't attempt to make the Makefile language independent - it just
> renames the current .i file being used (it's already hardcoded to use
> -python anyways).
Merged as of libsemanage 1.5.24 as well.
--
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] 10+ messages in thread
* Re: Improve bindings, add PyList(String) for roles array
2006-02-14 18:51 ` Improve bindings, add PyList(String) for roles array Ivan Gyurdiev
@ 2006-02-14 20:12 ` Stephen Smalley
0 siblings, 0 replies; 10+ messages in thread
From: Stephen Smalley @ 2006-02-14 20:12 UTC (permalink / raw)
To: Ivan Gyurdiev; +Cc: SELinux List
On Tue, 2006-02-14 at 13:51 -0500, Ivan Gyurdiev wrote:
> ChangeLog:
>
> - Split out PyList building code and put it in a common function. In
> that function:
> - audit failure in PyNew
> - audit failure in PyAppend (used to be SetItem)
> - audit failure in SWIG_NewPointerObj
> - on failure, call the object destructor function on the entire list,
> and return STATUS_ERR.
>
> I'm not sure if that accomplishes much. I suspect the swig wrappers
> have a million ways in which they can fail internally. Yet, I feel like
> it is wrong to not audit errors in code that I write, so this corrects
> that mistake. I also like the idea of the list building code being in a
> common function.
>
> - Add more PyLists..... convert semanage_user_get_roles() to using
> PyList, instead of character arrays.
> - Remove char_by_idx.
> - fix dependency in seobject.py
> - unlike other wrappers, this one also converts the string itself,
> from char* to a python string
> (see semanage2plist, which can be called in two ways)
>
> - Use fewer SWIG internal conventions
> - don't use the result variable - use the $result python variable,
> which is documented. Use SWIG_As_int to get the integer out of it.
> - do not use SWIGTYPE_...* where possible. Use special variables
> that provide access to the descriptor without writing out the type.
Merged as of libsemanage 1.5.25 and policycoreutils 1.29.25.
> Next:
> - make the opposite conversion, and make set_roles() work properly
> - try to get rid of usage of t_output_helper()
--
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] 10+ messages in thread
end of thread, other threads:[~2006-02-14 20:12 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-02-02 20:45 [SEMANAGE][UTILS] Use PyList in bindings Ivan Gyurdiev
2006-02-02 21:16 ` Ivan Gyurdiev
2006-02-03 14:00 ` Stephen Smalley
2006-02-03 14:36 ` Joshua Brindle
2006-02-14 10:59 ` Ivan Gyurdiev
2006-02-14 12:08 ` Move python bindings into semanageswig_python.i Ivan Gyurdiev
2006-02-14 18:51 ` Improve bindings, add PyList(String) for roles array Ivan Gyurdiev
2006-02-14 20:12 ` Stephen Smalley
2006-02-14 19:01 ` Move python bindings into semanageswig_python.i Stephen Smalley
2006-02-14 18:57 ` [SEMANAGE][UTILS] Use PyList in bindings 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.