summaryrefslogtreecommitdiff
path: root/noncore
Side-by-side diff
Diffstat (limited to 'noncore') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp82
-rw-r--r--noncore/settings/aqpkg/ipkg.h1
2 files changed, 81 insertions, 2 deletions
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp
index c762633..452eca3 100644
--- a/noncore/settings/aqpkg/ipkg.cpp
+++ b/noncore/settings/aqpkg/ipkg.cpp
@@ -51,36 +51,40 @@ Ipkg :: ~Ipkg()
// flags is the ipkg options flags
// dir is the directory to run ipkg in (defaults to "")
bool Ipkg :: runIpkg( )
{
bool ret = false;
QDir::setCurrent( "/tmp" );
QString cmd = "";
if ( runtimeDir != "" )
{
cmd += "cd ";
cmd += runtimeDir;
cmd += " ; ";
}
cmd += "ipkg -force-defaults";
- if ( option != "update" && option != "download" )
- {
+
+ // only set the destination for an install operation
+ if ( option == "install" )
cmd += " -dest "+ destination;
+
+ if ( option != "update" && option != "download" )
+ {
if ( flags & FORCE_DEPENDS )
cmd += " -force-depends";
if ( flags & FORCE_REINSTALL )
cmd += " -force-reinstall";
if ( flags & FORCE_REMOVE )
cmd += " -force-removal-of-essential-packages";
if ( flags & FORCE_OVERWRITE )
cmd += " -force-overwrite";
// Handle make links
// Rules - If make links is switched on, create links to root
// if destDir is NOT /
if ( flags & MAKE_LINKS )
{
// If destDir == / turn off make links as package is being insalled
// to root already.
@@ -143,39 +147,113 @@ bool Ipkg :: runIpkg( )
linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
// link dependant packages that were installed with this release
QString *pkg;
for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() )
{
if ( *pkg == package )
continue;
emit outputText( " " );
emit outputText( QString( "Creating symbolic links for " )+ (*pkg) );
linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir );
}
}
}
delete dependantPackages;
+
+ // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file
+ // to workaround an ipkg bug which stops reinstall to a different location
+ if ( option == "remove" )
+ removeStatusEntry();
+
// emit outputText( QString( "Finished - status=" ) + (ret ? "success" : "failure") );
emit outputText( "Finished" );
emit outputText( "" );
return ret;
}
+void Ipkg :: removeStatusEntry()
+{
+ QString statusFile = destDir;
+ if ( statusFile.right( 1 ) != "/" )
+ statusFile += "/";
+ statusFile += "usr/lib/ipkg/status";
+ QString outStatusFile = statusFile + ".tmp";
+
+ emit outputText( "" );
+ emit outputText( "Removing status entry..." );
+ emit outputText( QString( "status file - " )+ statusFile );
+ emit outputText( QString( "package - " )+ package );
+
+ ifstream in( statusFile );
+ ofstream out( outStatusFile );
+ if ( !in.is_open() )
+ {
+ emit outputText( QString( "Couldn't open status file - " )+ statusFile );
+ return;
+ }
+
+ if ( !out.is_open() )
+ {
+ emit outputText( QString( "Couldn't create tempory status file - " )+ outStatusFile );
+ return;
+ }
+
+ char line[1001];
+ char k[21];
+ char v[1001];
+ QString key;
+ QString value;
+ do
+ {
+ in.getline( line, 1000 );
+ if ( in.eof() )
+ continue;
+
+ k[0] = '\0';
+ v[0] = '\0';
+
+ sscanf( line, "%[^:]: %[^\n]", k, v );
+ key = k;
+ value = v;
+ key = key.stripWhiteSpace();
+ value = value.stripWhiteSpace();
+ if ( key == "Package" && value == package )
+ {
+ // Ignore all lines up to next empty
+ do
+ {
+ in.getline( line, 1000 );
+ if ( in.eof() || QString( line ).stripWhiteSpace() == "" )
+ continue;
+ } while ( !in.eof() && QString( line ).stripWhiteSpace() != "" );
+ }
+
+ out << line << endl;
+ } while ( !in.eof() );
+
+ in.close();
+ out.close();
+
+ // Remove old status file and put tmp stats file in its place
+ remove( statusFile );
+ rename( outStatusFile, statusFile );
+}
+
int Ipkg :: executeIpkgCommand( QString &cmd, const QString option )
{
FILE *fp = NULL;
char line[130];
QString lineStr, lineStrOld;
int ret = false;
fp = popen( (const char *) cmd, "r");
if ( fp == NULL )
{
cout << "Couldn't execute " << cmd << "! err = " << fp << endl;
QString text;
text.sprintf( "Couldn't execute %s! See stdout for error code", (const char *)cmd );
emit outputText( text );
}
diff --git a/noncore/settings/aqpkg/ipkg.h b/noncore/settings/aqpkg/ipkg.h
index 63588c4..55e9ff4 100644
--- a/noncore/settings/aqpkg/ipkg.h
+++ b/noncore/settings/aqpkg/ipkg.h
@@ -50,23 +50,24 @@ public:
signals:
void outputText( const QString &text );
private:
bool createLinks;
QString option;
QString package;
QString destination;
QString destDir;
int flags;
QString runtimeDir;
QList<QString> *dependantPackages;
int executeIpkgCommand( QString &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 );
};
#endif