*/
#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)) {
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;
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);
}
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);
}
return NULL;
}
- return Py_None;
+ Py_RETURN_NONE;
}
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;
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);
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 };
Py_DECREF(callback);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *py_messaging_add_name(PyObject *self, PyObject *args, PyObject *kwargs)
return NULL;
}
- return Py_None;
+ Py_RETURN_NONE;
}
irpc_remove_name(iface->msg_ctx, name);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyMethodDef py_messaging_methods[] = {
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;
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);
}
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);
}
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;
if (mod == NULL)
return;
- initirpc();
-
Py_INCREF((PyObject *)&irpc_ClientConnectionType);
PyModule_AddObject(mod, "ClientConnection", (PyObject *)&irpc_ClientConnectionType);