diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2009-11-19 18:47:56 -0500 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2009-11-25 11:03:12 -0500 |
commit | f5aa0c046e75f2ecc2b96424847765c8ccb3a302 (patch) | |
tree | dc757760d4579e55172d90a5dae57084c8dccfac /server/providers/ldap/ldap_init.c | |
parent | b67dbadc979cbe86545e2275223483d429b74747 (diff) | |
download | sssd-f5aa0c046e75f2ecc2b96424847765c8ccb3a302.tar.gz sssd-f5aa0c046e75f2ecc2b96424847765c8ccb3a302.tar.xz sssd-f5aa0c046e75f2ecc2b96424847765c8ccb3a302.zip |
Get TGT in a child process.
To avoid blocking in a synchronous call, the TGT is saved in a separate
process
Fixes: #277
Diffstat (limited to 'server/providers/ldap/ldap_init.c')
-rw-r--r-- | server/providers/ldap/ldap_init.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/server/providers/ldap/ldap_init.c b/server/providers/ldap/ldap_init.c index 5a64585d8..c6241bf5d 100644 --- a/server/providers/ldap/ldap_init.c +++ b/server/providers/ldap/ldap_init.c @@ -22,7 +22,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <fcntl.h> + +#include "providers/child_common.h" #include "providers/ldap/ldap_common.h" +#include "providers/ldap/sdap_async_private.h" static void sdap_shutdown(struct be_req *req); @@ -44,6 +48,49 @@ struct bet_ops sdap_chpass_ops = { .finalize = sdap_shutdown }; +static int setup_child(struct sdap_id_ctx *ctx) +{ + int ret; + const char *mech; + struct tevent_signal *sige; + unsigned v; + FILE *debug_filep; + + mech = dp_opt_get_string(ctx->opts->basic, + SDAP_SASL_MECH); + if (!mech) { + return EOK; + } + + sige = tevent_add_signal(ctx->be->ev, ctx, SIGCHLD, SA_SIGINFO, + child_sig_handler, NULL); + if (sige == NULL) { + DEBUG(1, ("tevent_add_signal failed.\n")); + return ENOMEM; + } + + if (debug_to_file != 0 && ldap_child_debug_fd == -1) { + ret = open_debug_file_ex("ldap_child", &debug_filep); + if (ret != EOK) { + DEBUG(0, ("Error setting up logging (%d) [%s]\n", + ret, strerror(ret))); + return ret; + } + + ldap_child_debug_fd = fileno(debug_filep); + if (ldap_child_debug_fd == -1) { + DEBUG(0, ("fileno failed [%d][%s]\n", errno, strerror(errno))); + ret = errno; + return ret; + } + + v = fcntl(ldap_child_debug_fd, F_GETFD, 0); + fcntl(ldap_child_debug_fd, F_SETFD, v & ~FD_CLOEXEC); + } + + return EOK; +} + int sssm_ldap_init(struct be_ctx *bectx, struct bet_ops **ops, void **pvt_data) @@ -88,6 +135,13 @@ int sssm_ldap_init(struct be_ctx *bectx, goto done; } + ret = setup_child(ctx); + if (ret != EOK) { + DEBUG(1, ("setup_child failed [%d][%s].\n", + ret, strerror(ret))); + goto done; + } + *ops = &sdap_id_ops; *pvt_data = ctx; ret = EOK; |