From cdbb3465fa7c51edbb367a475906b59f137b7e6e Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
Date: Wed, 27 Jun 2012 14:07:05 -0400
Subject: [PATCH 4/9] KRB5: Create a common init routine for krb5_child
 options

This will reduce code duplication between the krb5, ipa and ad
providers
---
 Makefile.am                           |    4 +-
 src/providers/ipa/ipa_init.c          |   51 +++---------------
 src/providers/krb5/krb5_init.c        |   59 +++------------------
 src/providers/krb5/krb5_init_shared.c |   94 +++++++++++++++++++++++++++++++++
 src/providers/krb5/krb5_init_shared.h |   29 ++++++++++
 5 files changed, 138 insertions(+), 99 deletions(-)
 create mode 100644 src/providers/krb5/krb5_init_shared.c
 create mode 100644 src/providers/krb5/krb5_init_shared.h

diff --git a/Makefile.am b/Makefile.am
index 1848d73e95a9a09d057dffef3e82cf83a6e54b91..99565ee1b596ad8d7a69ca9fe52dbf8c7b8ae23c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -394,6 +394,7 @@ dist_noinst_HEADERS = \
     src/providers/krb5/krb5_auth.h \
     src/providers/krb5/krb5_common.h \
     src/providers/krb5/krb5_utils.h \
+    src/providers/krb5/krb5_init_shared.h \
     src/providers/krb5/krb5_opts.h \
     src/providers/ldap/ldap_common.h \
     src/providers/ldap/sdap.h \
@@ -1207,7 +1208,8 @@ libsss_krb5_common_la_SOURCES = \
     src/providers/krb5/krb5_common.c \
     src/providers/krb5/krb5_auth.c \
     src/providers/krb5/krb5_access.c \
-    src/providers/krb5/krb5_child_handler.c
+    src/providers/krb5/krb5_child_handler.c \
+    src/providers/krb5/krb5_init_shared.c
 
 libsss_ldap_la_SOURCES = \
     src/util/find_uid.c \
diff --git a/src/providers/ipa/ipa_init.c b/src/providers/ipa/ipa_init.c
index 0524ddfa6271c7baf3a42d2eb7ac0fccbca7c1de..4fb662c26b90fd5526d1ef5344acc8bf912cda95 100644
--- a/src/providers/ipa/ipa_init.c
+++ b/src/providers/ipa/ipa_init.c
@@ -30,6 +30,7 @@
 #include "util/child_common.h"
 #include "providers/ipa/ipa_common.h"
 #include "providers/krb5/krb5_auth.h"
+#include "providers/krb5/krb5_init_shared.h"
 #include "providers/ipa/ipa_id.h"
 #include "providers/ipa/ipa_auth.h"
 #include "providers/ipa/ipa_access.h"
