summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rw-r--r--source4/build/pidl/swig.pm102
-rw-r--r--source4/scripting/swig/dcerpc.i134
2 files changed, 73 insertions, 163 deletions
diff --git a/source4/build/pidl/swig.pm b/source4/build/pidl/swig.pm
index 0b48537d6f..dcd3efa698 100644
--- a/source4/build/pidl/swig.pm
+++ b/source4/build/pidl/swig.pm
@@ -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,19 +94,31 @@ sub XFromPython($$)
return $result;
}
-sub XToPython($$)
+sub ArrayToPython($$)
{
my($e) = shift;
my($prefix) = shift;
my($result) = "";
- # Special cases
+ my($array_len) = $e->{ARRAY_LEN};
- 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 (!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;
+ my($prefix) = shift;
+ my($result) = "";
+
+ # Special cases
+
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});
}
diff --git a/source4/scripting/swig/dcerpc.i b/source4/scripting/swig/dcerpc.i
index 3b596e85e1..64d757c634 100644
--- a/source4/scripting/swig/dcerpc.i
+++ b/source4/scripting/swig/dcerpc.i
@@ -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"