summaryrefslogtreecommitdiffstats
path: root/src/lib/gssapi/sample/flogind.c
diff options
context:
space:
mode:
authorTheodore Tso <tytso@mit.edu>1993-12-18 03:04:55 +0000
committerTheodore Tso <tytso@mit.edu>1993-12-18 03:04:55 +0000
commitbb08b522cb5381f36cb012220a1ecb47d75dee10 (patch)
treea2d2e9c52581dfce892e67bb84c2f6f617060d1b /src/lib/gssapi/sample/flogind.c
parent270eeea2b75c2622591882343e65e4c40d931bcf (diff)
Removing old gssapi implementation
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@3204 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/gssapi/sample/flogind.c')
-rw-r--r--src/lib/gssapi/sample/flogind.c456
1 files changed, 0 insertions, 456 deletions
diff --git a/src/lib/gssapi/sample/flogind.c b/src/lib/gssapi/sample/flogind.c
deleted file mode 100644
index 956a068481..0000000000
--- a/src/lib/gssapi/sample/flogind.c
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * Copyright (c) 1983 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1983 The Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)rlogind.c 5.17 (Berkeley) 8/31/88";
-#endif /* not lint */
-
-/*
- * remote login server:
- * remuser\0
- * locuser\0
- * terminal info\0
- * data
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/wait.h>
-#include <sys/file.h>
-
-#include <netinet/in.h>
-
-#include <errno.h>
-#include <pwd.h>
-#include <signal.h>
-#include <sgtty.h>
-#include <netdb.h>
-#include <syslog.h>
-#include <strings.h>
-
-#define LOGIN_PROGRAM "/usr/etc/login.sphinx"
-
-#define des_read read
-#define des_write write
-
-# ifndef TIOCPKT_WINDOW
-# define TIOCPKT_WINDOW 0x80
-# endif TIOCPKT_WINDOW
-
-extern int errno;
-int reapchild();
-struct passwd *getpwnam();
-char *malloc();
-
-int Pfd;
-
-/* ARGSUSED */
-main(argc, argv)
- int argc;
- char **argv;
-{
- int on = 1, fromlen;
- struct sockaddr_in from;
-
- fromlen = sizeof (from);
- if (getpeername(0, (struct sockaddr *)&from, &fromlen) < 0) {
- fprintf(stderr, "%s: ", argv[0]);
- perror("getpeername");
- _exit(1);
- }
- if (setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof (on)) < 0) {
- syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m");
- }
- doit(0, &from);
-}
-
-int child;
-int cleanup();
-int netf;
-char *line;
-extern char *inet_ntoa();
-
-struct winsize win = { 0, 0, 0, 0 };
-
-
-doit(f, fromp)
- int f;
- struct sockaddr_in *fromp;
-{
- int i, p, t, pid, on = 1;
- int pipes[2];
-
- register struct hostent *hp;
- struct hostent hostent;
- char c;
-
- alarm(60);
- read(f, &c, 1);
- if (c != 0)
- exit(1);
- alarm(0);
- fromp->sin_port = ntohs((u_short)fromp->sin_port);
- hp = gethostbyaddr(&fromp->sin_addr, sizeof (struct in_addr),
- fromp->sin_family);
- if (hp == 0) {
- /*
- * Only the name is used below.
- */
- hp = &hostent;
- hp->h_name = inet_ntoa(fromp->sin_addr);
- }
-
- if (fromp->sin_family != AF_INET ||
- fromp->sin_port < IPPORT_RESERVED)
- fatal(f, "Permission denied");
-
- write(f, "", 1);
- for (c = 'p'; c <= 's'; c++) {
- struct stat stb;
- line = "/dev/ptyXX";
- line[strlen("/dev/pty")] = c;
- line[strlen("/dev/ptyp")] = '0';
- if (stat(line, &stb) < 0)
- break;
- for (i = 0; i < 16; i++) {
- line[sizeof("/dev/ptyp") - 1] = "0123456789abcdef"[i];
- p = open(line, O_RDWR);
- if (p > 0)
- goto gotpty;
- }
- }
- fatal(f, "Out of ptys");
- /*NOTREACHED*/
-gotpty:
- (void) ioctl(p, TIOCSWINSZ, &win);
- netf = f;
- line[strlen("/dev/")] = 't';
- t = open(line, O_RDWR);
- if (t < 0)
- fatalperror(f, line);
- if (fchmod(t, 0))
- fatalperror(f, line);
- (void)signal(SIGHUP, SIG_IGN);
- vhangup();
- (void)signal(SIGHUP, SIG_DFL);
- t = open(line, O_RDWR);
- if (t < 0)
- fatalperror(f, line);
- {
- struct sgttyb b;
-
- (void)ioctl(t, TIOCGETP, &b);
- b.sg_flags = RAW|ANYP;
- (void)ioctl(t, TIOCSETP, &b);
- }
-#ifdef DEBUG
- {
- int tt = open("/dev/tty", O_RDWR);
- if (tt > 0) {
- (void) ioctl(tt, TIOCNOTTY, 0);
- (void) close(tt);
- }
- }
-#endif
- t = open(line, 2);
- if (t < 0)
- fatalperror(f, line, errno);
- { struct sgttyb b;
- gtty(t, &b); b.sg_flags = RAW|ANYP; stty(t, &b);
- }
-
- if (pipe(pipes) < 0) {
- fatalperror(2, "pipe", errno);
- }
-
- pid = fork();
- if (pid < 0)
- fatalperror(f, "", errno);
- if (pid == 0) {
- close(f), close(p);
- close(pipes[1]);
- dup2(t, 0), dup2(t, 1), dup2(t, 2);
- if (pipes[0] != 3) { dup2(pipes[0], 3); close(pipes[0]); }
- close(t);
-
- /* Under Ultrix 3.0, the pgrp of the slave pty terminal
- needs to be set explicitly. Why rlogind works at all
- without this on 4.3BSD is a mystery.
- It seems to work fine on 4.3BSD with this code enabled.
- */
- pid = getpgrp(getpid());
- ioctl(0, TIOCSPGRP, &pid);
- execl("/usr/etc/login.sphinx", "login.sphinx", "-g", hp->h_name, 0);
- fatalperror(2, "/usr/etc/login.sphinx", errno);
- /*NOTREACHED*/
- }
- close(t);
- close(pipes[0]);
- ioctl(f, FIONBIO, &on);
- ioctl(p, FIONBIO, &on);
- ioctl(p, TIOCPKT, &on);
- signal(SIGTSTP, SIG_IGN);
- signal(SIGCHLD, cleanup);
- setpgrp(0, 0);
- protocol(f, p, pipes[1]);
- signal(SIGCHLD, SIG_IGN);
- cleanup();
-}
-
-char magic[2] = { 0377, 0377 };
-char oobdata[] = {TIOCPKT_WINDOW};
-
-/*
- * Handle a "control" request (signaled by magic being present)
- * in the data stream. For now, we are only willing to handle
- * window size changes.
- */
-control(pty, cp, n)
- int pty;
- char *cp;
- int n;
-{
- struct winsize w;
-
- if (n < 4+sizeof (w) || cp[2] != 's' || cp[3] != 's')
- return (0);
- oobdata[0] &= ~TIOCPKT_WINDOW; /* we know he heard */
- bcopy(cp+4, (char *)&w, sizeof(w));
- w.ws_row = ntohs(w.ws_row);
- w.ws_col = ntohs(w.ws_col);
- w.ws_xpixel = ntohs(w.ws_xpixel);
- w.ws_ypixel = ntohs(w.ws_ypixel);
- (void)ioctl(pty, TIOCSWINSZ, &w);
- return (4+sizeof (w));
-}
-
-/*
- * flogin "protocol" machine.
- */
-protocol(f, p, pipe)
- int f, p, pipe;
-{
- char pibuf[1024], fibuf[1024], *pbp, *fbp;
- register pcc = 0, fcc = 0;
- int cc;
- int on = 1, off = 0, done = 0;
- char cntl;
-
- /*
- * Must ignore SIGTTOU, otherwise we'll stop
- * when we try and set slave pty's window shape
- * (our controlling tty is the master pty).
- */
- (void) signal(SIGTTOU, SIG_IGN);
- send(f, oobdata, 1, MSG_OOB); /* indicate new rlogin */
- ioctl(f, FIONBIO, &off);
- for (cc = 0; cc < 4; cc++) {
- if (1 != read(f, &fibuf[cc], 1)) {
- done = 1;
- break;
- }
- }
- if (!done) {
- int len = ((u_char *)fibuf)[2] * 256 + ((u_char *)fibuf)[3];
- pcc = write(pipe, fibuf, cc);
- if (pcc <= 0) {
- done = 1;
- syslog(LOG_INFO, "write(pipe [%d], fibuf, %d): %d: %m",
- pipe, cc, pcc);
- }
- while (!done && len > 0) {
- char *fbp = fibuf;
- cc = read(f, fibuf, len);
- if (cc <= 0) {
- done = 1;
- syslog(LOG_INFO, "read(f, fibuf, %d): %d: %m",len, cc);
- break;
- }
- len -= cc;
- while (cc > 0) {
- pcc = write(pipe, fbp, cc);
- if (pcc <= 0) {
- done = 1;
- syslog(LOG_INFO, "write(pipe [%d], fbp, %d): %d: %m",
- pipe, cc, pcc);
- break;
- }
- cc -= pcc;
- fbp += pcc;
- }
- }
- }
- ioctl(f, FIONBIO, &on);
-
- close(pipe); fcc = 0; pcc = 0;
- for (;;) {
- int ibits, obits, ebits;
-
- ibits = 0;
- obits = 0;
- if (fcc)
- obits |= (1<<p);
- else
- ibits |= (1<<f);
- if (pcc >= 0)
- if (pcc)
- obits |= (1<<f);
- else
- ibits |= (1<<p);
- ebits = (1<<p);
- if (select(32, &ibits, &obits, &ebits, 0) < 0) {
- if (errno == EINTR)
- continue;
- fatalperror(f, "select");
- }
- if (ibits == 0 && obits == 0 && ebits == 0) {
- /* shouldn't happen... */
- sleep(5);
- continue;
- }
-#define pkcontrol(c) ((c)&(TIOCPKT_FLUSHWRITE|TIOCPKT_NOSTOP|TIOCPKT_DOSTOP))
- if (ebits & (1<<p)) {
- cc = read(p, &cntl, 1);
- if (cc == 1 && pkcontrol(cntl)) {
- cntl |= oobdata[0];
- send(f, &cntl, 1, MSG_OOB);
- if (cntl & TIOCPKT_FLUSHWRITE) {
- pcc = 0;
- ibits &= ~(1<<p);
- }
- }
- }
- if (ibits & (1<<f)) {
- fcc = read(f, fibuf, sizeof(fibuf));
- if (fcc < 0 && errno == EWOULDBLOCK)
- fcc = 0;
- else {
- register char *cp;
- int left, n;
-
- if (fcc <= 0)
- break;
- fbp = fibuf;
-
- top:
- for (cp = fibuf; cp < fibuf+fcc-1; cp++)
- if (cp[0] == magic[0] &&
- cp[1] == magic[1]) {
- left = fcc - (cp-fibuf);
- n = control(p, cp, left);
- if (n) {
- left -= n;
- if (left > 0)
-
-bcopy(cp+n, cp, left);
- fcc -= n;
- goto top; /* n^2 */
- }
- }
- }
- }
-
- if ((obits & (1<<p)) && fcc > 0) {
- cc = write(p, fbp, fcc);
- if (cc > 0) {
- fcc -= cc;
- fbp += cc;
- }
- }
-
- if (ibits & (1<<p)) {
- pcc = read(p, pibuf, sizeof (pibuf));
- pbp = pibuf;
- if (pcc < 0 && errno == EWOULDBLOCK)
- pcc = 0;
- else if (pcc <= 0)
- break;
- else if (pibuf[0] == 0)
- pbp++, pcc--;
- else {
- if (pkcontrol(pibuf[0])) {
- pibuf[0] |= oobdata[0];
- send(f, &pibuf[0], 1, MSG_OOB);
- }
- pcc = 0;
- }
- }
- if ((obits & (1<<f)) && pcc > 0) {
- cc = des_write(f, pbp, pcc);
- if (cc < 0 && errno == EWOULDBLOCK) {
- /* also shouldn't happen */
- sleep(5);
- continue;
- }
- if (cc > 0) {
- pcc -= cc;
- pbp += cc;
- }
- }
- }
-}
-
-cleanup()
-{
- char *p;
-
- p = line + sizeof("/dev/") - 1;
- if (!logout(p))
- logwtmp(p, "", "");
- (void)chmod(line, 0666);
- (void)chown(line, 0, 0);
- *p = 'p';
- (void)chmod(line, 0666);
- (void)chown(line, 0, 0);
- shutdown(netf, 2);
- exit(1);
-}
-
-fatal(f, msg)
- int f;
- char *msg;
-{
- char buf[BUFSIZ];
-
- buf[0] = '\01'; /* error indicator */
- (void) sprintf(buf + 1, "rlogind: %s.\r\n", msg);
- (void) write(f, buf, strlen(buf));
- exit(1);
-}
-
-fatalperror(f, msg)
- int f;
- char *msg;
-{
- char buf[BUFSIZ];
- extern int sys_nerr;
- extern char *sys_errlist[];
-
- if ((unsigned)errno < sys_nerr)
- (void) sprintf(buf, "%s: %s", msg, sys_errlist[errno]);
- else
- (void) sprintf(buf, "%s: Error %d", msg, errno);
- fatal(f, buf);
-}