diff options
Diffstat (limited to 'kdm/kfrontend/kconsole.cpp')
-rw-r--r-- | kdm/kfrontend/kconsole.cpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/kdm/kfrontend/kconsole.cpp b/kdm/kfrontend/kconsole.cpp new file mode 100644 index 000000000..b101712da --- /dev/null +++ b/kdm/kfrontend/kconsole.cpp @@ -0,0 +1,183 @@ +/* + +xconsole widget for KDM + +Copyright (C) 2002-2003 Oswald Buddenhagen <ossi@kde.org> + + +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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include <config.h> + +#ifdef WITH_KDM_XCONSOLE + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/ioctl.h> + +#ifdef HAVE_TERMIOS_H +/* for HP-UX (some versions) the extern C is needed, and for other + platforms it doesn't hurt */ +extern "C" { +#include <termios.h> +} +#endif +#if !defined(__osf__) +#ifdef HAVE_TERMIO_H +/* needed at least on AIX */ +#include <termio.h> +#endif +#endif + +#if defined (_HPUX_SOURCE) +#define _TERMIOS_INCLUDED +#include <bsdtty.h> +#endif + + +#include "kconsole.h" +#include "kdmconfig.h" +#include "kdm_greet.h" + +#include <klocale.h> +#include <kpty.h> + +#include <qsocketnotifier.h> + +KConsole::KConsole( QWidget *_parent ) + : inherited( _parent ) + , pty( 0 ) + , notifier( 0 ) + , fd( -1 ) +{ + setReadOnly( true ); + setWordWrap( NoWrap ); + setTextFormat( PlainText ); + + if (!OpenConsole()) + append( i18n("Cannot open console") ); +} + +KConsole::~KConsole() +{ + CloseConsole(); +} + +int +KConsole::OpenConsole() +{ +#ifdef TIOCCONS + static const char on = 1; +#endif + + if (*_logSource) { + if ((fd = open( _logSource, O_RDONLY | O_NONBLOCK )) >= 0) + goto gotcon; + LogError( "Cannot open log source %s, " + "falling back to /dev/console.\n", _logSource ); + } + + pty = new KPty; + if (!pty->open()) { + delete pty; + pty = 0; + return 0; + } + +#ifdef TIOCCONS + if (ioctl( pty->slaveFd(), TIOCCONS, &on ) < 0) { + perror( "ioctl TIOCCONS" ); + delete pty; + pty = 0; + return 0; + } +#else + int consfd; + if ((consfd = open( "/dev/console", O_RDONLY )) < 0) { + perror( "opening /dev/console" ); + delete pty; + pty = 0; + return 0; + } + if (ioctl( consfd, SRIOCSREDIR, slave_fd ) < 0) { + perror( "ioctl SRIOCSREDIR" ); + ::close( consfd ); + delete pty; + pty = 0; + return 0; + } + ::close( consfd ); +#endif + fd = pty->masterFd(); + + gotcon: + notifier = new QSocketNotifier( fd, QSocketNotifier::Read, this ); + connect( notifier, SIGNAL(activated( int )), SLOT(slotData()) ); + return 1; +} + +void +KConsole::CloseConsole() +{ + delete notifier; + notifier = 0; + if (pty) { + delete pty; + pty = 0; + } else + ::close( fd ); + fd = -1; +} + +void +KConsole::slotData() +{ + int n; + char buffer[1024]; + + if ((n = read( fd, buffer, sizeof(buffer) )) <= 0) { + CloseConsole(); + if (!n) + if (!OpenConsole()) + append( i18n("\n*** Cannot open console log source ***") ); + } else { + bool as = !verticalScrollBar()->isVisible() || + (verticalScrollBar()->value() == + verticalScrollBar()->maxValue()); + QString str( QString::fromLocal8Bit( buffer, n ).remove( '\r' ) ); + int pos, opos; + for (opos = 0; (pos = str.find( '\n', opos )) >= 0; opos = pos + 1) { + if (paragraphs() == 100) + removeParagraph( 0 ); + if (!leftover.isEmpty()) { + append( leftover + str.mid( opos, pos - opos ) ); + leftover = QString::null; + } else + append( str.mid( opos, pos - opos ) ); + } + leftover += str.mid( opos ); + if (as) + scrollToBottom(); + } +} + +#include "kconsole.moc" + +#endif |