summaryrefslogtreecommitdiffstats
path: root/src/monitor/monitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/monitor/monitor.c')
-rw-r--r--src/monitor/monitor.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 47832c95d..caf405612 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -119,6 +119,7 @@ struct mt_ctx {
int service_id_timeout;
bool check_children;
bool services_started;
+ struct netlink_ctx *nlctx;
};
static int start_service(struct mt_svc *mt_svc);
@@ -126,6 +127,7 @@ static int start_service(struct mt_svc *mt_svc);
static int monitor_service_init(struct sbus_connection *conn, void *data);
static int service_send_ping(struct mt_svc *svc);
+static int service_signal_reset_offline(struct mt_svc *svc);
static void ping_check(DBusPendingCall *pending, void *data);
static int service_check_alive(struct mt_svc *svc);
@@ -145,6 +147,23 @@ static int mark_service_as_started(struct mt_svc *svc);
static int monitor_cleanup(void);
+static void network_status_change_cb(enum network_change state,
+ void *cb_data)
+{
+ struct mt_svc *iter;
+ struct mt_ctx *ctx = (struct mt_ctx *) cb_data;
+
+ if (state != NL_ROUTE_UP) return;
+
+ DEBUG(9, ("A new route has appeared, signaling providers to reset offline status\n"));
+ for (iter = ctx->svc_list; iter; iter = iter->next) {
+ /* Don't signal services, only providers */
+ if (iter->provider) {
+ service_signal_reset_offline(iter);
+ }
+ }
+}
+
/* dbus_get_monitor_version
* Return the monitor version over D-BUS */
static int get_monitor_version(DBusMessage *message,
@@ -733,6 +752,10 @@ static int service_signal_offline(struct mt_svc *svc)
{
return service_signal(svc, MON_CLI_METHOD_OFFLINE);
}
+static int service_signal_reset_offline(struct mt_svc *svc)
+{
+ return service_signal(svc, MON_CLI_METHOD_RESET_OFFLINE);
+}
static int service_signal_rotate(struct mt_svc *svc)
{
return service_signal(svc, MON_CLI_METHOD_ROTATE);
@@ -1752,6 +1775,13 @@ int monitor_process_init(struct mt_ctx *ctx,
return ret;
}
+ ret = setup_netlink(ctx, ctx->ev, network_status_change_cb,
+ ctx, &ctx->nlctx);
+ if (ret != EOK) {
+ DEBUG(2, ("Cannot set up listening for network notifications\n"));
+ return ret;
+ }
+
/* start providers */
num_providers = 0;
for (dom = ctx->domains; dom; dom = dom->next) {