mirror of
https://github.com/samba-team/samba.git
synced 2025-02-18 17:57:55 +03:00
r2408: Tridge suggested that all the structures from misc.idl (policy handles,
sids, security descriptors and acls) can be automatically generated instead of hand-written. Fix up the swig wrapper generator and helper routines to do this. (Only works for policy handles right now though and arrays are to be converted into lists instead of being binary blobs). Fix up wrapper generation for modules that don't define an interface (e.g misc.idl).
This commit is contained in:
parent
fe60e899d7
commit
160dc90921
@ -38,6 +38,21 @@ sub DebugElement($)
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub ArrayFromPython($$)
|
||||
{
|
||||
my($e) = shift;
|
||||
my($prefix) = shift;
|
||||
my($result) = "";
|
||||
|
||||
if ($e->{POINTERS} != 0) {
|
||||
$result .= "\ts->$prefix$e->{NAME} = talloc(mem_ctx, PyString_Size(PyDict_GetItem(obj, PyString_FromString(\"$e->{NAME}\"))));\n";
|
||||
}
|
||||
|
||||
$result .= "\tmemcpy(s->$prefix$e->{NAME}, PyString_AsString(PyDict_GetItem(obj, PyString_FromString(\"$e->{NAME}\"))), PyString_Size(PyDict_GetItem(obj, PyString_FromString(\"$e->{NAME}\"))));\n";
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub XFromPython($$)
|
||||
{
|
||||
my($e) = shift;
|
||||
@ -47,13 +62,8 @@ sub XFromPython($$)
|
||||
|
||||
# Special cases
|
||||
|
||||
if (($e->{TYPE} eq "policy_handle" || $e->{TYPE} eq "string") && $e->{POINTERS} == 1) {
|
||||
$result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_ptr_from_python(mem_ctx, $obj);\n";
|
||||
return $result;
|
||||
}
|
||||
|
||||
if ($e->{TYPE} eq "string" && $e->{POINTERS} == 1) {
|
||||
$result .= "\ts->$prefix$e->{NAME} = policy_handle_ptr_from_python(mem_ctx, $obj);\n";
|
||||
$result .= "\ts->$prefix$e->{NAME} = string_ptr_from_python(mem_ctx, $obj);\n";
|
||||
return $result;
|
||||
}
|
||||
|
||||
@ -62,23 +72,21 @@ sub XFromPython($$)
|
||||
if (util::is_scalar_type($e->{TYPE})) {
|
||||
if ($e->{POINTERS} == 0) {
|
||||
if ($e->{ARRAY_LEN}) {
|
||||
# pointer to scalar with array len property
|
||||
$result .= DebugElement($e);
|
||||
$result .= ArrayFromPython($e, $prefix);
|
||||
} else {
|
||||
$result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_from_python($obj);\n";
|
||||
}
|
||||
} else {
|
||||
# Pointer to scalar
|
||||
$result .= "\t// Pointer to scalar\n";
|
||||
$result .= DebugElement($e);
|
||||
}
|
||||
} else {
|
||||
if ($e->{POINTERS} == 0) {
|
||||
# Non-scalar type, no pointer
|
||||
$result .= DebugElement($e);
|
||||
$result .= "\t$e->{TYPE}_from_python(mem_ctx, &s->$prefix$e->{NAME}, $obj);\n";
|
||||
} elsif ($e->{POINTERS} == 1) {
|
||||
$result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_ptr_from_python(mem_ctx, $obj);\n";
|
||||
} else {
|
||||
# Non-scalar type, multiple pointers
|
||||
$result .= "\t// Non-scalar type, multiple pointers\n";
|
||||
$result .= DebugElement($e);
|
||||
}
|
||||
}
|
||||
@ -86,6 +94,23 @@ sub XFromPython($$)
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub ArrayToPython($$)
|
||||
{
|
||||
my($e) = shift;
|
||||
my($prefix) = shift;
|
||||
my($result) = "";
|
||||
|
||||
my($array_len) = $e->{ARRAY_LEN};
|
||||
|
||||
if (!util::is_constant($array_len)) {
|
||||
$array_len = "s->$prefix$array_len";
|
||||
}
|
||||
|
||||
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), PyString_FromStringAndSize((char *)s->$prefix$e->{NAME}, $array_len * sizeof($e->{TYPE})));\n";
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub XToPython($$)
|
||||
{
|
||||
my($e) = shift;
|
||||
@ -94,11 +119,6 @@ sub XToPython($$)
|
||||
|
||||
# Special cases
|
||||
|
||||
if ($e->{TYPE} eq "policy_handle" && $e->{POINTERS} == 1) {
|
||||
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), policy_handle_ptr_to_python(mem_ctx, s->$prefix$e->{NAME}));\n";
|
||||
return $result;
|
||||
}
|
||||
|
||||
if ($e->{TYPE} eq "string" && $e->{POINTERS} == 1) {
|
||||
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), string_ptr_to_python(mem_ctx, s->$prefix$e->{NAME}));\n";
|
||||
return $result;
|
||||
@ -109,23 +129,21 @@ sub XToPython($$)
|
||||
if (util::is_scalar_type($e->{TYPE})) {
|
||||
if ($e->{POINTERS} == 0) {
|
||||
if ($e->{ARRAY_LEN}) {
|
||||
# pointer to scalar with array len property
|
||||
$result .= DebugElement($e);
|
||||
$result .= ArrayToPython($e, $prefix);
|
||||
} else {
|
||||
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), $e->{TYPE}_to_python(s->$prefix$e->{NAME}));\n";
|
||||
}
|
||||
} else {
|
||||
# Pointer to scalar
|
||||
$result .= "\t// Pointer to scalar\n";
|
||||
$result .= DebugElement($e);
|
||||
}
|
||||
} else {
|
||||
if ($e->{POINTERS} == 0) {
|
||||
# Non-scalar type, no pointer
|
||||
$result .= DebugElement($e);
|
||||
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), $e->{TYPE}_ptr_to_python(mem_ctx, &s->$prefix$e->{NAME}));\n";
|
||||
} elsif ($e->{POINTERS} == 1) {
|
||||
$result .= "\tPyDict_SetItem(obj, PyString_FromString(\"$e->{NAME}\"), $e->{TYPE}_ptr_to_python(mem_ctx, s->$prefix$e->{NAME}));\n";
|
||||
} else {
|
||||
# Non-scalar type, multiple pointers
|
||||
$result .= "\t// Non-scalar type, multiple pointers\n";
|
||||
$result .= DebugElement($e);
|
||||
}
|
||||
}
|
||||
@ -234,7 +252,7 @@ sub ParseStruct($)
|
||||
|
||||
$res .= "}\n\n";
|
||||
|
||||
$res .= "/* Convert struct $s->{NAME} to Python dict */\n\n";
|
||||
$res .= "/* Convert struct $s->{NAME} pointer to Python dict */\n\n";
|
||||
|
||||
$res .= "PyObject *$s->{NAME}_ptr_to_python(TALLOC_CTX *mem_ctx, struct $s->{NAME} *s)\n";
|
||||
$res .= "{\n";
|
||||
@ -257,7 +275,7 @@ sub ParseUnion($)
|
||||
my($u) = shift;
|
||||
|
||||
$res .= "%{\n\n";
|
||||
$res .= "/* Convert Python dict to union $u->{NAME} */\n\n";
|
||||
$res .= "/* Convert Python dict to union $u->{NAME} pointer */\n\n";
|
||||
|
||||
$res .= "union $u->{NAME} *$u->{NAME}_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n";
|
||||
$res .= "{\n";
|
||||
@ -283,13 +301,33 @@ sub ParseUnion($)
|
||||
$res .= "\treturn NULL;\n";
|
||||
$res .= "}\n\n";
|
||||
|
||||
$res .= "/* Convert union $u->{NAME} to Python dict */\n\n";
|
||||
$res .= "/* Convert union $u->{NAME} pointer to Python dict */\n\n";
|
||||
|
||||
$res .= "PyObject *$u->{NAME}_ptr_to_python(TALLOC_CTX *mem_ctx, union $u->{NAME} *u)\n";
|
||||
$res .= "{\n";
|
||||
$res .= "\treturn PyDict_New();\n";
|
||||
$res .= "}\n\n";
|
||||
|
||||
$res .= "/* Convert Python dict to union $u->{NAME} */\n\n";
|
||||
|
||||
$res .= "void $u->{NAME}_from_python(TALLOC_CTX *mem_ctx, union $u->{NAME} *u, PyObject *obj)\n";
|
||||
$res .= "{\n";
|
||||
$res .= "\tPyObject *dict;\n\n";
|
||||
for my $e (@{$u->{DATA}{DATA}}) {
|
||||
$res .= "\tif ((dict = PyDict_GetItem(obj, PyString_FromString(\"$e->{DATA}{NAME}\")))) {\n";
|
||||
if ($e->{DATA}{POINTERS} == 0) {
|
||||
$res .= "\t\t$e->{DATA}{TYPE}_from_python(mem_ctx, &u->$e->{DATA}{NAME}, dict);\n";
|
||||
} elsif ($e->{DATA}{POINTERS} == 1) {
|
||||
$res .= "\t\tu->$e->{DATA}{NAME} = $e->{DATA}{TYPE}_ptr_from_python(mem_ctx, dict);\n";
|
||||
} else {
|
||||
$res .= "\t\t// $e->{DATA}{TYPE} pointers=$e->{DATA}{POINTERS}\n";
|
||||
}
|
||||
|
||||
$res .= "\t\treturn;\n";
|
||||
$res .= "\t}\n\n";
|
||||
}
|
||||
$res .= "}\n";
|
||||
|
||||
$res .= "\n%}\n\n";
|
||||
}
|
||||
|
||||
@ -317,11 +355,13 @@ sub ParseHeader($)
|
||||
{
|
||||
my($hdr) = shift;
|
||||
|
||||
$name = $hdr->{NAME};
|
||||
$res .= "#define DCERPC_" . uc($name) . "_UUID \"$hdr->{PROPERTIES}->{uuid}\"\n";
|
||||
$res .= "const int DCERPC_" . uc($name) . "_VERSION = " . $hdr->{PROPERTIES}->{version} . ";\n";
|
||||
$res .= "#define DCERPC_" . uc($name) . "_NAME \"" . $name . "\"\n";
|
||||
$res .= "\n";
|
||||
if ($hdr->{PROPERTIES}{uuid}) {
|
||||
$name = $hdr->{NAME};
|
||||
$res .= "#define DCERPC_" . uc($name) . "_UUID \"$hdr->{PROPERTIES}->{uuid}\"\n";
|
||||
$res .= "const int DCERPC_" . uc($name) . "_VERSION = " . $hdr->{PROPERTIES}->{version} . ";\n";
|
||||
$res .= "#define DCERPC_" . uc($name) . "_NAME \"" . $name . "\"\n";
|
||||
$res .= "\n";
|
||||
}
|
||||
|
||||
ParseInheritedData($hdr->{INHERITED_DATA});
|
||||
}
|
||||
|
@ -140,146 +140,15 @@ PyObject *string_ptr_to_python(TALLOC_CTX *mem_ctx, char *obj)
|
||||
return PyString_FromString(obj);
|
||||
}
|
||||
|
||||
struct policy_handle *policy_handle_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
|
||||
{
|
||||
return (struct policy_handle *)PyString_AsString(obj);
|
||||
}
|
||||
|
||||
PyObject *policy_handle_ptr_to_python(TALLOC_CTX *mem_ctx, struct policy_handle *handle)
|
||||
{
|
||||
return PyString_FromStringAndSize((char *)handle, sizeof(*handle));
|
||||
}
|
||||
|
||||
PyObject *dom_sid_ptr_to_python(TALLOC_CTX *mem_ctx, struct dom_sid *obj)
|
||||
{
|
||||
return PyString_FromString(dom_sid_string(mem_ctx, obj));
|
||||
}
|
||||
|
||||
struct dom_sid *dom_sid_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
|
||||
{
|
||||
return dom_sid_parse_talloc(mem_ctx, PyString_AsString(obj));
|
||||
}
|
||||
|
||||
#define dom_sid2_ptr_to_python dom_sid_ptr_to_python
|
||||
#define dom_sid2_ptr_from_python dom_sid_ptr_from_python
|
||||
|
||||
void dom_sid_from_python(TALLOC_CTX *mem_ctx, struct dom_sid *sid, PyObject *obj)
|
||||
{
|
||||
memset(sid, 0, sizeof(struct dom_sid)); // XXX
|
||||
}
|
||||
|
||||
PyObject *security_acl_ptr_to_python(TALLOC_CTX *mem_ctx, struct security_acl *obj)
|
||||
{
|
||||
PyObject *result = PyDict_New();
|
||||
PyObject *ace_list;
|
||||
int i;
|
||||
|
||||
if (!obj) {
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
PyDict_SetItem(result, PyString_FromString("revision"), PyInt_FromLong(obj->revision));
|
||||
PyDict_SetItem(result, PyString_FromString("size"), PyInt_FromLong(obj->size));
|
||||
|
||||
ace_list = PyList_New(obj->num_aces);
|
||||
|
||||
for(i = 0; i < obj->num_aces; i++) {
|
||||
PyObject *ace = PyDict_New();
|
||||
|
||||
PyDict_SetItem(ace, PyString_FromString("type"), PyInt_FromLong(obj->aces[i].type));
|
||||
PyDict_SetItem(ace, PyString_FromString("flags"), PyInt_FromLong(obj->aces[i].flags));
|
||||
PyDict_SetItem(ace, PyString_FromString("access_mask"), PyInt_FromLong(obj->aces[i].access_mask));
|
||||
PyDict_SetItem(ace, PyString_FromString("trustee"), dom_sid_ptr_to_python(mem_ctx, &obj->aces[i].trustee));
|
||||
|
||||
PyList_SetItem(ace_list, i, ace);
|
||||
}
|
||||
|
||||
PyDict_SetItem(result, PyString_FromString("aces"), ace_list);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
struct security_acl *security_acl_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
|
||||
{
|
||||
struct security_acl *acl = talloc(mem_ctx, sizeof(struct security_acl));
|
||||
PyObject *ace_list;
|
||||
int i, len;
|
||||
|
||||
acl->revision = PyInt_AsLong(PyDict_GetItem(obj, PyString_FromString("revision")));
|
||||
acl->size = PyInt_AsLong(PyDict_GetItem(obj, PyString_FromString("size")));
|
||||
ace_list = PyDict_GetItem(obj, PyString_FromString("aces"));
|
||||
|
||||
len = PyList_Size(ace_list);
|
||||
acl->num_aces = len;
|
||||
acl->aces = talloc(mem_ctx, len * sizeof(struct security_ace));
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
acl->aces[i].type = PyInt_AsLong(PyDict_GetItem(obj, PyString_FromString("type")));
|
||||
acl->aces[i].flags = PyInt_AsLong(PyDict_GetItem(obj, PyString_FromString("flags")));
|
||||
acl->aces[i].size = 0;
|
||||
acl->aces[i].access_mask = PyInt_AsLong(PyDict_GetItem(obj, PyString_FromString("access_mask")));
|
||||
|
||||
dom_sid_from_python(mem_ctx, &acl->aces[i].trustee, PyDict_GetItem(obj, PyString_FromString("trustee")));
|
||||
}
|
||||
|
||||
return acl;
|
||||
}
|
||||
|
||||
PyObject *security_descriptor_ptr_to_python(TALLOC_CTX *mem_ctx, struct security_descriptor *obj)
|
||||
{
|
||||
PyObject *result = PyDict_New();
|
||||
|
||||
if (!obj) {
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
PyDict_SetItem(result, PyString_FromString("revision"), PyInt_FromLong(obj->revision));
|
||||
PyDict_SetItem(result, PyString_FromString("type"), PyInt_FromLong(obj->type));
|
||||
|
||||
PyDict_SetItem(result, PyString_FromString("owner_sid"), dom_sid_ptr_to_python(mem_ctx, obj->owner_sid));
|
||||
PyDict_SetItem(result, PyString_FromString("group_sid"), dom_sid_ptr_to_python(mem_ctx, obj->group_sid));
|
||||
|
||||
PyDict_SetItem(result, PyString_FromString("sacl"), security_acl_ptr_to_python(mem_ctx, obj->sacl));
|
||||
PyDict_SetItem(result, PyString_FromString("dacl"), security_acl_ptr_to_python(mem_ctx, obj->dacl));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
struct security_descriptor *security_descriptor_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
|
||||
{
|
||||
struct security_descriptor *sd = talloc(mem_ctx, sizeof(struct security_descriptor));
|
||||
|
||||
sd->revision = PyInt_AsLong(PyDict_GetItem(obj, PyString_FromString("revision")));
|
||||
sd->type = PyInt_AsLong(PyDict_GetItem(obj, PyString_FromString("type")));
|
||||
|
||||
sd->owner_sid = security_descriptor_ptr_from_python(mem_ctx, PyDict_GetItem(obj, PyString_FromString("owner_sid")));
|
||||
sd->group_sid = security_descriptor_ptr_from_python(mem_ctx, PyDict_GetItem(obj, PyString_FromString("group_sid")));
|
||||
|
||||
sd->sacl = security_acl_ptr_from_python(mem_ctx, PyDict_GetItem(obj, PyString_FromString("sacl")));
|
||||
sd->dacl = security_acl_ptr_from_python(mem_ctx, PyDict_GetItem(obj, PyString_FromString("dacl")));
|
||||
|
||||
return sd;
|
||||
}
|
||||
|
||||
struct samr_Password *samr_Password_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *samr_Password_ptr_to_python(TALLOC_CTX *mem_ctx, struct samr_Password *obj)
|
||||
{
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
%include "samba.i"
|
||||
|
||||
%init %{
|
||||
/* setup_logging("python", DEBUG_STDOUT); */
|
||||
setup_logging("python", DEBUG_STDOUT);
|
||||
lp_load(dyn_CONFIGFILE, True, False, False);
|
||||
load_interfaces();
|
||||
ntstatus_exception = PyErr_NewException("dcerpc.NTSTATUS", NULL, NULL);
|
||||
@ -329,5 +198,6 @@ NTSTATUS dcerpc_pipe_connect(struct dcerpc_pipe **OUT,
|
||||
const char *username,
|
||||
const char *password);
|
||||
|
||||
%include "librpc/gen_ndr/misc.i"
|
||||
%include "librpc/gen_ndr/lsa.i"
|
||||
%include "librpc/gen_ndr/samr.i"
|
||||
|
Loading…
x
Reference in New Issue
Block a user