r23792: convert Samba4 to GPLv3
[kai/samba-autobuild/.git] / source4 / scripting / swig / dcerpc.i
index 487876c2fbd7f293cd11fd23965f639649a2fdb6..cf394ba338a6a01cdf4d32c8722480e081dc5663 100644 (file)
@@ -9,7 +9,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -18,8 +18,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 %module dcerpc
@@ -58,272 +57,6 @@ void set_werror_exception(int status)
        PyErr_SetObject(werror_exception, obj);
 }
 
-/* Conversion functions for scalar types */
-
-uint8 uint8_from_python(PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return 0;
-       }
-
-       if (!PyInt_Check(obj) && !PyLong_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting int or long value for %s", name);
-               return 0;
-       }
-
-       if (PyLong_Check(obj))
-               return (uint8)PyLong_AsLong(obj);
-       else
-               return (uint8)PyInt_AsLong(obj);
-}
-
-PyObject *uint8_to_python(uint8 obj)
-{
-       return PyInt_FromLong(obj);
-}
-
-uint16 uint16_from_python(PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return 0;
-       }
-
-       if (!PyInt_Check(obj) && !PyLong_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting int or long value for %s", name);
-               return 0;
-       }
-
-       if (PyLong_Check(obj))
-               return (uint16)PyLong_AsLong(obj);
-       else
-               return (uint16)PyInt_AsLong(obj);
-}
-
-PyObject *uint16_to_python(uint16 obj)
-{
-       return PyInt_FromLong(obj);
-}
-
-uint32 uint32_from_python(PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return 0;
-       }
-
-       if (!PyLong_Check(obj) && !PyInt_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting int or long value for %s", name);
-               return 0;
-       }
-
-       if (PyLong_Check(obj))
-               return (uint32)PyLong_AsUnsignedLongMask(obj);
-
-       return (uint32)PyInt_AsLong(obj);
-}
-
-PyObject *uint32_to_python(uint32 obj)
-{
-       return PyLong_FromLong(obj);
-}
-
-int64 int64_from_python(PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return 0;
-       }
-
-       if (!PyLong_Check(obj) && !PyInt_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting int or long value for %s", name);
-               return 0;
-       }
-
-       if (PyLong_Check(obj))
-               return (int64)PyLong_AsLongLong(obj);
-       else
-               return (int64)PyInt_AsLong(obj);
-}
-
-PyObject *int64_to_python(int64 obj)
-{
-       return PyLong_FromLongLong(obj);
-}
-
-uint64 uint64_from_python(PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return 0;
-       }
-
-       if (!PyLong_Check(obj) && !PyInt_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting int or long value for %s", name);
-               return 0;
-       }
-
-       if (PyLong_Check(obj))
-               return (uint64)PyLong_AsUnsignedLongLong(obj);
-       else
-               return (uint64)PyInt_AsLong(obj);
-}
-
-PyObject *uint64_to_python(uint64 obj)
-{
-       return PyLong_FromUnsignedLongLong(obj);
-}
-
-NTTIME NTTIME_from_python(PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return 0;
-       }
-
-       if (!PyLong_Check(obj) && !PyInt_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting int or long value for %s", name);
-               return 0;
-       }
-
-       if (PyLong_Check(obj))
-               return (NTTIME)PyLong_AsUnsignedLongLong(obj);
-       else
-               return (NTTIME)PyInt_AsUnsignedLongMask(obj);
-}
-
-PyObject *NTTIME_to_python(NTTIME obj)
-{
-       return PyLong_FromUnsignedLongLong(obj);
-}
-
-time_t time_t_from_python(PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return 0;
-       }
-
-       if (!PyLong_Check(obj) && !PyInt_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting int or long value for %s", name);
-               return 0;
-       }
-
-       if (PyLong_Check(obj))
-               return (time_t)PyLong_AsUnsignedLongLong(obj);
-       else
-               return (time_t)PyInt_AsUnsignedLongMask(obj);
-}
-
-PyObject *time_t_to_python(time_t obj)
-{
-       return PyLong_FromUnsignedLongLong(obj);
-}
-
-HYPER_T HYPER_T_from_python(PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return 0;
-       }
-
-       if (!PyLong_Check(obj) && !PyInt_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting int or long value for %s", name);
-               return 0;
-       }
-
-       if (PyLong_Check(obj))
-               return (HYPER_T)PyLong_AsUnsignedLongLong(obj);
-       else
-               return (HYPER_T)PyInt_AsUnsignedLongMask(obj);
-}
-
-PyObject *HYPER_T_to_python(HYPER_T obj)
-{
-       return PyLong_FromUnsignedLongLong(obj);
-}
-
-/* Conversion functions for types that we don't want generated automatically.
-   This is mostly security realted stuff in misc.idl */
-
-char *string_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return NULL;
-       }
-
-       if (obj == Py_None)
-               return NULL;
-
-       if (!PyString_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting string value for %s", name);
-               return NULL;
-       }
-
-       return PyString_AsString(obj);
-}
-
-PyObject *string_ptr_to_python(TALLOC_CTX *mem_ctx, char *obj)
-{
-       if (obj == NULL) {
-               Py_INCREF(Py_None);
-               return Py_None;
-       }
-
-       return PyString_FromString(obj);
-}
-
-#define dom_sid2_ptr_to_python dom_sid_ptr_to_python
-#define dom_sid2_ptr_from_python dom_sid_ptr_from_python
-
-void DATA_BLOB_from_python(TALLOC_CTX *mem_ctx, DATA_BLOB *s,
-                          PyObject *obj, char name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return;
-       }
-
-       if (!PyString_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting string value for key '%s'", name);
-               return;
-       }
-
-       s->length = PyString_Size(obj);
-       s->data = PyString_AsString(obj);
-}
-
-void DATA_BLOB_ptr_from_python(TALLOC_CTX *mem_ctx, DATA_BLOB **s, 
-                              PyObject *obj, char *name)
-{
-       if (obj == NULL) {
-               PyErr_Format(PyExc_ValueError, "Expecting key %s", name);
-               return;
-       }
-
-       if (obj == Py_None) {
-               *s = NULL;
-               return;
-       }
-
-       if (!PyString_Check(obj)) {
-               PyErr_Format(PyExc_TypeError, "Expecting string value for key '%s'", name);
-               return;
-       }
-
-       *s = talloc_p(mem_ctx, DATA_BLOB);
-
-       (*s)->length = PyString_Size(obj);
-       (*s)->data = PyString_AsString(obj);
-}
-
-PyObject *DATA_BLOB_to_python(DATA_BLOB obj)
-{
-       return PyString_FromStringAndSize(obj.data, obj.length);
-}
-
 %}
 
 %include "samba.i"
