monitor_sbus.c revision 8263230a0c543a737ab17a071a0ea964dcab4259
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz/*
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz SSSD
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz Data Provider Helpers
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz Copyright (C) Stephen Gallagher <sgallagh@redhat.com> 2009
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz
3ca6ee111e6044cb463e6dc45b9adcfa3050ff00rbowen This program is free software; you can redistribute it and/or modify
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim it under the terms of the GNU General Public License as published by
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim the Free Software Foundation; either version 3 of the License, or
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen (at your option) any later version.
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen This program is distributed in the hope that it will be useful,
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen but WITHOUT ANY WARRANTY; without even the implied warranty of
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz GNU General Public License for more details.
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen
3f08db06526d6901aa08c110b5bc7dde6bc39905nd You should have received a copy of the GNU General Public License
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim along with this program. If not, see <http://www.gnu.org/licenses/>.
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim*/
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz
3f08db06526d6901aa08c110b5bc7dde6bc39905nd/* Needed for res_init() */
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz#include <netinet/in.h>
af84459fbf938e508fd10b01cb8d699c79083813takashi#include <arpa/nameser.h>
343a568a3281a6a0a4c562407aef7b0dfc299b98minfrin#include <resolv.h>
343a568a3281a6a0a4c562407aef7b0dfc299b98minfrin
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz#include "util/util.h"
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz#include "confdb/confdb.h"
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz#include "sbus/sssd_dbus.h"
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz#include "monitor/monitor_interfaces.h"
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantzint monitor_get_sbus_address(TALLOC_CTX *mem_ctx, char **address)
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz{
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim char *default_address;
53cf0034f617fdca55a345580e13afd88000e9ccjim
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim *address = NULL;
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim default_address = talloc_asprintf(mem_ctx, "unix:path=%s/%s",
499c9eae878c38f90c6ec605e6d88c6d12626bf1rbowen PIPE_PATH, SSSD_SERVICE_PIPE);
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim if (default_address == NULL) {
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh return ENOMEM;
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim }
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz *address = default_address;
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz return EOK;
f5f89f79907d5295ca937e1814227875f11949b9jorton}
df855969ca92fac8fecc1e19085904611e3ee06dtrawick
65af5ed5b6403a8bed4edaa782c9905780015017rbowenstatic void id_callback(DBusPendingCall *pending, void *ptr)
65af5ed5b6403a8bed4edaa782c9905780015017rbowen{
df855969ca92fac8fecc1e19085904611e3ee06dtrawick DBusMessage *reply;
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf DBusError dbus_error;
0b34051dc3ae7468aac0d57222157a291cca83a7jim dbus_bool_t ret;
65af5ed5b6403a8bed4edaa782c9905780015017rbowen dbus_uint16_t mon_ver;
65af5ed5b6403a8bed4edaa782c9905780015017rbowen int type;
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf
0b34051dc3ae7468aac0d57222157a291cca83a7jim dbus_error_init(&dbus_error);
0b34051dc3ae7468aac0d57222157a291cca83a7jim
0b34051dc3ae7468aac0d57222157a291cca83a7jim reply = dbus_pending_call_steal_reply(pending);
29ec8a3537a4522525a69e262a21448b315c91ddcovener if (!reply) {
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf /* reply should never be null. This function shouldn't be called
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf * until reply is valid or timeout has occurred. If reply is NULL
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf * here, something is seriously wrong and we should bail out.
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf */
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf DEBUG(0, ("Severe error. A reply callback was called but no"
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf " reply was received and no timeout occurred\n"));
29ec8a3537a4522525a69e262a21448b315c91ddcovener
4fb14420685b9831d11271e9e24b40e7ccec808esf /* FIXME: Destroy this connection ? */
4fb14420685b9831d11271e9e24b40e7ccec808esf goto done;
4fb14420685b9831d11271e9e24b40e7ccec808esf }
4fb14420685b9831d11271e9e24b40e7ccec808esf
4fb14420685b9831d11271e9e24b40e7ccec808esf type = dbus_message_get_type(reply);
5997560e9031b7b0fd0c392512f6cf5ee737b89bjim switch (type) {
9534272616b71aaea50aeec4162e749a96aebd7fsf case DBUS_MESSAGE_TYPE_METHOD_RETURN:
9534272616b71aaea50aeec4162e749a96aebd7fsf ret = dbus_message_get_args(reply, &dbus_error,
9534272616b71aaea50aeec4162e749a96aebd7fsf DBUS_TYPE_UINT16, &mon_ver,
9534272616b71aaea50aeec4162e749a96aebd7fsf DBUS_TYPE_INVALID);
9534272616b71aaea50aeec4162e749a96aebd7fsf if (!ret) {
9534272616b71aaea50aeec4162e749a96aebd7fsf DEBUG(1, ("Failed to parse message\n"));
9534272616b71aaea50aeec4162e749a96aebd7fsf if (dbus_error_is_set(&dbus_error)) dbus_error_free(&dbus_error);
4fb14420685b9831d11271e9e24b40e7ccec808esf /* FIXME: Destroy this connection ? */
9534272616b71aaea50aeec4162e749a96aebd7fsf goto done;
9534272616b71aaea50aeec4162e749a96aebd7fsf }
9534272616b71aaea50aeec4162e749a96aebd7fsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf DEBUG(4, ("Got id ack and version (%d) from Monitor\n", mon_ver));
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf break;
9534272616b71aaea50aeec4162e749a96aebd7fsf
5997560e9031b7b0fd0c392512f6cf5ee737b89bjim case DBUS_MESSAGE_TYPE_ERROR:
5997560e9031b7b0fd0c392512f6cf5ee737b89bjim DEBUG(0,("The Monitor returned an error [%s]\n",
5997560e9031b7b0fd0c392512f6cf5ee737b89bjim dbus_message_get_error_name(reply)));
4fb14420685b9831d11271e9e24b40e7ccec808esf /* Falling through to default intentionally*/
4fb14420685b9831d11271e9e24b40e7ccec808esf default:
4fb14420685b9831d11271e9e24b40e7ccec808esf /*
4fb14420685b9831d11271e9e24b40e7ccec808esf * Timeout or other error occurred or something
4fb14420685b9831d11271e9e24b40e7ccec808esf * unexpected happened.
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf * It doesn't matter which, because either way we
4fb14420685b9831d11271e9e24b40e7ccec808esf * know that this connection isn't trustworthy.
4fb14420685b9831d11271e9e24b40e7ccec808esf * We'll destroy it now.
4fb14420685b9831d11271e9e24b40e7ccec808esf */
4fb14420685b9831d11271e9e24b40e7ccec808esf
4fb14420685b9831d11271e9e24b40e7ccec808esf /* FIXME: Destroy this connection ? */
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf break;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf }
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsfdone:
f5f89f79907d5295ca937e1814227875f11949b9jorton dbus_pending_call_unref(pending);
7add1372edb1ee95a2c4d1314df4c7567bda7c62jim dbus_message_unref(reply);
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz}
53cf0034f617fdca55a345580e13afd88000e9ccjim
53cf0034f617fdca55a345580e13afd88000e9ccjimint monitor_common_send_id(struct sbus_connection *conn,
53cf0034f617fdca55a345580e13afd88000e9ccjim const char *name, uint16_t version)
53cf0034f617fdca55a345580e13afd88000e9ccjim{
53cf0034f617fdca55a345580e13afd88000e9ccjim DBusPendingCall *pending_reply;
53cf0034f617fdca55a345580e13afd88000e9ccjim DBusConnection *dbus_conn;
53cf0034f617fdca55a345580e13afd88000e9ccjim DBusMessage *msg;
53cf0034f617fdca55a345580e13afd88000e9ccjim dbus_bool_t ret;
53cf0034f617fdca55a345580e13afd88000e9ccjim
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf dbus_conn = sbus_get_connection(conn);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf /* create the message */
53cf0034f617fdca55a345580e13afd88000e9ccjim msg = dbus_message_new_method_call(NULL,
53cf0034f617fdca55a345580e13afd88000e9ccjim MON_SRV_PATH,
53cf0034f617fdca55a345580e13afd88000e9ccjim MON_SRV_INTERFACE,
53cf0034f617fdca55a345580e13afd88000e9ccjim MON_SRV_METHOD_REGISTER);
53cf0034f617fdca55a345580e13afd88000e9ccjim if (msg == NULL) {
53cf0034f617fdca55a345580e13afd88000e9ccjim DEBUG(0, ("Out of memory?!\n"));
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf return ENOMEM;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf }
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf DEBUG(4, ("Sending ID: (%s,%d)\n", name, version));
a1f95ac06fca1d4f5b6915b2da45a87211be3132minfrin
a1f95ac06fca1d4f5b6915b2da45a87211be3132minfrin ret = dbus_message_append_args(msg,
a1f95ac06fca1d4f5b6915b2da45a87211be3132minfrin DBUS_TYPE_STRING, &name,
a1f95ac06fca1d4f5b6915b2da45a87211be3132minfrin DBUS_TYPE_UINT16, &version,
a1f95ac06fca1d4f5b6915b2da45a87211be3132minfrin DBUS_TYPE_INVALID);
a1f95ac06fca1d4f5b6915b2da45a87211be3132minfrin if (!ret) {
4eb7c39c20580bee95586910acc3241784d42ce5sf DEBUG(1, ("Failed to build message\n"));
4eb7c39c20580bee95586910acc3241784d42ce5sf return EIO;
4eb7c39c20580bee95586910acc3241784d42ce5sf }
4eb7c39c20580bee95586910acc3241784d42ce5sf
4eb7c39c20580bee95586910acc3241784d42ce5sf ret = dbus_connection_send_with_reply(dbus_conn, msg, &pending_reply,
4eb7c39c20580bee95586910acc3241784d42ce5sf 30000 /* TODO: set timeout */);
4eb7c39c20580bee95586910acc3241784d42ce5sf if (!ret || !pending_reply) {
4eb7c39c20580bee95586910acc3241784d42ce5sf /*
4eb7c39c20580bee95586910acc3241784d42ce5sf * Critical Failure
4eb7c39c20580bee95586910acc3241784d42ce5sf * We can't communicate on this connection
4eb7c39c20580bee95586910acc3241784d42ce5sf * We'll drop it using the default destructor.
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf */
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf DEBUG(0, ("D-BUS send failed.\n"));
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf dbus_message_unref(msg);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf return EIO;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf }
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf /* Set up the reply handler */
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf dbus_pending_call_set_notify(pending_reply, id_callback, NULL, NULL);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf dbus_message_unref(msg);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf return EOK;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf}
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsfint monitor_common_pong(DBusMessage *message,
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf struct sbus_connection *conn)
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf{
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf DBusMessage *reply;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf dbus_bool_t ret;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf reply = dbus_message_new_method_return(message);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf if (!reply) return ENOMEM;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf ret = dbus_message_append_args(reply, DBUS_TYPE_INVALID);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf if (!ret) {
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf dbus_message_unref(reply);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf return EIO;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf }
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf /* send reply back */
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf sbus_conn_send_reply(conn, reply);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf dbus_message_unref(reply);
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf return EOK;
b71b65bbe45d025c2714893350a4ccea9f6d7fbcsf}
53cf0034f617fdca55a345580e13afd88000e9ccjim
53cf0034f617fdca55a345580e13afd88000e9ccjimint monitor_common_res_init(DBusMessage *message,
53cf0034f617fdca55a345580e13afd88000e9ccjim struct sbus_connection *conn)
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz{
3e4bc252a7bd65ed789cbe305c257dfb7abf7cdcjerenkrantz int ret;
f5f89f79907d5295ca937e1814227875f11949b9jorton
df855969ca92fac8fecc1e19085904611e3ee06dtrawick ret = res_init();
f5f89f79907d5295ca937e1814227875f11949b9jorton if(ret != 0) {
f5f89f79907d5295ca937e1814227875f11949b9jorton return EIO;
f5f89f79907d5295ca937e1814227875f11949b9jorton }
f5f89f79907d5295ca937e1814227875f11949b9jorton
f5f89f79907d5295ca937e1814227875f11949b9jorton /* Send an empty reply to acknowledge receipt */
f5f89f79907d5295ca937e1814227875f11949b9jorton return monitor_common_pong(message, conn);
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf}
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf