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).
|
||||
* All rights reserved.
|
||||
*
|
||||
@@ -71,9 +71,15 @@ RCSID("$Id$");
|
||||
static int help_flag;
|
||||
static int version_flag;
|
||||
static int c_flag;
|
||||
#ifdef KRB5
|
||||
static char *typename_arg;
|
||||
#endif
|
||||
|
||||
struct getargs getargs[] = {
|
||||
{ NULL, 'c', arg_flag, &c_flag },
|
||||
#ifdef KRB5
|
||||
{ "cache-type", 0, arg_string, &typename_arg },
|
||||
#endif
|
||||
{ "version", 0, arg_flag, &version_flag },
|
||||
{ "help", 'h', arg_flag, &help_flag },
|
||||
};
|
||||
@@ -94,96 +100,140 @@ usage(int ecode)
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int f;
|
||||
char tf[1024];
|
||||
char *p;
|
||||
int f;
|
||||
char tf[1024];
|
||||
char *p;
|
||||
|
||||
char *path;
|
||||
char **args;
|
||||
int i;
|
||||
int optind = 0;
|
||||
char *path;
|
||||
char **args;
|
||||
int i;
|
||||
int optind = 0;
|
||||
|
||||
setprogname(argv[0]);
|
||||
if(getarg(getargs, num_args, argc, argv, &optind))
|
||||
usage(1);
|
||||
if(help_flag)
|
||||
usage(0);
|
||||
if(version_flag) {
|
||||
print_version(NULL);
|
||||
exit(0);
|
||||
}
|
||||
setprogname(argv[0]);
|
||||
if(getarg(getargs, num_args, argc, argv, &optind))
|
||||
usage(1);
|
||||
if(help_flag)
|
||||
usage(0);
|
||||
if(version_flag) {
|
||||
print_version(NULL);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
#ifdef KRB5
|
||||
snprintf (tf, sizeof(tf), "%sXXXXXX", KRB5_DEFAULT_CCROOT);
|
||||
f = mkstemp (tf + 5);
|
||||
if (f < 0)
|
||||
err(1, "mkstemp failed");
|
||||
close (f);
|
||||
unlink (tf + 5);
|
||||
esetenv("KRB5CCNAME", tf, 1);
|
||||
{
|
||||
const krb5_cc_ops *type;
|
||||
krb5_error_code ret;
|
||||
krb5_context context;
|
||||
krb5_ccache id;
|
||||
const char *name;
|
||||
|
||||
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
|
||||
|
||||
snprintf (tf, sizeof(tf), "%s_XXXXXX", TKT_ROOT);
|
||||
f = mkstemp (tf);
|
||||
if (f < 0)
|
||||
err(1, "mkstemp failed");
|
||||
close (f);
|
||||
unlink (tf);
|
||||
esetenv("KRBTKFILE", tf, 1);
|
||||
snprintf (tf, sizeof(tf), "%s_XXXXXX", TKT_ROOT);
|
||||
f = mkstemp (tf);
|
||||
if (f < 0)
|
||||
err(1, "mkstemp failed");
|
||||
close (f);
|
||||
unlink (tf);
|
||||
esetenv("KRBTKFILE", tf, 1);
|
||||
|
||||
i = 0;
|
||||
i = 0;
|
||||
|
||||
args = (char **) malloc((argc + 10)*sizeof(char *));
|
||||
if (args == NULL)
|
||||
errx (1, "Out of memory allocating %lu bytes",
|
||||
(unsigned long)((argc + 10)*sizeof(char *)));
|
||||
args = (char **) malloc((argc + 10)*sizeof(char *));
|
||||
if (args == NULL)
|
||||
errx (1, "Out of memory allocating %lu bytes",
|
||||
(unsigned long)((argc + 10)*sizeof(char *)));
|
||||
|
||||
if(*argv == NULL) {
|
||||
path = getenv("SHELL");
|
||||
if(path == NULL){
|
||||
struct passwd *pw = k_getpwuid(geteuid());
|
||||
path = strdup(pw->pw_shell);
|
||||
if(*argv == NULL) {
|
||||
path = getenv("SHELL");
|
||||
if(path == NULL){
|
||||
struct passwd *pw = k_getpwuid(geteuid());
|
||||
path = strdup(pw->pw_shell);
|
||||
}
|
||||
} else {
|
||||
path = strdup(*argv++);
|
||||
}
|
||||
} else {
|
||||
path = strdup(*argv++);
|
||||
}
|
||||
if (path == NULL)
|
||||
errx (1, "Out of memory copying path");
|
||||
if (path == NULL)
|
||||
errx (1, "Out of memory copying path");
|
||||
|
||||
p=strrchr(path, '/');
|
||||
if(p)
|
||||
args[i] = strdup(p+1);
|
||||
else
|
||||
args[i] = strdup(path);
|
||||
p=strrchr(path, '/');
|
||||
if(p)
|
||||
args[i] = strdup(p+1);
|
||||
else
|
||||
args[i] = strdup(path);
|
||||
|
||||
if (args[i++] == NULL)
|
||||
errx (1, "Out of memory copying arguments");
|
||||
if (args[i++] == NULL)
|
||||
errx (1, "Out of memory copying arguments");
|
||||
|
||||
while(*argv)
|
||||
args[i++] = *argv++;
|
||||
while(*argv)
|
||||
args[i++] = *argv++;
|
||||
|
||||
args[i++] = NULL;
|
||||
args[i++] = NULL;
|
||||
|
||||
if(k_hasafs())
|
||||
k_setpag();
|
||||
if(k_hasafs())
|
||||
k_setpag();
|
||||
|
||||
unsetenv("PAGPID");
|
||||
execvp(path, args);
|
||||
if (errno == ENOENT || c_flag) {
|
||||
char **sh_args = malloc ((i + 2) * sizeof(char *));
|
||||
int j;
|
||||
unsetenv("PAGPID");
|
||||
execvp(path, args);
|
||||
if (errno == ENOENT || c_flag) {
|
||||
char **sh_args = malloc ((i + 2) * sizeof(char *));
|
||||
int j;
|
||||
|
||||
if (sh_args == NULL)
|
||||
errx (1, "Out of memory copying sh arguments");
|
||||
for (j = 1; j < i; ++j)
|
||||
sh_args[j + 2] = args[j];
|
||||
sh_args[0] = "sh";
|
||||
sh_args[1] = "-c";
|
||||
sh_args[2] = path;
|
||||
execv ("/bin/sh", sh_args);
|
||||
}
|
||||
err (1, "execvp");
|
||||
if (sh_args == NULL)
|
||||
errx (1, "Out of memory copying sh arguments");
|
||||
for (j = 1; j < i; ++j)
|
||||
sh_args[j + 2] = args[j];
|
||||
sh_args[0] = "sh";
|
||||
sh_args[1] = "-c";
|
||||
sh_args[2] = path;
|
||||
execv ("/bin/sh", sh_args);
|
||||
}
|
||||
err (1, "execvp");
|
||||
}
|
||||
|
Reference in New Issue
Block a user