diff options
Diffstat (limited to 'src/monitor/monitor.c')
-rw-r--r-- | src/monitor/monitor.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c index 47832c95..caf40561 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) { |