summaryrefslogtreecommitdiffstats
path: root/loader2
diff options
context:
space:
mode:
Diffstat (limited to 'loader2')
-rw-r--r--loader2/Makefile2
-rw-r--r--loader2/linuxrc.s3903
-rw-r--r--loader2/loader.c8
-rw-r--r--loader2/loader.h2
-rw-r--r--loader2/telnet.c272
-rw-r--r--loader2/telnet.h40
-rw-r--r--loader2/telnetd.c250
-rw-r--r--loader2/telnetd.h8
8 files changed, 3 insertions, 582 deletions
diff --git a/loader2/Makefile b/loader2/Makefile
index 0b59a2e91..3eeec8762 100644
--- a/loader2/Makefile
+++ b/loader2/Makefile
@@ -44,7 +44,7 @@ OBJS = log.o moduleinfo.o loadermisc.o modules.o moduledeps.o windows.o \
getparts.o dirbrowser.o \
$(HWOBJS) $(METHOBJS)
LOADEROBJS = loader.o loader-pcmcia.o
-NETOBJS = net.o urls.o ftp.o telnet.o telnetd.o
+NETOBJS = net.o urls.o ftp.o
PCMCIAOBJS = pcmcia.o $(NETOBJS)
SOURCES = $(subst .o,.c,$(OBJS)) loader.c
diff --git a/loader2/linuxrc.s390 b/loader2/linuxrc.s390
index fb62f95b7..6cd93beca 100644
--- a/loader2/linuxrc.s390
+++ b/loader2/linuxrc.s390
@@ -94,12 +94,11 @@ getlcsifname() {
startinetd()
{
echo
- echo $"Starting telnetd and sshd to allow login over the network."
+ echo $"Starting sshd to allow login over the network."
echo $"Welcome to the anaconda install environment $VERSION for $S390ARCH" > /etc/issue.net
echo $"Welcome to the anaconda install environment $VERSION for $S390ARCH" > /etc/motd
echo >> /etc/motd
- /sbin/xinetd -stayalive -reuse -pidfile /tmp/xinetd.pid
/sbin/sshd
if [ -z "$RUNKS" ]; then
echo
diff --git a/loader2/loader.c b/loader2/loader.c
index 7e1140442..8e59c4369 100644
--- a/loader2/loader.c
+++ b/loader2/loader.c
@@ -82,7 +82,6 @@
#include "urlinstall.h"
#include "net.h"
-#include "telnetd.h"
#include <selinux/selinux.h>
#include "selinux.h"
@@ -623,8 +622,6 @@ static void parseCmdLineFlags(struct loaderData_s * loaderData,
flags |= LOADER_FLAGS_NOUSB;
else if (!strcasecmp(argv[i], "ub"))
flags |= LOADER_FLAGS_UB;
- else if (!strcasecmp(argv[i], "telnet"))
- flags |= LOADER_FLAGS_TELNETD;
else if (!strcasecmp(argv[i], "nofirewire"))
flags |= LOADER_FLAGS_NOIEEE1394;
else if (!strcasecmp(argv[i], "nonet"))
@@ -1539,7 +1536,7 @@ int main(int argc, char ** argv) {
checkForRam();
- /* iSeries vio console users will be telnetting in to the primary
+ /* iSeries vio console users will be ssh'ing in to the primary
partition, so use a terminal type that is appripriate */
if (isVioConsole())
setenv("TERM", "vt100", 1);
@@ -1623,9 +1620,6 @@ int main(int argc, char ** argv) {
}
}
- if (FL_TELNETD(flags))
- startTelnetd(&loaderData, modInfo, modLoaded, modDeps);
-
url = doLoaderMain("/mnt/source", &loaderData, modInfo, modLoaded, &modDeps);
if (!FL_TESTING(flags)) {
diff --git a/loader2/loader.h b/loader2/loader.h
index 7967c0556..5775eea92 100644
--- a/loader2/loader.h
+++ b/loader2/loader.h
@@ -27,7 +27,6 @@
#define LOADER_FLAGS_NOUSB (1 << 16)
#define LOADER_FLAGS_NOSHELL (1 << 17)
#define LOADER_FLAGS_NOPCMCIA (1 << 18)
-#define LOADER_FLAGS_TELNETD (1 << 19)
#define LOADER_FLAGS_NOPASS (1 << 20)
#define LOADER_FLAGS_UB (1 << 21)
#define LOADER_FLAGS_MEDIACHECK (1 << 22)
@@ -59,7 +58,6 @@
#define FL_NOFB(a) ((a) & LOADER_FLAGS_NOFB)
#define FL_NOPCMCIA(a) ((a) & LOADER_FLAGS_NOPCMCIA)
#define FL_RESCUE_NOMOUNT(a) ((a) & LOADER_FLAGS_RESCUE_NOMOUNT)
-#define FL_TELNETD(a) ((a) & LOADER_FLAGS_TELNETD)
#define FL_NOPASS(a) ((a) & LOADER_FLAGS_NOPASS)
#define FL_MEDIACHECK(a) ((a) & LOADER_FLAGS_MEDIACHECK)
#define FL_NOUSBSTORAGE(a) ((a) & LOADER_FLAGS_NOUSBSTORAGE)
diff --git a/loader2/telnet.c b/loader2/telnet.c
deleted file mode 100644
index 4b8cf09aa..000000000
--- a/loader2/telnet.c
+++ /dev/null
@@ -1,272 +0,0 @@
-/* telnet.c -- basic telnet protocol handling for ttywatch
- *
- * Copyright © 2001 Michael K. Johnson <johnsonm@redhat.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/* Shamelessly stolen from ttywatch -- oot */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "telnet.h"
-#include "log.h"
-
-#define IAC "\xff"
-#define DONT "\xfe"
-#define WONT "\xfc"
-#define WILL "\xfb"
-#define DO "\xfd"
-#define SB "\xfa"
-#define SE "\xf0"
-#define ECHO "\x01"
-#define SUPPRESS_GO_AHEAD "\x03"
-#define TERMINAL_TYPE "\x18"
-#define NAWS "\x1f"
-#define LINEMODE "\x22"
-#define NEWENVIRON "\x27"
-#define MODE "\x01"
-
-/* Make a request. Not intended to be RFC-compatible, just enough
- * to convince telnet clients to do what we want... To do this
- * right, we would have to honestly negotiate, not speak blind.
- *
- * For now, assume all responses will be favorable and stripped
- * out in telnet_process_input()... Sending it all in a single
- * write makes it more efficient because it will all go out in a
- * single packet, and the responses are more likely to all come
- * back in a single packet (and thus, practically, a single read)
- * too.
- */
-void
-telnet_negotiate(int socket, char ** term_type_ptr, int * heightPtr,
- int * widthPtr) {
- char ch;
- int done = 0;
- char * termType = NULL;
- int termLength = 0, termAlloced = 0;
- enum { ST_NONE, ST_TERMTYPE, ST_WINDOWSIZE } state;
- char sizeBuf[4];
- int height = -1, width = -1;
- char * sizePtr = sizeBuf;
- char request[]=
- IAC DONT ECHO
- IAC WILL ECHO
- IAC WILL NAWS
- IAC WILL SUPPRESS_GO_AHEAD
- IAC DO SUPPRESS_GO_AHEAD
- IAC DONT NEWENVIRON
- IAC WONT NEWENVIRON
- IAC WONT LINEMODE
- IAC DO NAWS
- IAC SB TERMINAL_TYPE "\x01" IAC SE
- ;
- int ret;
-
- ret = write(socket, request, sizeof(request)-1);
-
- /* Read from the terminal until we get the terminal type. This will
- do bad things if the client doesn't send the terminal type, but
- those clients have existed for aeons (right?) */
-
- do {
- ret = read(socket, &ch, 1);
- if (ch != '\xff') {
- abort();
- }
-
- ret = read(socket, &ch, 1); /* command */
-
- if (ch != '\xfa') {
- ret = read(socket, &ch, 1); /* verb */
- continue;
- }
-
- ret = read(socket, &ch, 1); /* suboption */
- if (ch == '\x18') {
- state = ST_TERMTYPE;
- ret = read(socket, &ch, 1); /* should be 0x0! */
- done = 1;
- } else if (ch == '\x1f') {
- state = ST_WINDOWSIZE;
- } else {
- state = ST_NONE;;
- }
-
- ret = read(socket, &ch, 1); /* data */
- while (ch != '\xff') {
- if (state == ST_TERMTYPE) {
- if (termAlloced == termLength) {
- termAlloced += 10;
- termType = realloc(termType, termAlloced + 1);
- }
-
- termType[termLength++] = tolower(ch);
- } else if (state == ST_WINDOWSIZE) {
- if ((sizePtr - sizeBuf) < (int)sizeof(sizeBuf))
- *sizePtr++ = ch;
- }
-
- ret = read(socket, &ch, 1); /* data */
- }
-
- ret = read(socket, &ch, 1); /* should be a SE */
-
- } while (!done);
-
- termType[termLength] = '\0';
-
- if (sizePtr - sizeBuf == sizeof(sizeBuf)) {
- width = (sizeBuf[0] << 8) + sizeBuf[1];
- height = (sizeBuf[2] << 8) + sizeBuf[3];
- }
-
- if (heightPtr) *heightPtr = height;
- if (widthPtr) *widthPtr = width;
-
- if (term_type_ptr) *term_type_ptr = termType;
-}
-
-int
-telnet_process_input(telnet_state * ts, char *data, int len) {
- char *s, *d; /* source, destination */
-
-# if DEBUG_TELNET
- printf("\nprinting packet:");
- for (s=data; s<data+len; s++) {
- if (!((s-data)%10))
- printf("\n %03d: ", s-data);
- printf("%02x ", *s & 0x000000FF);
- }
- printf("\n");
-# endif /* DEBUG_TELNET */
-
- for (s=data, d=data; s<data+len; s++) {
- switch (*ts) {
- case TS_DATA:
- if (*s == '\xff') { /* IAC */
- *ts = TS_IAC;
- continue;
- }
-#if DEBUG_TELNET
- printf("copying data element '%c'\n", *s);
-#endif /* DEBUG_TELNET */
- if (s>d) {
- *(d++) = *s;
- } else {
- d++;
- }
- break;
-
- case TS_IAC:
- if (*s == '\xfa') { /* SB */
- *ts = TS_SB;
- continue;
- }
- /* if not SB, skip IAC verb object */
-# if DEBUG_TELNET
- printf("skipping verb/object (offset %d)...\n", s-data-1);
-# endif /* DEBUG_TELNET */
- s += 1;
- *ts = TS_DATA;
- break;
-
- case TS_SB:
-# if DEBUG_TELNET
- printf("skipping SB (offset %d)...\n", s-data-1);
-# endif /* DEBUG_TELNET */
- while (s < (data+(len-1))) {
- if (*s == '\xff') {
- break; /* fall through to TS_SB_IAC setting below */
- } else {
- s++;
- }
- }
- if (*s == '\xff') {
- *ts = TS_SB_IAC;
- }
- break;
-
- case TS_SB_IAC:
- if (*s == '\xf0') { /* SE */
-# if DEBUG_TELNET
- printf("SE ends SB (offset %d)...\n", s-data-1);
-# endif /* DEBUG_TELNET */
- *ts = TS_DATA;
- } else {
-# if DEBUG_TELNET
- printf("IAC without SE in SB (offset %d)\n", s-data-1);
-# endif /* DEBUG_TELNET */
- *ts = TS_SB;
- }
- break;
-
- default:
- logMessage(WARNING, "unknown telnet state %d for data element %c",
- *ts, *s);
- *ts = TS_DATA;
- break;
- }
- }
-
- /* calculate new length after copying data around */
- len = d - data;
-#if DEBUG_TELNET
- printf("returning len: %d of packet:", len);
- for (s=data; s<data+len; s++) {
- if (!((s-data)%10))
- printf("\n %03d: ", s-data);
- printf("%02x ", *s & 0x000000FF);
- }
- printf("\n");
-#endif /* DEBUG_TELNET */
-
- return len;
-}
-
-/* The telnet protocol requires CR/NL instead of just NL
- * We normally deal with Unix, which just uses NL, so we need to translate.
- *
- * It would be easy to go through line-by-line and write each line, but
- * that would create more packet overhead by sending out one packet
- * per line, and over things like slow PPP connections, that is painful.
- * Therefore, instead, we create a modified copy of the data and write
- * the whole modified copy at once.
- */
-void
-telnet_send_output(int sock, char *data, int len) {
- char *s, *d; /* source, destination */
- char *buf;
- int ret;
-
- buf = alloca((len*2)+1); /* max necessary size */
-
- /* just may need to add CR before NL (but do not double existing CRs) */
- for (s=data, d=buf; d-buf<len; s++, d++) {
- if ((*s == '\n') && (s == data || (*(s-1) != '\r'))) {
- /* NL without preceding CR */
- *(d++) = '\r';
- len++;
- }
- *d = *s;
- }
-
- /* now send it... */
- ret = write(sock, buf, len);
-}
diff --git a/loader2/telnet.h b/loader2/telnet.h
deleted file mode 100644
index 58ea5ba0a..000000000
--- a/loader2/telnet.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* telnet.h -- basic telnet protocol handling for ttywatch
- *
- * Copyright © 2001 Michael K. Johnson <johnsonm@redhat.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __TELNET_H__
-#define __TELNET_H__
-
-typedef enum {
- TS_DATA = 0,
- TS_IAC,
- TS_SB,
- TS_SB_IAC,
-} telnet_state;
-
-void
-telnet_negotiate(int socket, char ** term_type_ptr, int * heightPtr,
- int * widthPtr);
-int
-telnet_process_input(telnet_state * ts, char *data, int len);
-void
-telnet_send_output(int sock, char *data, int len);
-
-#endif /* __TELNET_H__ */
diff --git a/loader2/telnetd.c b/loader2/telnetd.c
deleted file mode 100644
index 75bce5222..000000000
--- a/loader2/telnetd.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * telnetd.c - glue to tie telnet.c from ttywatch to the loader
- *
- * Erik Troan <ewt@redhat.com>
- * Jeremy Katz <katzj@redhat.com>
- *
- * Copyright 2002 Red Hat, Inc.
- *
- * This software may be freely redistributed under the terms of the GNU
- * General Public License.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <arpa/inet.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <netinet/in.h>
-#include <newt.h>
-#include <pty.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/poll.h>
-#include <sys/signal.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "lang.h"
-#include "loader.h"
-#include "log.h"
-#include "modules.h"
-#include "net.h"
-#include "telnet.h"
-#include "windows.h"
-
-#ifndef IPPORT_TELNET
-#define IPPORT_TELNET 23
-#endif
-
-/* boot flags */
-extern int flags;
-
-/* Forks, keeping the loader as our child (so we know when it dies). */
-int beTelnet(void) {
- int sock;
- int conn;
- socklen_t addrLength;
- pid_t child;
- int i;
- int masterFd, ttyFd;
- struct sockaddr_in address;
- char buf[4096];
- struct pollfd fds[3];
- telnet_state ts = TS_DATA;
- char * termType;
- int height, width;
- struct winsize ws;
-
- if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
- logMessage(ERROR, "socket: %s", strerror(errno));
- return -1;
- }
-
- address.sin_family = AF_INET;
- address.sin_port = htons(IPPORT_TELNET);
- memset(&address.sin_addr, 0, sizeof(address.sin_addr));
- addrLength = sizeof(address);
-
- /* Let the kernel reuse the socket address. This lets us run
- twice in a row, without waiting for the (ip, port) tuple
- to time out. Makes testing much easier*/
- conn = 1;
- setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &conn, sizeof(conn));
-
- bind(sock, (struct sockaddr *) &address, sizeof(address));
- listen(sock, 5);
-
- winStatus(45, 3, _("Telnet"), _("Waiting for telnet connection..."));
-
- if ((conn = accept(sock, (struct sockaddr *) &address,
- &addrLength)) < 0) {
- newtWinMessage(_("Error"), _("OK"), "accept failed: %s",
- strerror(errno));
- close(sock);
- return -1;
- }
-
- stopNewt();
-
- close(sock);
-
- telnet_negotiate(conn, &termType, &height, &width);
-
-#ifdef DEBUG_TELNET
- printf("got term type %s\n", termType);
-#endif
-
- masterFd = open("/dev/ptmx", O_RDWR);
- if (masterFd < 0) {
- logMessage(CRITICAL, "cannot open /dev/ptmx");
- close(conn);
- return -1;
- }
-
- if (height != -1 && width != -1) {
-#ifdef DEBUG_TELNET
- printf("setting window size to %d x %d\n", width, height);
-#endif
- ws.ws_row = height;
- ws.ws_col = width;
- ioctl(masterFd, TIOCSWINSZ, &ws);
- }
-
-
- child = fork();
-
- if (child) {
-#ifndef DEBUG_TELNET
- startNewt();
- winStatus(45, 3, _("Telnet"), _("Running anaconda via telnet..."));
-#endif
-
- fds[0].events = POLLIN;
- fds[0].fd = masterFd;
-
- fds[1].events = POLLIN;
- fds[1].fd = conn;
-
- while ((i = poll(fds, 2, -1)) > 0) {
- if (fds[0].revents) {
- i = read(masterFd, buf, sizeof(buf));
-
-#ifdef DEBUG_TELNET
- {
- int j;
- int row;
-
- for (row = 0; row < (i / 12) + 1; row++) {
- printf("wrote:");
- for (j = (row * 12); j < i && j < ((row + 1) * 12); j++)
- printf(" 0x%2x", (unsigned char) buf[j]);
- printf("\n");
- printf("wrote:");
- for (j = (row * 12); j < i && j < ((row + 1) * 12); j++)
- {
- if (isprint(buf[j]))
- printf(" %c ", buf[j]);
- else
- printf(" ");
- }
- printf("\n");
- }
- }
-#endif
- /* child died */
- if (i < 0)
- break;
-
- telnet_send_output(conn, buf, i);
- }
-
- if (fds[1].revents) {
- int ret;
- i = read(conn, buf, sizeof(buf));
-
- /* connection went away */
- if (!i)
- break;
-
- i = telnet_process_input(&ts, buf, i);
- ret = write(masterFd, buf, i);
-
-#ifdef DEBUG_TELNET
- {
- int j;
-
- printf("got:");
- for (j = 0; j < i; j++)
- printf(" 0x%x", (unsigned char) buf[j]);
- printf("\n");
- }
-#endif
-
- }
- }
-
-
- if (i < 0) {
- logMessage(ERROR, "poll: %s", strerror(errno));
- }
-
-#ifndef DEBUG_TELNET
- stopNewt();
-#endif
-
- kill(child, SIGTERM);
- close(conn);
-
- exit(0);
- }
-
- unlockpt(masterFd);
- grantpt(masterFd);
- ttyFd = open(ptsname(masterFd), O_RDWR);
- close(masterFd);
- setsid();
- close(0);
- close(1);
- close(2);
-
- if (ttyFd != 0) {
- dup2(ttyFd, 0);
- close(ttyFd);
- }
- dup2(0, 1);
- dup2(0, 2);
-
- /* brand new tty! */
- setenv("TERM", termType, 1);
-
- startNewt();
-
- return 0;
-}
-
-void startTelnetd(struct loaderData_s * loaderData,
- moduleInfoSet modInfo, moduleList modLoaded,
- moduleDeps modDeps) {
- char ret[47];
- struct networkDeviceConfig netCfg;
- ip_addr_t *tip;
-
- if (kickstartNetworkUp(loaderData, &netCfg)) {
- logMessage(ERROR, "unable to bring up network");
- return;
- }
-
- tip = &(netCfg.dev.ip);
- inet_ntop(tip->sa_family, IP_ADDR(tip), ret, IP_STRLEN(tip));
- logMessage(INFO, "going to beTelnet for %s", ret);
- if (!beTelnet())
- flags |= LOADER_FLAGS_TEXT | LOADER_FLAGS_NOSHELL;
-
- return;
-}
diff --git a/loader2/telnetd.h b/loader2/telnetd.h
deleted file mode 100644
index 145c55f21..000000000
--- a/loader2/telnetd.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef TELNETD_H
-#define TELNETD_H
-
-void startTelnetd(struct loaderData_s * loaderData,
- moduleInfoSet modInfo, moduleList modLoaded,
- moduleDeps modDeps);
-
-#endif