add --cache-type that allows the user to control the resulting
credential cache type, inherit the type from the invoking process git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@14574 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1995 - 2003 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1995 - 2005 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -71,9 +71,15 @@ RCSID("$Id$");
|
|||||||
static int help_flag;
|
static int help_flag;
|
||||||
static int version_flag;
|
static int version_flag;
|
||||||
static int c_flag;
|
static int c_flag;
|
||||||
|
#ifdef KRB5
|
||||||
|
static char *typename_arg;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct getargs getargs[] = {
|
struct getargs getargs[] = {
|
||||||
{ NULL, 'c', arg_flag, &c_flag },
|
{ NULL, 'c', arg_flag, &c_flag },
|
||||||
|
#ifdef KRB5
|
||||||
|
{ "cache-type", 0, arg_string, &typename_arg },
|
||||||
|
#endif
|
||||||
{ "version", 0, arg_flag, &version_flag },
|
{ "version", 0, arg_flag, &version_flag },
|
||||||
{ "help", 'h', arg_flag, &help_flag },
|
{ "help", 'h', arg_flag, &help_flag },
|
||||||
};
|
};
|
||||||
@@ -94,96 +100,140 @@ usage(int ecode)
|
|||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int f;
|
int f;
|
||||||
char tf[1024];
|
char tf[1024];
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
char *path;
|
char *path;
|
||||||
char **args;
|
char **args;
|
||||||
int i;
|
int i;
|
||||||
int optind = 0;
|
int optind = 0;
|
||||||
|
|
||||||
setprogname(argv[0]);
|
setprogname(argv[0]);
|
||||||
if(getarg(getargs, num_args, argc, argv, &optind))
|
if(getarg(getargs, num_args, argc, argv, &optind))
|
||||||
usage(1);
|
usage(1);
|
||||||
if(help_flag)
|
if(help_flag)
|
||||||
usage(0);
|
usage(0);
|
||||||
if(version_flag) {
|
if(version_flag) {
|
||||||
print_version(NULL);
|
print_version(NULL);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
|
|
||||||
#ifdef KRB5
|
#ifdef KRB5
|
||||||
snprintf (tf, sizeof(tf), "%sXXXXXX", KRB5_DEFAULT_CCROOT);
|
{
|
||||||
f = mkstemp (tf + 5);
|
const krb5_cc_ops *type;
|
||||||
if (f < 0)
|
krb5_error_code ret;
|
||||||
err(1, "mkstemp failed");
|
krb5_context context;
|
||||||
close (f);
|
krb5_ccache id;
|
||||||
unlink (tf + 5);
|
const char *name;
|
||||||
esetenv("KRB5CCNAME", tf, 1);
|
|
||||||
|
ret = krb5_init_context(&context);
|
||||||
|
if (ret) /* XXX should this really call exit ? */
|
||||||
|
errx(1, "no kerberos 5 support");
|
||||||
|
|
||||||
|
if (typename_arg == NULL) {
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
name = krb5_cc_default_name(context);
|
||||||
|
if (name == NULL)
|
||||||
|
krb5_errx(context, 1, "Failed getting default "
|
||||||
|
"credential cache type");
|
||||||
|
|
||||||
|
typename_arg = strdup(name);
|
||||||
|
if (typename_arg == NULL)
|
||||||
|
errx(1, "strdup");
|
||||||
|
|
||||||
|
s = strchr(typename_arg, ':');
|
||||||
|
if (s)
|
||||||
|
*s = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
type = krb5_cc_get_prefix_ops(context, typename_arg);
|
||||||
|
if (type == NULL)
|
||||||
|
krb5_err(context, 1, ret, "Failed getting ops for %s "
|
||||||
|
"credential cache", typename_arg);
|
||||||
|
|
||||||
|
ret = krb5_cc_gen_new(context, type, &id);
|
||||||
|
if (ret)
|
||||||
|
krb5_err(context, 1, ret, "Failed generating credential cache");
|
||||||
|
|
||||||
|
name = krb5_cc_get_name(context, id);
|
||||||
|
if (name == NULL)
|
||||||
|
krb5_errx(context, 1, "Generated credential cache have no name");
|
||||||
|
|
||||||
|
snprintf(tf, sizeof(tf), "%s:%s", typename_arg, name);
|
||||||
|
|
||||||
|
ret = krb5_cc_close(context, id);
|
||||||
|
if (ret)
|
||||||
|
krb5_err(context, 1, ret, "Failed closing credential cache");
|
||||||
|
|
||||||
|
krb5_free_context(context);
|
||||||
|
|
||||||
|
esetenv("KRB5CCNAME", tf, 1);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
snprintf (tf, sizeof(tf), "%s_XXXXXX", TKT_ROOT);
|
snprintf (tf, sizeof(tf), "%s_XXXXXX", TKT_ROOT);
|
||||||
f = mkstemp (tf);
|
f = mkstemp (tf);
|
||||||
if (f < 0)
|
if (f < 0)
|
||||||
err(1, "mkstemp failed");
|
err(1, "mkstemp failed");
|
||||||
close (f);
|
close (f);
|
||||||
unlink (tf);
|
unlink (tf);
|
||||||
esetenv("KRBTKFILE", tf, 1);
|
esetenv("KRBTKFILE", tf, 1);
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
args = (char **) malloc((argc + 10)*sizeof(char *));
|
args = (char **) malloc((argc + 10)*sizeof(char *));
|
||||||
if (args == NULL)
|
if (args == NULL)
|
||||||
errx (1, "Out of memory allocating %lu bytes",
|
errx (1, "Out of memory allocating %lu bytes",
|
||||||
(unsigned long)((argc + 10)*sizeof(char *)));
|
(unsigned long)((argc + 10)*sizeof(char *)));
|
||||||
|
|
||||||
if(*argv == NULL) {
|
if(*argv == NULL) {
|
||||||
path = getenv("SHELL");
|
path = getenv("SHELL");
|
||||||
if(path == NULL){
|
if(path == NULL){
|
||||||
struct passwd *pw = k_getpwuid(geteuid());
|
struct passwd *pw = k_getpwuid(geteuid());
|
||||||
path = strdup(pw->pw_shell);
|
path = strdup(pw->pw_shell);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
path = strdup(*argv++);
|
||||||
}
|
}
|
||||||
} else {
|
if (path == NULL)
|
||||||
path = strdup(*argv++);
|
errx (1, "Out of memory copying path");
|
||||||
}
|
|
||||||
if (path == NULL)
|
|
||||||
errx (1, "Out of memory copying path");
|
|
||||||
|
|
||||||
p=strrchr(path, '/');
|
p=strrchr(path, '/');
|
||||||
if(p)
|
if(p)
|
||||||
args[i] = strdup(p+1);
|
args[i] = strdup(p+1);
|
||||||
else
|
else
|
||||||
args[i] = strdup(path);
|
args[i] = strdup(path);
|
||||||
|
|
||||||
if (args[i++] == NULL)
|
if (args[i++] == NULL)
|
||||||
errx (1, "Out of memory copying arguments");
|
errx (1, "Out of memory copying arguments");
|
||||||
|
|
||||||
while(*argv)
|
while(*argv)
|
||||||
args[i++] = *argv++;
|
args[i++] = *argv++;
|
||||||
|
|
||||||
args[i++] = NULL;
|
args[i++] = NULL;
|
||||||
|
|
||||||
if(k_hasafs())
|
if(k_hasafs())
|
||||||
k_setpag();
|
k_setpag();
|
||||||
|
|
||||||
unsetenv("PAGPID");
|
unsetenv("PAGPID");
|
||||||
execvp(path, args);
|
execvp(path, args);
|
||||||
if (errno == ENOENT || c_flag) {
|
if (errno == ENOENT || c_flag) {
|
||||||
char **sh_args = malloc ((i + 2) * sizeof(char *));
|
char **sh_args = malloc ((i + 2) * sizeof(char *));
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
if (sh_args == NULL)
|
if (sh_args == NULL)
|
||||||
errx (1, "Out of memory copying sh arguments");
|
errx (1, "Out of memory copying sh arguments");
|
||||||
for (j = 1; j < i; ++j)
|
for (j = 1; j < i; ++j)
|
||||||
sh_args[j + 2] = args[j];
|
sh_args[j + 2] = args[j];
|
||||||
sh_args[0] = "sh";
|
sh_args[0] = "sh";
|
||||||
sh_args[1] = "-c";
|
sh_args[1] = "-c";
|
||||||
sh_args[2] = path;
|
sh_args[2] = path;
|
||||||
execv ("/bin/sh", sh_args);
|
execv ("/bin/sh", sh_args);
|
||||||
}
|
}
|
||||||
err (1, "execvp");
|
err (1, "execvp");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user