summaryrefslogtreecommitdiff
authordrw <drw>2004-08-20 13:31:37 (UTC)
committer drw <drw>2004-08-20 13:31:37 (UTC)
commite0ec76bd6ab6402b555d04f92225c9dd41faee4c (patch) (side-by-side diff)
tree63fbaf5c7e2b48f0664659cf086e431edd7e4a20
parentf11184b14cd22d80d88bf8e653f217eb52dd2976 (diff)
downloadopie-e0ec76bd6ab6402b555d04f92225c9dd41faee4c.zip
opie-e0ec76bd6ab6402b555d04f92225c9dd41faee4c.tar.gz
opie-e0ec76bd6ab6402b555d04f92225c9dd41faee4c.tar.bz2
Applied patch from Cwiiis to fix linking of apps to root when installed elsewhere
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp91
-rw-r--r--noncore/settings/aqpkg/ipkg.h3
2 files changed, 91 insertions, 3 deletions
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp
index 420863c..17efda9 100644
--- a/noncore/settings/aqpkg/ipkg.cpp
+++ b/noncore/settings/aqpkg/ipkg.cpp
@@ -138,17 +138,16 @@ void Ipkg :: runIpkg()
}
}
// Execute command
dependantPackages = new QList<QString>;
dependantPackages->setAutoDelete( true );
executeIpkgCommand( commands, option );
-
}
void Ipkg :: createSymLinks()
{
if ( option == "install" || option == "reinstall" || option == "upgrade" )
{
// If we are not removing packages and make links option is selected
// create the links
@@ -269,16 +268,74 @@ void Ipkg :: removeStatusEntry()
readFile.close();
writeFile.close();
// Remove old status file and put tmp stats file in its place
remove( statusFile );
rename( outStatusFile, statusFile );
}
+int Ipkg :: executeIpkgLinkCommand( QStringList *cmd )
+{
+ // If one is already running - should never be but just to be safe
+ if ( proc )
+ {
+ delete proc;
+ proc = 0;
+ }
+
+ // OK we're gonna use OProcess to run this thing
+ proc = new OProcess();
+ aborted = false;
+
+ // Connect up our slots
+ connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)),
+ this, SLOT( linkProcessFinished()));
+ connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)),
+ this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int)));
+
+ *proc << *cmd;
+
+ if(!proc->start(OProcess::NotifyOnExit, OProcess::All))
+ {
+ emit outputText( tr("Couldn't start ipkg-link process" ) );
+ }
+}
+
+void Ipkg::linkProcessFinished()
+{
+ // Report that the link process succeeded/failed
+
+ if ( error )
+ emit outputText( tr("Symbolic linking failed!\n") );
+ else
+ emit outputText( tr("Symbolic linking succeeded.\n") );
+
+ delete proc;
+ proc = 0;
+ finished = true;
+}
+
+void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen)
+{
+ QString lineStr = buffer;
+ if ( lineStr[buflen-1] == '\n' )
+ buflen --;
+ lineStr = lineStr.left( buflen );
+ emit outputText( lineStr );
+
+ if ( lineStr.find( " not found." ) != -1 )
+ {
+ // Capture ipkg-link errors
+ error = true;
+ }
+
+ buffer[0] = '\0';
+}
+
int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ )
{
// If one is already running - should never be but just to be safe
if ( proc )
{
delete proc;
proc = 0;
}
@@ -378,23 +435,50 @@ void Ipkg :: abort()
}
}
void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir )
{
if ( dest == "root" || dest == "/" )
return;
+ if( option == "remove" || option == "reinstall" || option == "upgrade" )
+ {
+ QStringList commands;
+
+ if ( runtimeDir != "" )
+ {
+ commands << "cd ";
+ commands << runtimeDir;
+ commands << ";";
+ }
+ commands << "ipkg-link" << "remove" << packFileName;
+ executeIpkgLinkCommand( &commands );
+ }
+
+ if( option == "install" || option == "reinstall" || option == "upgrade" )
+ {
+ QStringList commands;
+ if ( runtimeDir != "" )
+ {
+ commands << "cd ";
+ commands << runtimeDir;
+ commands << ";";
+ }
+ commands << "ipkg-link" << "add" << packFileName;
+ executeIpkgLinkCommand( &commands );
+ }
+/*
qApp->processEvents();
QStringList *fileList = getList( packFileName, destDir );
qApp->processEvents();
processFileList( fileList, destDir );
- delete fileList;
+ delete fileList;*/
}
-
+/*
QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir )
{
QString packageFileDir = destDir;
packageFileDir.append( "/usr/lib/ipkg/info/" );
packageFileDir.append( packageFilename );
packageFileDir.append( ".list" );
QFile f( packageFileDir );
@@ -514,8 +598,9 @@ void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const
{
text = ( rc ? tr( "Removed " ) : tr( "Failed to remove " ) ).arg( linkFile );
emit outputText( text );
}
}
}
}
}
+*/
diff --git a/noncore/settings/aqpkg/ipkg.h b/noncore/settings/aqpkg/ipkg.h
index e216d17..5df63f1 100644
--- a/noncore/settings/aqpkg/ipkg.h
+++ b/noncore/settings/aqpkg/ipkg.h
@@ -65,18 +65,20 @@ public:
void setFlags( int fl, int il ) { flags = fl; infoLevel = il; }
void setRuntimeDirectory( const char *dir ) { runtimeDir = dir; }
signals:
void outputText( const QString &text );
void ipkgFinished();
public slots:
+ void linkCommandStdout(Opie::Core::OProcess*, char *buffer, int buflen);
void commandStdout(Opie::Core::OProcess*, char *buffer, int buflen);
void commandStderr(Opie::Core::OProcess*, char *buffer, int buflen);
+ void linkProcessFinished();
void processFinished();
void abort();
private:
bool createLinks;
bool aborted;
bool error;
@@ -87,16 +89,17 @@ private:
QString runtimeDir;
Opie::Core::OProcess *proc;
int flags;
int infoLevel;
bool finished;
QList<QString> *dependantPackages;
+ int executeIpkgLinkCommand( QStringList *cmd );
int executeIpkgCommand( QStringList &cmd, const QString option );
void removeStatusEntry();
void linkPackage( const QString &packFileName, const QString &dest, const QString &destDir );
QStringList* getList( const QString &packageFilename, const QString &destDir );
void processFileList( const QStringList *fileList, const QString &destDir );
void processLinkDir( const QString &file, const QString &baseDir, const QString &destDir );
};