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,
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
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"
%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) {
}
%typemap(freearg) TALLOC_CTX * {
- talloc_free($1);
+// talloc_free($1);
}
%typemap(argout) struct dcerpc_pipe ** {
/* 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 */
%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);
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"