/* * INTERNAL.C * * DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved * * Usually SCMD_OPEN requests attempt to connect() to the UNIX * domain socket of the server. However, some 'ports' are designated * as internal to DNET. They reside here. * * -IALPHATERM */ #include "dnet.h" #include "../server/servers.h" #include #include #include #include #include extern char *getenv(); isinternalport(port) uword port; { if (port == PORT_IALPHATERM) return(1); return(0); } iconnect(ps, port) int *ps; uword port; { if (port == PORT_IALPHATERM) return(ialphaterm_connect(ps, port)); return(-1); } ialphaterm_connect(pmaster) int *pmaster; { struct sgttyb sg; struct tchars tc; struct ltchars ltc; #ifdef TIOCGSIZE struct ttysize ts; #else #ifdef TIOCGWINSZ struct winsize ws; #endif #endif int lmode; int fdmaster; int fdslave; int pid; char *slavename; ioctl(0, TIOCGETP, (char *)&sg); ioctl(0, TIOCGETC, (char *)&tc); ioctl(0, TIOCGLTC, (char *)<c); ioctl(0, TIOCLGET, (char *)&lmode); #ifdef TIOCGSIZE ioctl(0, TIOCGSIZE, &ts); #else #ifdef TIOCGWINSZ ioctl(0, TIOCGWINSZ, &ws); #endif #endif sg.sg_flags &= ~(RAW); sg.sg_flags |= ECHO; #ifdef TIOCGSIZE ts.ts_lines = 23; ts.ts_cols = 77; #else #ifdef TIOCGWINSZ ws.ws_row = 23; ws.ws_col = 77; #endif #endif if (DDebug) fprintf(stderr, "PTY openning internal pty\n"); if (openpty(&fdmaster, &fdslave, &slavename) >= 0) { if (DDebug) fprintf(stderr, "PTY open successfull\n"); if ((pid = fork()) == NULL) { int i; setenv("DNET=", "IALPHATERM"); setuid(getuid()); signal(SIGHUP, SIG_DFL); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGTERM, SIG_DFL); signal(SIGCHLD, SIG_DFL); signal(SIGTSTP, SIG_IGN); ioctl(open("/dev/tty", 2), TIOCNOTTY, NULL); close(open(slavename, 0)); dup2(fdslave, 0); dup2(0, 1); dup2(0, 2); for (i = 3; i < 256; ++i) close(i); ioctl(0, TIOCSETN, &sg); ioctl(0, TIOCSETC, &tc); ioctl(0, TIOCSLTC, <c); ioctl(0, TIOCLSET, &lmode); #ifdef TIOCSSIZE ioctl(0, TIOCSSIZE, &ts); #else #ifdef TIOCSWINSZ ioctl(0, TIOCSWINSZ, &ws); #endif #endif { char *shell = getenv("SHELL"); char *home = getenv("HOME"); if (!shell) shell = "/bin/sh"; if (!home) home = "."; chdir(home); execl(shell, "-fshell", NULL); perror(shell); } _exit(1); } if (pid > 0) { *pmaster = fdmaster; close(fdslave); if (DDebug) fprintf(stderr, "PTY OPEN OK.2\n"); return(1); } close(fdmaster); close(fdslave); if (DDebug) fprintf(stderr, "PTY OPEN FAILURE.1\n"); } if (DDebug) fprintf(stderr, "PTY OPEN FAILURE.2\n"); return(-1); } openpty(pfdm, pfds, pnames) int *pfdm; int *pfds; char **pnames; { static char ptcs[] = { "0123456789abcdef" }; static char plate[] = { "/dev/ptyxx" }; struct stat stat; int i; int j; for (i = 'p';; ++i) { plate[8] = i; plate[9] = ptcs[0]; if (lstat(plate, &stat) < 0) break; for (j = 0; ptcs[j]; ++j) { plate[9] = ptcs[j]; plate[5] = 'p'; if ((*pfdm = open(plate, O_RDWR)) >= 0) { plate[5] = 't'; if ((*pfds = open(plate, O_RDWR)) >= 0) { *pnames = plate; if (DDebug) fprintf(stderr, "PTY FOUND %s\n", *pnames); return(1); } close(*pfdm); } } } return(-1); } isetrows(fd, rows) { #ifdef TIOCSSIZE struct ttysize ts; if (ioctl(fd, TIOCGSIZE, &ts) >= 0) { ts.ts_lines = rows; ioctl(fd, TIOCSSIZE, &ts); } #else #ifdef TIOCSWINSZ struct winsize ws; if (ioctl(fd, TIOCGWINSZ, &ws) >= 0) { ws.ws_row = rows; ioctl(fd, TIOCSWINSZ, &ws); } #endif #endif } isetcols(fd, cols) { #ifdef TIOCSSIZE struct ttysize ts; if (ioctl(fd, TIOCGSIZE, &ts) >= 0) { ts.ts_cols = cols; ioctl(fd, TIOCSSIZE, &ts); } #else #ifdef TIOCSWINSZ struct winsize ws; if (ioctl(fd, TIOCGWINSZ, &ws) >= 0) { ws.ws_col = cols; ioctl(fd, TIOCSWINSZ, &ws); } #endif #endif }