diff options
Diffstat (limited to 'source4')
-rw-r--r-- | source4/build/pidl/swig.pm | 102 | ||||
-rw-r--r-- | source4/scripting/swig/dcerpc.i | 134 |
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" |