@@ -335,12 +68,51 @@ PyObject *DATA_BLOB_to_python(DATA_BLOB obj)
 
 %init  %{
        setup_logging("python", DEBUG_STDOUT);  
-       lp_load(dyn_CONFIGFILE, True, False, False);
-       load_interfaces();
+       lp_load();
        ntstatus_exception = PyErr_NewException("_dcerpc.NTSTATUS", NULL, NULL);
        werror_exception = PyErr_NewException("_dcerpc.WERROR", NULL, NULL);
        PyDict_SetItemString(d, "NTSTATUS", ntstatus_exception);
        PyDict_SetItemString(d, "WERROR", werror_exception);
+
+/* BINARY swig_dcerpc INIT */
+
+               extern NTSTATUS dcerpc_misc_init(void);
+               extern NTSTATUS dcerpc_krb5pac_init(void);
+               extern NTSTATUS dcerpc_samr_init(void);
+               extern NTSTATUS dcerpc_dcerpc_init(void);
+               extern NTSTATUS auth_sam_init(void);
+               extern NTSTATUS dcerpc_lsa_init(void);
+               extern NTSTATUS dcerpc_netlogon_init(void);
+               extern NTSTATUS gensec_init(void);
+               extern NTSTATUS auth_developer_init(void);
+               extern NTSTATUS gensec_spnego_init(void);
+               extern NTSTATUS auth_winbind_init(void);
+               extern NTSTATUS gensec_gssapi_init(void);
+               extern NTSTATUS gensec_ntlmssp_init(void);
+               extern NTSTATUS dcerpc_nbt_init(void);
+               extern NTSTATUS auth_anonymous_init(void);
+               extern NTSTATUS gensec_krb5_init(void);
+               extern NTSTATUS dcerpc_schannel_init(void);
+               extern NTSTATUS dcerpc_epmapper_init(void);
+               if (NT_STATUS_IS_ERR(dcerpc_misc_init())) exit(1);
+               if (NT_STATUS_IS_ERR(dcerpc_krb5pac_init())) exit(1);
+               if (NT_STATUS_IS_ERR(dcerpc_samr_init())) exit(1);
+               if (NT_STATUS_IS_ERR(dcerpc_dcerpc_init())) exit(1);
+               if (NT_STATUS_IS_ERR(auth_sam_init())) exit(1);
+               if (NT_STATUS_IS_ERR(dcerpc_lsa_init())) exit(1);
+               if (NT_STATUS_IS_ERR(dcerpc_netlogon_init())) exit(1);
+               if (NT_STATUS_IS_ERR(gensec_init())) exit(1);
+               if (NT_STATUS_IS_ERR(auth_developer_init())) exit(1);
+               if (NT_STATUS_IS_ERR(gensec_spnego_init())) exit(1);
+               if (NT_STATUS_IS_ERR(auth_winbind_init())) exit(1);
+               if (NT_STATUS_IS_ERR(gensec_gssapi_init())) exit(1);
+               if (NT_STATUS_IS_ERR(gensec_ntlmssp_init())) exit(1);
+               if (NT_STATUS_IS_ERR(dcerpc_nbt_init())) exit(1);
+               if (NT_STATUS_IS_ERR(auth_anonymous_init())) exit(1);
+               if (NT_STATUS_IS_ERR(gensec_krb5_init())) exit(1);
+               if (NT_STATUS_IS_ERR(dcerpc_schannel_init())) exit(1);
+               if (NT_STATUS_IS_ERR(dcerpc_epmapper_init())) exit(1);
+
 %}
 
 %typemap(in, numinputs=0) struct dcerpc_pipe **OUT (struct dcerpc_pipe *temp_dcerpc_pipe) {
@@ -352,7 +124,7 @@ PyObject *DATA_BLOB_to_python(DATA_BLOB obj)
 }
 
 %typemap(freearg) TALLOC_CTX * {
-       talloc_free($1);
+//     talloc_free($1);
 }
 
 %typemap(argout) struct dcerpc_pipe ** {
@@ -368,7 +140,7 @@ PyObject *DATA_BLOB_to_python(DATA_BLOB obj)
        /* Set REF_ALLOC flag so we don't have to do too much extra
           mucking around with ref variables in ndr unmarshalling. */
 
-       (*$1)->flags |= DCERPC_NDR_REF_ALLOC;
+       (*$1)->conn->flags |= DCERPC_NDR_REF_ALLOC;
 
        /* Return swig handle on dcerpc_pipe */
 
@@ -379,13 +151,12 @@ PyObject *DATA_BLOB_to_python(DATA_BLOB obj)
 
 %rename(pipe_connect) dcerpc_pipe_connect;
 
-NTSTATUS dcerpc_pipe_connect(struct dcerpc_pipe **OUT,
+NTSTATUS dcerpc_pipe_connect(TALLOC_CTX *parent_ctx,
+                            struct dcerpc_pipe **OUT,
                              const char *binding,
                              const char *pipe_uuid,
-                             uint32 pipe_version,
-                             const char *domain,
-                             const char *username,
-                             const char *password);
+                             uint32_t pipe_version,
+                            struct cli_credentials *credentials);
 
 %typemap(in) DATA_BLOB * (DATA_BLOB temp_data_blob) {
        temp_data_blob.data = PyString_AsString($input);
@@ -395,21 +166,73 @@ NTSTATUS dcerpc_pipe_connect(struct dcerpc_pipe **OUT,
 
 const char *dcerpc_server_name(struct dcerpc_pipe *p);
 
+char *nt_errstr(NTSTATUS nt_code);
+
+/* Some typemaps for easier access to resume handles.  Really this can
+   also be done using the uint32 carray functions, but it's a bit of a
+   hassle.  TODO: Fix memory leak here. */
+
+%typemap(in) uint32_t *resume_handle {
+       $1 = malloc(sizeof(*$1));
+       *$1 = PyLong_AsLong($input);
+}
+
+%typemap(out) uint32_t *resume_handle {
+       $result = PyLong_FromLong(*$1);
+}
+
+%typemap(in) struct policy_handle * {
+
+       if ((SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor,
+                            SWIG_POINTER_EXCEPTION)) == -1) 
+               return NULL;
+
+       if ($1 == NULL) {
+               PyErr_SetString(PyExc_TypeError, "None is not a valid policy handle");
+               return NULL;
+       }
+}
+
+/* When returning a policy handle to Python we need to make a copy of
+   as the talloc context it is created under is destroyed after the
+   wrapper function returns.  TODO: Fix memory leak created here. */
+
+%typemap(out) struct policy_handle * {
+       if ($1) {
+               struct policy_handle *temp = (struct policy_handle *)malloc(sizeof(struct policy_handle));
+               memcpy(temp, $1, sizeof(struct policy_handle));
+               $result = SWIG_NewPointerObj(temp, SWIGTYPE_p_policy_handle, 0);
+       } else {
+               Py_INCREF(Py_None);
+               $result = Py_None;
+       }
+}
+
 %{
 #include "librpc/gen_ndr/ndr_misc.h"
-#include "librpc/gen_ndr/ndr_lsa.h"
+#include "librpc/gen_ndr/ndr_security.h"
 #include "librpc/gen_ndr/ndr_samr.h"
-#include "librpc/gen_ndr/ndr_winreg.h"
-#include "librpc/gen_ndr/ndr_spoolss.h"
 %}
 
-%include "librpc/gen_ndr/misc.i"
-%include "librpc/gen_ndr/lsa.i"
-%include "librpc/gen_ndr/samr.i"
-%include "librpc/gen_ndr/winreg.i"
-%include "librpc/gen_ndr/spoolss.i"
+%include "carrays.i"
+
+/* Some functions for accessing arrays of fixed-width integers. */
+
+%array_functions(uint8_t, uint8_array);
+%array_functions(uint16_t, uint16_array);
+%array_functions(uint32_t, uint32_array);
+
+/* Functions for handling arrays of structures.  It would be nice for 
+   pidl to automatically generating these instead of having to find
+   them all by hand. */
 
-/* The status codes must be included last otherwise the automatically
-   generated .i files get confused.  This is kind of yucky. */
+%array_functions(struct samr_SamEntry, samr_SamEntry_array);
+%array_functions(union samr_ConnectInfo, samr_ConnectInfo_array);
+%array_functions(struct samr_RidWithAttribute, samr_RidWithAttribute_array);
 
-%include "status_codes.i"
+%array_functions(struct lsa_SidPtr, lsa_SidPtr_array);
+
+%include "librpc/gen_ndr/misc.i"
+%include "librpc/gen_ndr/security.i"
+%include "librpc/gen_ndr/samr.i"
+%include "librpc/gen_ndr/lsa.i"