>From b6b92883b333107e743cb6665716a17e6cdee964 Mon Sep 17 00:00:00 2001 From: Sumit Bose Date: Mon, 12 Oct 2009 15:38:29 +0200 Subject: [PATCH] enable debugging of krb5_child --- server/Makefile.am | 2 + server/providers/krb5/krb5_auth.c | 56 ++++++++++++++++++++++++++++++++++- server/providers/krb5/krb5_child.c | 41 +++++++++++++++++++++++++- 3 files changed, 95 insertions(+), 4 deletions(-) diff --git a/server/Makefile.am b/server/Makefile.am index a65c9fa..99c6867 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -458,9 +458,11 @@ krb5_child_SOURCES = \ providers/krb5/krb5_child.c krb5_child_CFLAGS = \ $(AM_CFLAGS) \ + $(POPT_CFLAGS) \ $(KRB5_CFLAGS) krb5_child_LDADD = \ $(TALLOC_LIBS) \ + $(POPT_LIBS) \ $(KRB5_LIBS) memberof_la_SOURCES = \ diff --git a/server/providers/krb5/krb5_auth.c b/server/providers/krb5/krb5_auth.c index 582d013..61c529f 100644 --- a/server/providers/krb5/krb5_auth.c +++ b/server/providers/krb5/krb5_auth.c @@ -325,6 +325,51 @@ static void wait_for_child_handler(struct tevent_context *ev, return; } +static errno_t prepare_child_argv(TALLOC_CTX *mem_ctx, char ***_argv) +{ + uint_t argc = 2; /* program name and NULL */ + char ** argv; + + if (debug_level != 0) argc ++; + if (debug_to_file != 0) argc++; + if (debug_timestamps != 0) argc++; + + argv = talloc_array(mem_ctx, char *, argc); + if (argv == NULL) { + DEBUG(1, ("talloc_array failed.\n")); + return ENOMEM; + } + + if (argc < 2) goto fail; + argv[--argc] = NULL; + + if (debug_level != 0) { + if (argc < 2) goto fail; + argv[--argc] = talloc_asprintf(argv, "--debug-level=%d", debug_level); + } + + if (debug_to_file != 0) { + if (argc < 2) goto fail; + argv[--argc] = talloc_strdup(argv, "--debug-to-files"); + } + + if (debug_timestamps != 0) { + if (argc < 2) goto fail; + argv[--argc] = talloc_strdup(argv, "--debug-timestamps"); + } + + if (argc != 1) goto fail; + argv[0] = talloc_strdup(argv, KRB5_CHILD); + + *_argv = argv; + + return EOK; + +fail: + talloc_free(*argv); + return EINVAL; +} + static errno_t fork_child(struct krb5child_req *kr) { int pipefd_to_child[2]; @@ -332,6 +377,7 @@ static errno_t fork_child(struct krb5child_req *kr) pid_t pid; int ret; errno_t err; + char **argv; ret = pipe(pipefd_from_child); if (ret == -1) { @@ -381,10 +427,16 @@ static errno_t fork_child(struct krb5child_req *kr) return err; } - ret = execl(KRB5_CHILD, KRB5_CHILD, NULL); + ret = prepare_child_argv(kr, &argv); + if (ret != EOK) { + DEBUG(1, ("prepare_child_argv.\n")); + return ret; + } + + ret = execv(KRB5_CHILD, argv); if (ret == -1) { err = errno; - DEBUG(1, ("execl failed [%d][%s].\n", errno, strerror(errno))); + DEBUG(1, ("execv failed [%d][%s].\n", errno, strerror(errno))); return err; } } else if (pid > 0) { /* parent */ diff --git a/server/providers/krb5/krb5_child.c b/server/providers/krb5/krb5_child.c index 9b1be9c..70fd6b7 100644 --- a/server/providers/krb5/krb5_child.c +++ b/server/providers/krb5/krb5_child.c @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -641,7 +642,7 @@ failed: return kerr; } -int main(int argc, char *argv[]) +int main(int argc, const char *argv[]) { uint8_t *buf = NULL; int ret; @@ -649,10 +650,46 @@ int main(int argc, char *argv[]) struct pam_data *pd = NULL; struct krb5_req *kr = NULL; char *ccname; + int opt; + poptContext pc; - debug_prg_name = argv[0]; + struct poptOption long_options[] = { + POPT_AUTOHELP + SSSD_DEBUG_OPTS + POPT_TABLEEND + }; + + + pc = poptGetContext(argv[0], argc, argv, long_options, 0); + while((opt = poptGetNextOpt(pc)) != -1) { + switch(opt) { + default: + fprintf(stderr, "\nInvalid option %s: %s\n\n", + poptBadOption(pc, 0), poptStrerror(opt)); + poptPrintUsage(pc, stderr, 0); + _exit(-1); + } + } + + poptFreeContext(pc); pd = talloc(NULL, struct pam_data); + if (pd == NULL) { + DEBUG(1, ("malloc failed.\n")); + _exit(-1); + } + + debug_log_file = "krb5_child"; + debug_prg_name = talloc_asprintf(pd, "[sssd[krb5_child[%d]]]", getpid()); + + if (debug_to_file) { + ret = open_debug_file(); + if (ret != EOK) { + DEBUG(0, ("Error setting up logging (%d) [%s]\n", + ret, strerror(ret))); + } + } + buf = talloc_size(pd, sizeof(uint8_t)*IN_BUF_SIZE); if (buf == NULL) { -- 1.6.2.5