summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-console/MyPty.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/opie-console/MyPty.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/MyPty.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/noncore/apps/opie-console/MyPty.cpp b/noncore/apps/opie-console/MyPty.cpp
index 534f79a..b0f0275 100644
--- a/noncore/apps/opie-console/MyPty.cpp
+++ b/noncore/apps/opie-console/MyPty.cpp
@@ -133,32 +133,26 @@ const char* MyPty::deviceName()
{
return m_ttynam;
}
void MyPty::error()
{
// This is code from the Qt DumbTerminal example
donePty();
}
void MyPty::start() {
- char* cmd = "/bin/sh";
-
- if ( QFile::exists( "/bin/bash" ) ) {
- cmd = "/bin/bash";
- }
-
QStrList lis;
- int r =run(cmd, lis, 0, 0);
+ int r =run(m_cmd.latin1(), lis, 0, 0);
r = r;
}
/*!
start the client program.
*/
int MyPty::run(const char* cmd, QStrList &, const char*, int)
{
// This is code from the Qt DumbTerminal example
m_cpid = fork();
if ( !m_cpid ) {
// child - exec shell on tty
@@ -173,25 +167,28 @@ int MyPty::run(const char* cmd, QStrList &, const char*, int)
if ( setsid() < 0 )
perror( "failed to set process group" );
#if defined (TIOCSCTTY)
// grabbed from APUE by Stevens
ioctl(STDIN_FILENO, TIOCSCTTY, 0);
#endif
tcgetattr( STDIN_FILENO, &ttmode );
ttmode.c_cc[VINTR] = 3;
ttmode.c_cc[VERASE] = 8;
tcsetattr( STDIN_FILENO, TCSANOW, &ttmode );
setenv("TERM",m_term,1);
setenv("COLORTERM","0",1);
-
+ EnvironmentMap::Iterator it;
+ for (it = m_env.begin(); it != m_env.end(); it++) {
+ setenv(it.key().latin1(), it.data().latin1(), 1);
+ }
if (getuid() == 0) {
char msg[] = "WARNING: You are running this shell as root!\n";
write(ttyfd, msg, sizeof(msg));
}
execl(cmd, cmd, 0);
donePty();
exit(-1);
}
// parent - continue as a widget
delete m_sn_r;
@@ -254,24 +251,25 @@ MyPty::MyPty(const Profile& prof) : m_cpid(0)
case Profile::Linux:
m_term = "linux";
break;
case Profile::XTerm:
m_term = "xterm";
break;
}
m_sn_e = 0l;
m_sn_r = 0l;
m_fd = openPty();
ProcCtl* ctl = ProcCtl::self();
Q_UNUSED(ctl);
+ reload(prof);
}
/*!
Destructor.
Note that the related client program is not killed
(yet) when a instance is deleted.
*/
MyPty::~MyPty()
{
donePty();
}
QString MyPty::identifier()const {
@@ -282,26 +280,35 @@ QString MyPty::name()const{
}
bool MyPty::open() {
if (m_fd < 0)
m_fd = openPty();
start();
return true;
}
void MyPty::close() {
donePty();
m_fd = openPty();
}
-void MyPty::reload( const Profile& ) {
-
+void MyPty::reload( const Profile& prof) {
+ m_env.clear();
+ m_cmd = prof.readEntry("Command", "/bin/bash");
+ int envcount = prof.readNumEntry("EnvVars", 0);
+ for (int i=0; i<envcount; i++) {
+ QString name = prof.readEntry("Env_Name_" + QString::number(i), "");
+ QString value = prof.readEntry("Env_Value_" + QString::number(i), "");
+ if (!(name.isEmpty() || value.isEmpty())) {
+ m_env.insert(name, value);
+ }
+ }
}
/*! sends len bytes through the line */
void MyPty::send(const QByteArray& ar)
{
#ifdef VERBOSE_DEBUG
// verbose debug
printf("sending bytes:\n");
for (uint i = 0; i < ar.count(); i++)
printf("%c", ar[i]);
printf("\n");
#endif