s3/s4 build: Fix Py_RETURN_NONE to work with python versions < 2.4
[tprouty/samba.git] / source4 / lib / messaging / pymessaging.c
index 869508fca65f7f5cbb8c1e3b06478e6db6f8cea3..3fa59bde573696defcff6cd800e1bb7d029e6ae3 100644 (file)
@@ -20,7 +20,8 @@
 */
 
 #include "includes.h"
-#include <Python.h>
+#include "../lib/util/python_util.h"
+#include "scripting/python/modules.h"
 #include "libcli/util/pyerrors.h"
 #include "librpc/rpc/pyrpc.h"
 #include "lib/messaging/irpc.h"
 #include "lib/events/events.h"
 #include "cluster/cluster.h"
 #include "param/param.h"
-#include "librpc/gen_ndr/py_irpc.h"
 
 PyAPI_DATA(PyTypeObject) messaging_Type;
 PyAPI_DATA(PyTypeObject) irpc_ClientConnectionType;
 
+/* FIXME: This prototype should be in param/pyparam.h */
+struct loadparm_context *py_default_loadparm_context(TALLOC_CTX *mem_ctx);
+
+/* FIXME: This prototype should be in py_irpc.h, or shared otherwise */
+extern const struct PyNdrRpcMethodDef py_ndr_irpc_methods[];
+
 static bool server_id_from_py(PyObject *object, struct server_id *server_id)
 {
        if (!PyTuple_Check(object)) {
@@ -59,7 +65,7 @@ typedef struct {
 
 PyObject *py_messaging_connect(PyTypeObject *self, PyObject *args, PyObject *kwargs)
 {
-       struct event_context *ev;
+       struct tevent_context *ev;
        const char *kwnames[] = { "own_id", "messaging_path", NULL };
        PyObject *own_id = Py_None;
        const char *messaging_path = NULL;
@@ -76,10 +82,11 @@ PyObject *py_messaging_connect(PyTypeObject *self, PyObject *args, PyObject *kwa
 
        ret->mem_ctx = talloc_new(NULL);
 
-       ev = event_context_init(ret->mem_ctx);
+       ev = s4_event_context_init(ret->mem_ctx);
 
        if (messaging_path == NULL) {
-               messaging_path = lp_messaging_path(ret, global_loadparm);
+               messaging_path = lp_messaging_path(ret->mem_ctx, 
+                                                                  py_default_loadparm_context(ret->mem_ctx));
        } else {
                messaging_path = talloc_strdup(ret->mem_ctx, messaging_path);
        }
@@ -93,12 +100,12 @@ PyObject *py_messaging_connect(PyTypeObject *self, PyObject *args, PyObject *kwa
                ret->msg_ctx = messaging_init(ret->mem_ctx, 
                                            messaging_path,
                                            server_id,
-                                           lp_iconv_convenience(global_loadparm),
+                                       py_iconv_convenience(ret->mem_ctx),
                                            ev);
        } else {
                ret->msg_ctx = messaging_client_init(ret->mem_ctx, 
                                            messaging_path,
-                                           lp_iconv_convenience(global_loadparm),
+                                       py_iconv_convenience(ret->mem_ctx),
                                            ev);
        }
 
@@ -145,7 +152,7 @@ static PyObject *py_messaging_send(PyObject *self, PyObject *args, PyObject *kwa
                return NULL;
        }
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static void py_msg_callback_wrapper(struct messaging_context *msg, void *private, 
@@ -162,11 +169,11 @@ static void py_msg_callback_wrapper(struct messaging_context *msg, void *private
 static PyObject *py_messaging_register(PyObject *self, PyObject *args, PyObject *kwargs)
 {
        messaging_Object *iface = (messaging_Object *)self;
-       uint32_t msg_type = -1;
+       int msg_type = -1;
        PyObject *callback;
        NTSTATUS status;
        const char *kwnames[] = { "callback", "msg_type", NULL };
-
+       
        if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|i:send", 
                discard_const_p(char *, kwnames), &callback, &msg_type)) {
                return NULL;
@@ -175,8 +182,10 @@ static PyObject *py_messaging_register(PyObject *self, PyObject *args, PyObject
        Py_INCREF(callback);
 
        if (msg_type == -1) {
+               uint32_t msg_type32 = msg_type;
                status = messaging_register_tmp(iface->msg_ctx, callback,
-                                               py_msg_callback_wrapper, &msg_type);
+                                               py_msg_callback_wrapper, &msg_type32);
+               msg_type = msg_type32;
        } else {
                status = messaging_register(iface->msg_ctx, callback,
                                    msg_type, py_msg_callback_wrapper);
@@ -192,7 +201,7 @@ static PyObject *py_messaging_register(PyObject *self, PyObject *args, PyObject
 static PyObject *py_messaging_deregister(PyObject *self, PyObject *args, PyObject *kwargs)
 {
        messaging_Object *iface = (messaging_Object *)self;
-       uint32_t msg_type = -1;
+       int msg_type = -1;
        PyObject *callback;
        const char *kwnames[] = { "callback", "msg_type", NULL };
 
@@ -205,7 +214,7 @@ static PyObject *py_messaging_deregister(PyObject *self, PyObject *args, PyObjec
 
        Py_DECREF(callback);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_messaging_add_name(PyObject *self, PyObject *args, PyObject *kwargs)
@@ -226,7 +235,7 @@ static PyObject *py_messaging_add_name(PyObject *self, PyObject *args, PyObject
                return NULL;
        }
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 
@@ -243,7 +252,7 @@ static PyObject *py_messaging_remove_name(PyObject *self, PyObject *args, PyObje
 
        irpc_remove_name(iface->msg_ctx, name);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyMethodDef py_messaging_methods[] = {
@@ -308,7 +317,7 @@ typedef struct {
 
 PyObject *py_irpc_connect(PyTypeObject *self, PyObject *args, PyObject *kwargs)
 {
-       struct event_context *ev;
+       struct tevent_context *ev;
        const char *kwnames[] = { "server", "own_id", "messaging_path", NULL };
        char *server;
        const char *messaging_path = NULL;
@@ -328,10 +337,11 @@ PyObject *py_irpc_connect(PyTypeObject *self, PyObject *args, PyObject *kwargs)
 
        ret->server_name = server;
 
-       ev = event_context_init(ret->mem_ctx);
+       ev = s4_event_context_init(ret->mem_ctx);
 
        if (messaging_path == NULL) {
-               messaging_path = lp_messaging_path(ret, global_loadparm);
+               messaging_path = lp_messaging_path(ret->mem_ctx, 
+                                                                  py_default_loadparm_context(ret->mem_ctx));
        } else {
                messaging_path = talloc_strdup(ret->mem_ctx, messaging_path);
        }
@@ -345,12 +355,12 @@ PyObject *py_irpc_connect(PyTypeObject *self, PyObject *args, PyObject *kwargs)
                ret->msg_ctx = messaging_init(ret->mem_ctx, 
                                            messaging_path,
                                            server_id,
-                                           lp_iconv_convenience(global_loadparm),
+                                       py_iconv_convenience(ret->mem_ctx),
                                            ev);
        } else {
                ret->msg_ctx = messaging_client_init(ret->mem_ctx, 
                                            messaging_path,
-                                           lp_iconv_convenience(global_loadparm),
+                                       py_iconv_convenience(ret->mem_ctx),
                                            ev);
        }
 
@@ -533,8 +543,12 @@ static bool irpc_AddNdrRpcMethods(PyTypeObject *ifacetype, const struct PyNdrRpc
 
 void initmessaging(void)
 {
-       extern void initirpc(void);
        PyObject *mod;
+       PyObject *dep_irpc;
+
+       dep_irpc = PyImport_ImportModule("samba.dcerpc.irpc");
+       if (dep_irpc == NULL)
+               return;
 
        if (PyType_Ready(&irpc_ClientConnectionType) < 0)
                return;
@@ -552,8 +566,6 @@ void initmessaging(void)
        if (mod == NULL)
                return;
 
-       initirpc();
-
        Py_INCREF((PyObject *)&irpc_ClientConnectionType);
        PyModule_AddObject(mod, "ClientConnection", (PyObject *)&irpc_ClientConnectionType);