summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Židek <mzidek@redhat.com>2015-06-17 18:54:14 +0200
committerJakub Hrozek <jhrozek@redhat.com>2015-07-02 13:42:55 +0200
commit66615eee77792c1437e309d53b19cfb642eca502 (patch)
tree9cd1baa554811ad27947b58b95339663ddda272b
parent9ac2a33f4cdc4941fa63118dcffe8058854f33c4 (diff)
downloadsssd-66615eee77792c1437e309d53b19cfb642eca502.tar.gz
sssd-66615eee77792c1437e309d53b19cfb642eca502.tar.xz
sssd-66615eee77792c1437e309d53b19cfb642eca502.zip
MONITOR: Poll for resolv.conf if not available during boot
If resolv.conf is not available when SSSD is starting, check for its existence later. Ticket: https://fedorahosted.org/sssd/ticket/2590 Reviewed-by: Pavel Reichl <preichl@redhat.com>
-rw-r--r--src/monitor/monitor.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 01c882aac..1804ad16e 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -2259,11 +2259,39 @@ static errno_t monitor_config_file_fallback(TALLOC_CTX *mem_ctx,
return EOK;
}
+#define MISSING_RESOLV_CONF_POLL_TIME 10
+
+static void missing_resolv_conf(struct tevent_context *ev,
+ struct tevent_timer *te,
+ struct timeval tv, void *data)
+{
+ int ret;
+ struct mt_ctx *ctx = talloc_get_type(data, struct mt_ctx);
+
+ ret = monitor_config_file(ctx, ctx, RESOLV_CONF_PATH,
+ monitor_update_resolv, false);
+ if (ret == EOK) {
+ signal_res_init(ctx);
+ } else if (ret == ENOENT) {
+ tv = tevent_timeval_current_ofs(MISSING_RESOLV_CONF_POLL_TIME, 0);
+ te = tevent_add_timer(ctx->ev, ctx, tv, missing_resolv_conf, ctx);
+ if (te == NULL) {
+ DEBUG(SSSDBG_FATAL_FAILURE,
+ "tevent_add_timer failed. resolv.conf will be ignored.\n");
+ }
+ } else {
+ DEBUG(SSSDBG_FATAL_FAILURE,
+ "Monitor_config_file failed. resolv.conf will be ignored.\n");
+ }
+}
+
static int monitor_process_init(struct mt_ctx *ctx,
const char *config_file)
{
TALLOC_CTX *tmp_ctx;
struct tevent_signal *tes;
+ struct timeval tv;
+ struct tevent_timer *te;
struct sss_domain_info *dom;
char *rcachedir;
int num_providers;
@@ -2351,8 +2379,14 @@ static int monitor_process_init(struct mt_ctx *ctx,
#endif
/* Watch for changes to the DNS resolv.conf */
ret = monitor_config_file(ctx, ctx, RESOLV_CONF_PATH,
- monitor_update_resolv,true);
- if (ret != EOK) {
+ monitor_update_resolv, false);
+ if (ret == ENOENT) {
+ tv = tevent_timeval_current_ofs(MISSING_RESOLV_CONF_POLL_TIME, 0);
+ te = tevent_add_timer(ctx->ev, ctx, tv, missing_resolv_conf, ctx);
+ if (te == NULL) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "resolv.conf will be ignored\n");
+ }
+ } else if (ret != EOK) {
return ret;
}