Introduced option `-l user' to be able to login as some other user.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@972 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1996-11-16 14:39:01 +00:00
parent f7ac30054b
commit b96a2bef6b

View File

@@ -99,8 +99,8 @@ usr2handler (int sig)
*/ */
static int static int
connect_host (char *host, des_cblock *key, des_key_schedule schedule, connect_host (char *host, char *user, des_cblock *key,
int passivep) des_key_schedule schedule, int passivep)
{ {
CREDENTIALS cred; CREDENTIALS cred;
KTEXT_ST text; KTEXT_ST text;
@@ -112,10 +112,13 @@ connect_host (char *host, des_cblock *key, des_key_schedule schedule,
int s; int s;
u_char b; u_char b;
char **p; char **p;
char name[ANAME_SZ+1];
hostent = gethostbyname (host); hostent = gethostbyname (host);
if (hostent == NULL) { if (hostent == NULL) {
fprintf (stderr, "%s: gethostbyname '%s' failed: ", prog, host); fprintf (stderr,
"%s: gethostbyname '%s' failed: %s", prog, host,
hstrerror(h_errno));
return -1; return -1;
} }
@@ -167,6 +170,12 @@ connect_host (char *host, des_cblock *key, des_key_schedule schedule,
krb_get_err_text(status)); krb_get_err_text(status));
return -1; return -1;
} }
strncpy (name, user, sizeof(name));
name[sizeof(name) - 1] = '\0';
if (krb_net_write (s, name, sizeof(name)) != sizeof(name)) {
fprintf (stderr, "%s: write: %s\n", prog, strerror(errno));
return -1;
}
if (krb_net_read (s, &b, sizeof(b)) != sizeof(b)) { if (krb_net_read (s, &b, sizeof(b)) != sizeof(b)) {
fprintf (stderr, "%s: read: %s\n", prog, fprintf (stderr, "%s: read: %s\n", prog,
strerror(errno)); strerror(errno));
@@ -203,12 +212,13 @@ connect_host (char *host, des_cblock *key, des_key_schedule schedule,
} }
static int static int
active (int fd, char *host, des_cblock *iv, des_key_schedule schedule) active (int fd, char *host, char *user,
des_cblock *iv, des_key_schedule schedule)
{ {
int kxd; int kxd;
u_char zero = 0; u_char zero = 0;
kxd = connect_host (host, iv, schedule, 0); /* XXX */ kxd = connect_host (host, user, iv, schedule, 0); /* XXX */
if (kxd < 0) if (kxd < 0)
return 1; return 1;
if (krb_net_write (kxd, &zero, sizeof(zero)) != sizeof(zero)) { if (krb_net_write (kxd, &zero, sizeof(zero)) != sizeof(zero)) {
@@ -298,7 +308,8 @@ start_session(int xserver, int fd, des_cblock *iv,
} }
static int static int
passive (int fd, char *host, des_cblock *iv, des_key_schedule schedule) passive (int fd, char *host, char *user, des_cblock *iv,
des_key_schedule schedule)
{ {
int xserver; int xserver;
@@ -316,12 +327,12 @@ passive (int fd, char *host, des_cblock *iv, des_key_schedule schedule)
*/ */
static int static int
doit (char *host, int passivep, int debugp, int tcpp) doit (char *host, char *user, int passivep, int debugp, int tcpp)
{ {
des_key_schedule schedule; des_key_schedule schedule;
des_cblock key; des_cblock key;
int rendez_vous1 = 0, rendez_vous2 = 0; int rendez_vous1 = 0, rendez_vous2 = 0;
int (*fn)(int fd, char *host, des_cblock *iv, int (*fn)(int fd, char *host, char *user, des_cblock *iv,
des_key_schedule schedule); des_key_schedule schedule);
pid_t pid; pid_t pid;
@@ -330,7 +341,7 @@ doit (char *host, int passivep, int debugp, int tcpp)
int addrlen; int addrlen;
int otherside; int otherside;
otherside = connect_host (host, &key, schedule, passivep); otherside = connect_host (host, user, &key, schedule, passivep);
if (otherside < 0) if (otherside < 0)
return 1; return 1;
@@ -438,7 +449,7 @@ doit (char *host, int passivep, int debugp, int tcpp)
close (rendez_vous1); close (rendez_vous1);
if (rendez_vous2) if (rendez_vous2)
close (rendez_vous2); close (rendez_vous2);
return (*fn)(fd, host, &key, schedule); return (*fn)(fd, host, user, &key, schedule);
} else { } else {
close (fd); close (fd);
} }
@@ -448,7 +459,7 @@ doit (char *host, int passivep, int debugp, int tcpp)
static void static void
usage(void) usage(void)
{ {
fprintf (stderr, "Usage: %s [-d] [-t] host\n", prog); fprintf (stderr, "Usage: %s [-d] [-t] [-l remoteuser] host\n", prog);
exit (1); exit (1);
} }
@@ -462,12 +473,12 @@ int
main(int argc, char **argv) main(int argc, char **argv)
{ {
int passivep; int passivep;
char *disp; char *disp, *user = NULL;
int debugp = 0, tcpp = 0; int debugp = 0, tcpp = 0;
int c; int c;
prog = argv[0]; prog = argv[0];
while((c = getopt(argc, argv, "td")) != EOF) { while((c = getopt(argc, argv, "tdl:")) != EOF) {
switch(c) { switch(c) {
case 'd' : case 'd' :
debugp = 1; debugp = 1;
@@ -475,6 +486,9 @@ main(int argc, char **argv)
case 't' : case 't' :
tcpp = 1; tcpp = 1;
break; break;
case 'l' :
user = optarg;
break;
case '?': case '?':
default: default:
usage(); usage();
@@ -486,11 +500,19 @@ main(int argc, char **argv)
if (argc != 1) if (argc != 1)
usage (); usage ();
if (user == NULL) {
struct passwd *p = k_getpwuid (getuid ());
if (p == NULL) {
fprintf (stderr, "%s: Who are you?\n", prog);
return 1;
}
user = strdup (p->pw_name);
}
disp = getenv("DISPLAY"); disp = getenv("DISPLAY");
passivep = disp != NULL && passivep = disp != NULL &&
(*disp == ':' || strncmp(disp, "unix", 4) == 0); (*disp == ':' || strncmp(disp, "unix", 4) == 0);
signal (SIGCHLD, childhandler); signal (SIGCHLD, childhandler);
signal (SIGUSR1, usr1handler); signal (SIGUSR1, usr1handler);
signal (SIGUSR2, usr2handler); signal (SIGUSR2, usr2handler);
return doit (argv[0], passivep, debugp, tcpp); return doit (argv[0], user, passivep, debugp, tcpp);
} }