@@ -231,8 +232,6 @@ int sssm_ipa_auth_init(struct be_ctx *bectx,
     struct krb5_ctx *krb5_auth_ctx;
     struct sdap_auth_ctx *sdap_auth_ctx;
     struct bet_ops *id_ops;
-    FILE *debug_filep;
-    unsigned v;
     int ret;
 
     if (!ipa_options) {
@@ -305,53 +304,15 @@ int sssm_ipa_auth_init(struct be_ctx *bectx,
         goto done;
     }
 
-    if (dp_opt_get_bool(krb5_auth_ctx->opts, KRB5_STORE_PASSWORD_IF_OFFLINE)) {
-        ret = init_delayed_online_authentication(krb5_auth_ctx, bectx,
-                                                 bectx->ev);
-        if (ret != EOK) {
-            DEBUG(1, ("init_delayed_online_authentication failed.\n"));
-            goto done;
-        }
-    }
-
-    ret = check_and_export_options(krb5_auth_ctx->opts, bectx->domain,
-                                   krb5_auth_ctx);
+    /* Initialize features needed by the krb5_child */
+    ret = krb5_child_init(krb5_auth_ctx, bectx);
     if (ret != EOK) {
-        DEBUG(1, ("check_and_export_opts failed.\n"));
+        DEBUG(SSSDBG_FATAL_FAILURE,
+              ("Could not initialize krb5_child settings: [%s]\n",
+               strerror(ret)));
         goto done;
     }
 
-    ret = krb5_install_offline_callback(bectx, krb5_auth_ctx);
-    if (ret != EOK) {
-        DEBUG(1, ("krb5_install_offline_callback failed.\n"));
-        goto done;
-    }
-
-    ret = krb5_install_sigterm_handler(bectx->ev, krb5_auth_ctx);
-    if (ret != EOK) {
-        DEBUG(1, ("krb5_install_sigterm_handler failed.\n"));
-        goto done;
-    }
-
-    if (debug_to_file != 0) {
-        ret = open_debug_file_ex("krb5_child", &debug_filep);
-        if (ret != EOK) {
-            DEBUG(0, ("Error setting up logging (%d) [%s]\n",
-                    ret, strerror(ret)));
-            goto done;
-        }
-
-        krb5_auth_ctx->child_debug_fd = fileno(debug_filep);
-        if (krb5_auth_ctx->child_debug_fd == -1) {
-            DEBUG(0, ("fileno failed [%d][%s]\n", errno, strerror(errno)));
-            ret = errno;
-            goto done;
-        }
-
-        v = fcntl(krb5_auth_ctx->child_debug_fd, F_GETFD, 0);
-        fcntl(krb5_auth_ctx->child_debug_fd, F_SETFD, v & ~FD_CLOEXEC);
-    }
-
     *ops = &ipa_auth_ops;
     *pvt_data = ipa_auth_ctx;
     ret = EOK;
diff --git a/src/providers/krb5/krb5_init.c b/src/providers/krb5/krb5_init.c
index fbea87db41e05a0e79eb69daf872428a6b0e3b4b..39635e4e132979f35ad762e6316c687da8314d9d 100644
--- a/src/providers/krb5/krb5_init.c
+++ b/src/providers/krb5/krb5_init.c
@@ -29,6 +29,7 @@
 #include "util/child_common.h"
 #include "providers/krb5/krb5_auth.h"
 #include "providers/krb5/krb5_common.h"
+#include "providers/krb5/krb5_init_shared.h"
 
 struct krb5_options {
     struct dp_option *opts;
@@ -59,15 +60,12 @@ int sssm_krb5_auth_init(struct be_ctx *bectx,
 {
     struct krb5_ctx *ctx = NULL;
     int ret;
-    unsigned v;
-    FILE *debug_filep;
     const char *krb5_servers;
     const char *krb5_kpasswd_servers;
     const char *krb5_realm;
     const char *errstr;
     int errval;
     int errpos;
-    time_t renew_intv;
 
     if (krb5_options == NULL) {
         krb5_options = talloc_zero(bectx, struct krb5_options);
@@ -132,60 +130,15 @@ int sssm_krb5_auth_init(struct be_ctx *bectx,
         }
     }
 
-    if (dp_opt_get_bool(ctx->opts, KRB5_STORE_PASSWORD_IF_OFFLINE)) {
-        ret = init_delayed_online_authentication(ctx, bectx, bectx->ev);
-        if (ret != EOK) {
-            DEBUG(1, ("init_delayed_online_authentication failed.\n"));
-            goto fail;
-        }
-    }
-
-    renew_intv = dp_opt_get_int(ctx->opts, KRB5_RENEW_INTERVAL);
-    if (renew_intv > 0) {
-        ret = init_renew_tgt(ctx, bectx, bectx->ev, renew_intv);
-        if (ret != EOK) {
-            DEBUG(1, ("init_renew_tgt failed.\n"));
-            goto fail;
-        }
-    }
-
-    ret = check_and_export_options(ctx->opts, bectx->domain, ctx);
+    /* Initialize features needed by the krb5_child */
+    ret = krb5_child_init(ctx, bectx);
     if (ret != EOK) {
-        DEBUG(1, ("check_and_export_options failed.\n"));
+        DEBUG(SSSDBG_FATAL_FAILURE,
+              ("Could not initialize krb5_child settings: [%s]\n",
+               strerror(ret)));
         goto fail;
     }
 
-    ret = krb5_install_sigterm_handler(bectx->ev, ctx);
-    if (ret != EOK) {
-        DEBUG(1, ("krb5_install_sigterm_handler failed.\n"));
-        goto fail;
-    }
-
-    ret = krb5_install_offline_callback(bectx, ctx);
-    if (ret != EOK) {
-        DEBUG(1, ("krb5_install_offline_callback failed.\n"));
-        goto fail;
-    }
-
-    if (debug_to_file != 0) {
-        ret = open_debug_file_ex("krb5_child", &debug_filep);
-        if (ret != EOK) {
-            DEBUG(0, ("Error setting up logging (%d) [%s]\n",
-                    ret, strerror(ret)));
-            goto fail;
-        }
-
-        ctx->child_debug_fd = fileno(debug_filep);
-        if (ctx->child_debug_fd == -1) {
-            DEBUG(0, ("fileno failed [%d][%s]\n", errno, strerror(errno)));
-            ret = errno;
-            goto fail;
-        }
-
-        v = fcntl(ctx->child_debug_fd, F_GETFD, 0);
-        fcntl(ctx->child_debug_fd, F_SETFD, v & ~FD_CLOEXEC);
-    }
-
     ctx->illegal_path_re = pcre_compile2(ILLEGAL_PATH_PATTERN, 0,
                                          &errval, &errstr, &errpos, NULL);
     if (ctx->illegal_path_re == NULL) {
diff --git a/src/providers/krb5/krb5_init_shared.c b/src/providers/krb5/krb5_init_shared.c
new file mode 100644
index 0000000000000000000000000000000000000000..7a014918462f7f25e1dc2644d3d9d24e208b7c37
--- /dev/null
+++ b/src/providers/krb5/krb5_init_shared.c
@@ -0,0 +1,94 @@
+/*
+    SSSD
+
+    Authors:
+        Stephen Gallagher <sgallagh@redhat.com>
+
+    Copyright (C) 2012 Red Hat
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <fcntl.h>
+
+#include "providers/krb5/krb5_common.h"
+#include "providers/krb5/krb5_auth.h"
+
+errno_t krb5_child_init(struct krb5_ctx *krb5_auth_ctx,
+                        struct be_ctx *bectx)
+{
+    errno_t ret;
+    FILE *debug_filep;
+    unsigned v;
+    time_t renew_intv;
+
+    if (dp_opt_get_bool(krb5_auth_ctx->opts, KRB5_STORE_PASSWORD_IF_OFFLINE)) {
+        ret = init_delayed_online_authentication(krb5_auth_ctx, bectx,
+                                                 bectx->ev);
+        if (ret != EOK) {
+            DEBUG(1, ("init_delayed_online_authentication failed.\n"));
+            goto done;
+        }
+    }
+
+    renew_intv = dp_opt_get_int(krb5_auth_ctx->opts, KRB5_RENEW_INTERVAL);
+    if (renew_intv > 0) {
+        ret = init_renew_tgt(krb5_auth_ctx, bectx, bectx->ev, renew_intv);
+        if (ret != EOK) {
+            DEBUG(1, ("init_renew_tgt failed.\n"));
+            goto done;
+        }
+    }
+
+    ret = check_and_export_options(krb5_auth_ctx->opts, bectx->domain,
+                                   krb5_auth_ctx);
+    if (ret != EOK) {
+        DEBUG(1, ("check_and_export_opts failed.\n"));
+        goto done;
+    }
+
+    ret = krb5_install_offline_callback(bectx, krb5_auth_ctx);
+    if (ret != EOK) {
+        DEBUG(1, ("krb5_install_offline_callback failed.\n"));
+        goto done;
+    }
+
+    ret = krb5_install_sigterm_handler(bectx->ev, krb5_auth_ctx);
+    if (ret != EOK) {
+        DEBUG(1, ("krb5_install_sigterm_handler failed.\n"));
+        goto done;
+    }
+
+    if (debug_to_file != 0) {
+        ret = open_debug_file_ex("krb5_child", &debug_filep);
+        if (ret != EOK) {
+            DEBUG(0, ("Error setting up logging (%d) [%s]\n",
+                    ret, strerror(ret)));
+            goto done;
+        }
+
+        krb5_auth_ctx->child_debug_fd = fileno(debug_filep);
+        if (krb5_auth_ctx->child_debug_fd == -1) {
+            DEBUG(0, ("fileno failed [%d][%s]\n", errno, strerror(errno)));
+            ret = errno;
+            goto done;
+        }
+
+        v = fcntl(krb5_auth_ctx->child_debug_fd, F_GETFD, 0);
+        fcntl(krb5_auth_ctx->child_debug_fd, F_SETFD, v & ~FD_CLOEXEC);
+    }
+
+done:
+    return ret;
+}
diff --git a/src/providers/krb5/krb5_init_shared.h b/src/providers/krb5/krb5_init_shared.h
new file mode 100644
index 0000000000000000000000000000000000000000..883b84ff3a297c9b1fba61ec8f24f0f9e36cb4e9
--- /dev/null
+++ b/src/providers/krb5/krb5_init_shared.h
@@ -0,0 +1,29 @@
+/*
+    SSSD
+
+    Authors:
+        Stephen Gallagher <sgallagh@redhat.com>
+
+    Copyright (C) 2012 Red Hat
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef KRB5_INIT_SHARED_H_
+#define KRB5_INIT_SHARED_H_
+
+errno_t krb5_child_init(struct krb5_ctx *krb5_auth_ctx,
+                        struct be_ctx *bectx);
+
+#endif /* KRB5_INIT_SHARED_H_ */
-- 
1.7.10.2

