summaryrefslogtreecommitdiffstats
path: root/worker
diff options
context:
space:
mode:
authorSumit Bose <sbose@nb.localdomain>2009-01-07 15:52:08 +0100
committerSumit Bose <sbose@nb.localdomain>2009-01-07 15:52:08 +0100
commita0778bb020fa76ede6491e32d8cd4583cc671814 (patch)
tree4548bc7886d32c8d6ac5ba1a935104babffa1fcd /worker
parent1f939fa547404a0b9509a3d32572b5f41c446743 (diff)
started communication with data provider
Diffstat (limited to 'worker')
-rw-r--r--worker/sbus_client.c235
1 files changed, 225 insertions, 10 deletions
diff --git a/worker/sbus_client.c b/worker/sbus_client.c
index cbc9650..e8a6820 100644
--- a/worker/sbus_client.c
+++ b/worker/sbus_client.c
@@ -1,45 +1,178 @@
#include <errno.h>
#include <sys/time.h>
-#include "events.h"
+#include "tevent.h"
#include "util/util.h"
#include "sbus/sssd_dbus.h"
#include "sbus_interfaces.h"
#include "util/service_helpers.h"
+#include "providers/data_provider.h"
+struct pp_context {
+ struct event_context *event_ctx;
+ struct service_sbus_ctx *sbus_dp_ctx;
+};
static void task_check_for_new_policies(struct event_context *ev_ctx,
struct timed_event *te,
- struct timeval tval, void *main_ctx);
-static void set_task_check_for_new_policies(struct main_context *main_ctx) {
+ struct timeval tval, void *ptr);
+static void process_dp_reply(DBusPendingCall *pending, void *ptr);
+
+static void set_task_check_for_new_policies(struct pp_context *pp_ctx) {
struct timed_event *te = NULL;
struct timeval tv;
gettimeofday(&tv, NULL);
tv.tv_sec += 5;
tv.tv_usec = 0;
- te = event_add_timed(main_ctx->event_ctx, main_ctx, tv, task_check_for_new_policies, main_ctx);
+ te = event_add_timed(pp_ctx->event_ctx, pp_ctx, tv, task_check_for_new_policies, pp_ctx);
if (te == NULL) exit(1);
}
static void task_check_for_new_policies(struct event_context *ev_ctx,
struct timed_event *te,
- struct timeval tval, void *main_ctx) {
+ struct timeval tval, void *ptr) {
+ DBusMessage* msg;
+ DBusConnection *conn;
+ DBusPendingCall* pending;
+
+ struct pp_context *pp_ctx = talloc_get_type(ptr, struct pp_context);
+
+
DEBUG(0,("Hello, I'm task_check_for_new_policies.\n"));
- set_task_check_for_new_policies(main_ctx);
+ conn = sbus_get_connection(pp_ctx->sbus_dp_ctx->scon_ctx);
+
+ msg = dbus_message_new_method_call(NULL,
+ DP_CLI_PATH,
+ DP_CLI_INTERFACE,
+ DP_PP_GET_POLICIES);
+
+ if (msg == NULL) {
+ DEBUG(0, ("dbus_message_new_method_call returned NULL, I do not know what to do, aborting ...\n"));
+ /* FIXME */
+ exit(1);
+ }
+
+ if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) {
+ DEBUG(0, ("Out Of Memory!\n"));
+ /* FIXME */
+ exit(1);
+ }
+
+ if ( pending == NULL ) {
+ DEBUG(0, ("pending is NULL\n"));
+ /* FIXME */
+ exit(1);
+ }
+
+ dbus_pending_call_set_notify(pending, process_dp_reply, pp_ctx, NULL);
+ dbus_message_unref(msg);
+}
+
+
+static void process_dp_reply(DBusPendingCall *pending, void *ptr) {
+ DBusError dbus_error;
+ DBusMessage* msg;
+ int ret;
+ int type;
+ dbus_uint32_t ans;
+
+ dbus_error_init(&dbus_error);
+
+ dbus_pending_call_block(pending);
+ msg = dbus_pending_call_steal_reply(pending);
+ if (msg == NULL) {
+ DEBUG(0, ("Reply Null\n"));
+ /* FIXME */
+ exit(1);
+ }
+
+ type = dbus_message_get_type(msg);
+ switch (type) {
+ case DBUS_MESSAGE_TYPE_METHOD_RETURN:
+ ret = dbus_message_get_args(msg, &dbus_error,
+ DBUS_TYPE_UINT32, &ans,
+ DBUS_TYPE_INVALID);
+ if (!ret) {
+ DEBUG(0, ("Failed to parse reply.\n"));
+ exit(1);
+ } else {
+ switch(ans) {
+ case POL_ANS_OFFLINE:
+ DEBUG(3, ("Got POL_ANS_OFFLINE\n"));
+ break;
+ case POL_ANS_NOTHING_TO_DO:
+ DEBUG(3, ("Got POL_ANS_NOTHING_TO_DO\n"));
+ break;
+ case POL_ANS_NEW_POL_AVAIL:
+ DEBUG(3, ("Got POL_ANS_NEW_POL_AVAIL\n"));
+ break;
+ case POL_ANS_ERROR:
+ DEBUG(3, ("Got POL_ANS_ERROR\n"));
+ break;
+ default:
+ DEBUG(3, ("Got unknow reply: %d\n", ans));
+ }
+ }
+ break;
+ case DBUS_MESSAGE_TYPE_ERROR:
+ DEBUG(0, ("Reply error.\n"));
+ break;
+ default:
+ DEBUG(0, ("Default... what now?.\n"));
+ }
+
+
+ dbus_pending_call_unref(pending);
+ dbus_message_unref(msg);
+
+
+ set_task_check_for_new_policies(ptr);
}
static int service_identity(DBusMessage *message, void *data, DBusMessage **r);
static int service_pong(DBusMessage *message, void *data, DBusMessage **r);
+static int dp_cli_identity(DBusMessage *message, void *data, DBusMessage **r);
-struct sbus_method sbus_methods[] = {
+struct sbus_method sbus_monitor_methods[] = {
{SERVICE_METHOD_IDENTITY, service_identity},
{SERVICE_METHOD_PING, service_pong},
{NULL, NULL}
};
+struct sbus_method sbus_dp_methods[] = {
+ {DP_CLI_METHOD_IDENTITY, dp_cli_identity},
+ {NULL, NULL}
+};
+
+
+static int dp_cli_identity(DBusMessage *message, void *data, DBusMessage **r) {
+ dbus_uint16_t version = 0x0001; /*FIXME */
+ dbus_uint16_t clitype = DP_CLI_FRONTEND;
+ DBusMessage *reply;
+ dbus_bool_t ret;
+ char *name="PolicyProcessor";
+ char *domain="IPA";
+ DEBUG(0, ("dp_cli_identity got called.\n"));
+
+ reply = dbus_message_new_method_return(message);
+ ret = dbus_message_append_args(reply,
+ DBUS_TYPE_UINT16, &clitype,
+ DBUS_TYPE_UINT16, &version,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_STRING, &domain,
+ DBUS_TYPE_INVALID);
+ if (!ret) {
+ return EIO;
+ }
+
+ *r = reply;
+ return EOK;
+}
+
+
static int service_identity(DBusMessage *message, void *data, DBusMessage **r)
{
dbus_uint16_t version = 0x0001;
@@ -47,6 +180,7 @@ static int service_identity(DBusMessage *message, void *data, DBusMessage **r)
DBusMessage *reply;
dbus_bool_t ret;
+ DEBUG(0, ("service_identity got called.\n"));
reply = dbus_message_new_method_return(message);
ret = dbus_message_append_args(reply,
DBUS_TYPE_STRING, &name,
@@ -75,10 +209,76 @@ static int service_pong(DBusMessage *message, void *data, DBusMessage **r)
return EOK;
}
+static int sssd_dp_sbus_init(TALLOC_CTX *mem_ctx,
+ struct event_context *ev,
+ struct confdb_ctx *cdb,
+ struct sbus_method *methods,
+ struct service_sbus_ctx **srvs_ctx,
+ sbus_conn_destructor_fn destructor) {
+ struct service_sbus_ctx *ss_ctx;
+ struct sbus_method_ctx *sm_ctx;
+ TALLOC_CTX *ctx;
+ char *default_dp_address;
+ int ret;
+
+ ctx = talloc_new(mem_ctx);
+ if (ctx == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ss_ctx = talloc_zero(ctx, struct service_sbus_ctx);
+ if (ss_ctx == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+ ss_ctx->ev = ev;
+
+ default_dp_address = talloc_asprintf(ctx, "unix:path=%s/%s",
+ PIPE_PATH, DATA_PROVIDER_PIPE);
+ if (default_dp_address == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = sbus_new_connection(ss_ctx, ss_ctx->ev,
+ default_dp_address, &ss_ctx->scon_ctx,
+ destructor);
+ if (ret != EOK) goto done;
+
+ sm_ctx = talloc_zero(ss_ctx, struct sbus_method_ctx);
+ if (sm_ctx == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ sm_ctx->interface = talloc_strdup(sm_ctx, DATA_PROVIDER_INTERFACE);
+ sm_ctx->path = talloc_strdup(sm_ctx, DATA_PROVIDER_PATH);
+ if (!sm_ctx->interface || !sm_ctx->path) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ sm_ctx->methods = methods;
+ sm_ctx->message_handler = sbus_message_handler;
+ sbus_conn_add_method_ctx(ss_ctx->scon_ctx, sm_ctx);
+
+ talloc_steal(mem_ctx,ss_ctx);
+ *srvs_ctx = ss_ctx;
+ ret = EOK;
+
+done:
+ talloc_free(ctx);
+ return ret;
+}
+
+
int setup_sbus_and_server_loop(void) {
int ret=0;
struct main_context *main_ctx = NULL;
struct service_sbus_ctx *sbus_ctx = NULL;
+ struct service_sbus_ctx *sbus_dp_ctx = NULL;
+ struct pp_context *pp_ctx;
ret = server_setup("PolicyProcessor", 0, &main_ctx);
if (ret != EOK ) {
@@ -87,12 +287,27 @@ int setup_sbus_and_server_loop(void) {
}
sbus_ctx = sssd_service_sbus_init(main_ctx, main_ctx->event_ctx,
- main_ctx->confdb_ctx, sbus_methods, NULL);
+ main_ctx->confdb_ctx, sbus_monitor_methods, NULL);
if (sbus_ctx == NULL) return -1;
- set_task_check_for_new_policies(main_ctx);
+ ret = sssd_dp_sbus_init(main_ctx, main_ctx->event_ctx,
+ main_ctx->confdb_ctx, sbus_dp_methods,
+ &sbus_dp_ctx, NULL);
+ if (ret != EOK) goto done;
+
+ pp_ctx = talloc_zero(main_ctx, struct pp_context);
+ if (pp_ctx == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+ pp_ctx->event_ctx = main_ctx->event_ctx;
+ pp_ctx->sbus_dp_ctx = sbus_dp_ctx;
+
+ set_task_check_for_new_policies(pp_ctx);
server_loop(main_ctx);
- return 0;
+done:
+ talloc_free(main_ctx);
+ return ret;
}