summaryrefslogtreecommitdiff
path: root/server/providers
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2009-08-10 16:58:31 -0400
committerStephen Gallagher <sgallagh@redhat.com>2009-08-11 12:29:36 -0400
commit06a3b13134e29b75971970aa45ba14576a4f6ced (patch)
tree32c82e27f6020dad8134d80d09d22d6d94cbd5b1 /server/providers
parent38268cfc515e1f136cabfbcc9a620a2d9c929cda (diff)
downloadsssd-06a3b13134e29b75971970aa45ba14576a4f6ced.tar.gz
sssd-06a3b13134e29b75971970aa45ba14576a4f6ced.tar.bz2
sssd-06a3b13134e29b75971970aa45ba14576a4f6ced.zip
Change services identification mechanism
Let services identify themselves voiluntarily as the first operation instead of polling from the monitor. Also consolidate some common functions and make them available as monitor helpers.
Diffstat (limited to 'server/providers')
-rw-r--r--server/providers/data_provider.c86
-rw-r--r--server/providers/data_provider_be.c92
2 files changed, 22 insertions, 156 deletions
diff --git a/server/providers/data_provider.c b/server/providers/data_provider.c
index f0ecd30b..7fcd168d 100644
--- a/server/providers/data_provider.c
+++ b/server/providers/data_provider.c
@@ -31,11 +31,6 @@
#include <errno.h>
#include <security/pam_modules.h>
-/* Needed for res_init() */
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-
#include "popt.h"
#include "util/util.h"
#include "confdb/confdb.h"
@@ -84,16 +79,12 @@ struct dp_frontend {
static int dp_backend_destructor(void *ctx);
static int dp_frontend_destructor(void *ctx);
-static int service_identity(DBusMessage *message, struct sbus_connection *conn);
-static int service_pong(DBusMessage *message, struct sbus_connection *conn);
static int service_reload(DBusMessage *message, struct sbus_connection *conn);
-static int service_res_init(DBusMessage *message, struct sbus_connection *conn);
struct sbus_method monitor_dp_methods[] = {
- { MON_CLI_METHOD_IDENTITY, service_identity },
- { MON_CLI_METHOD_PING, service_pong },
+ { MON_CLI_METHOD_PING, monitor_common_pong },
{ MON_CLI_METHOD_RELOAD, service_reload },
- { MON_CLI_METHOD_RES_INIT, service_res_init },
+ { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
{ NULL, NULL }
};
@@ -136,55 +127,6 @@ struct dp_be_request {
struct dp_backend *be;
};
-static int service_identity(DBusMessage *message, struct sbus_connection *conn)
-{
- dbus_uint16_t version = DATA_PROVIDER_VERSION;
- const char *name = DATA_PROVIDER_SERVICE_NAME;
- DBusMessage *reply;
- dbus_bool_t ret;
-
- DEBUG(4, ("Sending identity data [%s,%d]\n", name, version));
-
- reply = dbus_message_new_method_return(message);
- if (!reply) return ENOMEM;
-
- ret = dbus_message_append_args(reply,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_UINT16, &version,
- DBUS_TYPE_INVALID);
- if (!ret) {
- dbus_message_unref(reply);
- return EIO;
- }
-
- /* send reply back */
- sbus_conn_send_reply(conn, reply);
- dbus_message_unref(reply);
-
- return EOK;
-}
-
-static int service_pong(DBusMessage *message, struct sbus_connection *conn)
-{
- DBusMessage *reply;
- dbus_bool_t ret;
-
- reply = dbus_message_new_method_return(message);
- if (!reply) return ENOMEM;
-
- ret = dbus_message_append_args(reply, DBUS_TYPE_INVALID);
- if (!ret) {
- dbus_message_unref(reply);
- return EIO;
- }
-
- /* send reply back */
- sbus_conn_send_reply(conn, reply);
- dbus_message_unref(reply);
-
- return EOK;
-}
-
static int service_reload(DBusMessage *message, struct sbus_connection *conn)
{
/* Monitor calls this function when we need to reload
@@ -193,19 +135,7 @@ static int service_reload(DBusMessage *message, struct sbus_connection *conn)
*/
/* Send an empty reply to acknowledge receipt */
- return service_pong(message, conn);
-}
-
-static int service_res_init(DBusMessage *message, struct sbus_connection *conn)
-{
- int ret;
-
- ret = res_init();
- if(ret != 0) {
- return EIO;
- }
-
- return service_pong(message, conn);
+ return monitor_common_pong(message, conn);
}
static int dp_monitor_init(struct dp_ctx *dpctx)
@@ -229,8 +159,14 @@ static int dp_monitor_init(struct dp_ctx *dpctx)
return ret;
}
- /* Set up DP-specific listeners */
- /* None currently used */
+ /* Identify ourselves to the monitor */
+ ret = monitor_common_send_id(conn,
+ DATA_PROVIDER_SERVICE_NAME,
+ DATA_PROVIDER_VERSION);
+ if (ret != EOK) {
+ DEBUG(0, ("Failed to identify to the monitor!\n"));
+ return ret;
+ }
return EOK;
}
diff --git a/server/providers/data_provider_be.c b/server/providers/data_provider_be.c
index 49885edc..46f8db51 100644
--- a/server/providers/data_provider_be.c
+++ b/server/providers/data_provider_be.c
@@ -34,11 +34,6 @@
#include <security/pam_appl.h>
#include <security/pam_modules.h>
-/* Needed for res_init() */
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-
#include "popt.h"
#include "util/util.h"
#include "confdb/confdb.h"
@@ -53,14 +48,9 @@
#define BE_CONF_ENTRY "config/domains/%s"
-static int service_identity(DBusMessage *message, struct sbus_connection *conn);
-static int service_pong(DBusMessage *message, struct sbus_connection *conn);
-static int service_res_init(DBusMessage *message, struct sbus_connection *conn);
-
struct sbus_method monitor_be_methods[] = {
- { MON_CLI_METHOD_IDENTITY, service_identity },
- { MON_CLI_METHOD_PING, service_pong },
- { MON_CLI_METHOD_RES_INIT, service_res_init },
+ { MON_CLI_METHOD_PING, monitor_common_pong },
+ { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
{ NULL, NULL }
};
@@ -102,75 +92,6 @@ static struct bet_data bet_data[] = {
{BET_MAX, NULL, NULL}
};
-
-
-static int service_identity(DBusMessage *message, struct sbus_connection *conn)
-{
- dbus_uint16_t version = DATA_PROVIDER_VERSION;
- struct be_ctx *ctx;
- DBusMessage *reply;
- dbus_bool_t ret;
- void *user_data;
-
- user_data = sbus_conn_get_private_data(conn);
- if (!user_data) return EINVAL;
- ctx = talloc_get_type(user_data, struct be_ctx);
- if (!ctx) return EINVAL;
-
- DEBUG(4,("Sending ID reply: (%s,%d)\n", ctx->identity, version));
-
- reply = dbus_message_new_method_return(message);
- if (!reply) return ENOMEM;
-
- ret = dbus_message_append_args(reply,
- DBUS_TYPE_STRING, &ctx->identity,
- DBUS_TYPE_UINT16, &version,
- DBUS_TYPE_INVALID);
- if (!ret) {
- dbus_message_unref(reply);
- return EIO;
- }
-
- /* send reply back */
- sbus_conn_send_reply(conn, reply);
- dbus_message_unref(reply);
-
- return EOK;
-}
-
-static int service_pong(DBusMessage *message, struct sbus_connection *conn)
-{
- DBusMessage *reply;
- dbus_bool_t ret;
-
- reply = dbus_message_new_method_return(message);
- if (!reply) return ENOMEM;
-
- ret = dbus_message_append_args(reply, DBUS_TYPE_INVALID);
- if (!ret) {
- dbus_message_unref(reply);
- return EIO;
- }
-
- /* send reply back */
- sbus_conn_send_reply(conn, reply);
- dbus_message_unref(reply);
-
- return EOK;
-}
-
-static int service_res_init(DBusMessage *message, struct sbus_connection *conn)
-{
- int ret;
-
- ret = res_init();
- if(ret != 0) {
- return EIO;
- }
-
- return service_pong(message, conn);
-}
-
static int be_identity(DBusMessage *message, struct sbus_connection *conn)
{
dbus_uint16_t version = DATA_PROVIDER_VERSION;
@@ -704,6 +625,15 @@ static int mon_cli_init(struct be_ctx *ctx)
return ret;
}
+ /* Identify ourselves to the monitor */
+ ret = monitor_common_send_id(ctx->mon_conn,
+ ctx->identity,
+ DATA_PROVIDER_VERSION);
+ if (ret != EOK) {
+ DEBUG(0, ("Failed to identify to the monitor!\n"));
+ return ret;
+ }
+
return EOK;
}