summaryrefslogtreecommitdiff
path: root/core/launcher/packageslave.cpp
Unidiff
Diffstat (limited to 'core/launcher/packageslave.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/packageslave.cpp48
1 files changed, 28 insertions, 20 deletions
diff --git a/core/launcher/packageslave.cpp b/core/launcher/packageslave.cpp
index abbc610..965020e 100644
--- a/core/launcher/packageslave.cpp
+++ b/core/launcher/packageslave.cpp
@@ -169,122 +169,130 @@ void PackageHandler::addPackageFiles( const QString &location,
169 s = ts.readLine(); // line of text excluding '\n' 169 s = ts.readLine(); // line of text excluding '\n'
170 // for s, do link/mkdir. 170 // for s, do link/mkdir.
171 if ( s.right(1) == "/" ) { 171 if ( s.right(1) == "/" ) {
172 odebug << "do mkdir for " << s.ascii() << "" << oendl; 172 odebug << "do mkdir for " << s.ascii() << "" << oendl;
173#ifndef Q_OS_WIN32 173#ifndef Q_OS_WIN32
174 mkdir( s.ascii(), 0777 ); 174 mkdir( s.ascii(), 0777 );
175 //possible optimization: symlink directories 175 //possible optimization: symlink directories
176 //that don't exist already. -- Risky. 176 //that don't exist already. -- Risky.
177#else 177#else
178 d.mkdir( s.ascii()); 178 d.mkdir( s.ascii());
179#endif 179#endif
180 180
181 } else { 181 } else {
182#ifndef Q_OS_WIN32 182#ifndef Q_OS_WIN32
183 odebug << "do symlink for " << s.ascii() << "" << oendl; 183 odebug << "do symlink for " << s.ascii() << "" << oendl;
184 symlink( (location + s).ascii(), s.ascii() ); 184 symlink( (location + s).ascii(), s.ascii() );
185#else 185#else
186 odebug << "Copy file instead of a symlink for WIN32" << oendl; 186 odebug << "Copy file instead of a symlink for WIN32" << oendl;
187 if (!CopyFile((TCHAR*)qt_winTchar((location + s), TRUE), (TCHAR*)qt_winTchar(s, TRUE), FALSE)) 187 if (!CopyFile((TCHAR*)qt_winTchar((location + s), TRUE), (TCHAR*)qt_winTchar(s, TRUE), FALSE))
188 owarn << "Unable to create symlinkfor " << (location + s).ascii() << oendl; 188 owarn << "Unable to create symlinkfor " << (location + s).ascii() << oendl;
189#endif 189#endif
190 } 190 }
191 } 191 }
192 f.close(); 192 f.close();
193 } 193 }
194} 194}
195 195
196void PackageHandler::addPackages( const QString &location ) 196void PackageHandler::addPackages( const QString &location )
197{ 197{
198 // get list of *.list in location/usr/lib/ipkg/info/*.list 198 // get list of *.list in location/usr/lib/ipkg/info/*.list
199 QDir dir(location + "/usr/lib/ipkg/info", "*.list", // No tr 199 QDir dir(location + "/usr/lib/ipkg/info", "*.list", // No tr
200 QDir::Name, QDir::Files); 200 QDir::Name, QDir::Files);
201 if ( !dir.exists() ) 201 if ( !dir.exists() )
202 return; 202 return;
203 203
204 QStringList packages = dir.entryList(); 204 QStringList packages = dir.entryList();
205 for ( QStringList::Iterator it = packages.begin(); 205 for ( QStringList::Iterator it = packages.begin();
206 it != packages.end(); ++it ) { 206 it != packages.end(); ++it ) {
207 addPackageFiles( location, *it ); 207 addPackageFiles( location, *it );
208 } 208 }
209} 209}
210 210
211 211
212void PackageHandler::cleanupPackageFiles( const QString &listfile ) 212void PackageHandler::cleanupPackageFiles( const QString &listfile )
213{ 213{
214 QFile f(listfile); 214 QFile f(listfile);
215 215
216 if ( f.open(IO_ReadOnly) ) { 216 if ( f.open(IO_ReadOnly) ) {
217 QTextStream ts(&f); 217 QTextStream ts(&f);
218 218
219 QString s; 219 QString s;
220 while ( !ts.eof() ) { // until end of file... 220 while ( !ts.eof() ) { // until end of file...
221 s = ts.readLine(); // line of text excluding '\n' 221 s = ts.readLine(); // line of text excluding '\n'
222 // for s, do link/mkdir. 222 // for s, do link/mkdir.
223 if ( s.right(1) == "/" ) { 223 // @todo Right now we just move on if the name of the file we
224 //should rmdir if empty, after all files have been removed 224 // find is actually a directory. What we ought to do is check
225 } else { 225 // to see if the directory is empty and if so remove it.
226 if ( s.right(1) != "/" ) {
226#ifndef Q_OS_WIN32 227#ifndef Q_OS_WIN32
227 odebug << "remove symlink for " << s.ascii() << "" << oendl; 228 odebug << "remove symlink for " << s << oendl;
228 //check if it is a symlink first (don't remove /etc/passwd...) 229 QFile symFile(s);
229 char buf[10]; //we don't care about the contents 230 QFileInfo symFileInfo(symFile);
230 if ( ::readlink( s.ascii(),buf, 10 >= 0 ) ) 231 //check if it is a symlink first (don't remove /etc/passwd...)
231 ::unlink( s.ascii() ); 232 if ( !symFileInfo.readLink().isNull())
233 if (!symFile.remove())
234 owarn << "Unable to remove symlink " << symFile.name()
235 << " " << __FILE__ << ":" << __LINE__ << oendl;
232#else 236#else
233 // ### revise 237 // @todo If we actually want to be portable to other operating
234 owarn << "Unable to remove symlink " << __FILE__ << ":" << __LINE__ << "" << oendl; 238 // systems we ought to at least have a portable way of removing
239 // their notion of symlinks.
240 owarn << "Unable to remove symlink " << s " " << __FILE__
241 << ":" << __LINE__ << oendl;
235#endif 242#endif
243 }
236 } 244 }
237 } 245 f.close();
238 f.close();
239 246
240 //remove the list file 247 //remove the list file
241 ::unlink( listfile.ascii() ); 248 if (!f.remove())
242 249 owarn << "Unable to remove list file " << f.name() << " "
250 << __FILE__ << ":" << __LINE__ << oendl;
243 } 251 }
244} 252}
245 253
246void PackageHandler::cleanupPackages( const QString &location ) 254void PackageHandler::cleanupPackages( const QString &location )
247{ 255{
248 // get list of *.list in location/usr/lib/ipkg/info/*.list 256 // get list of *.list in location/usr/lib/ipkg/info/*.list
249 QDir dir( "/usr/lib/ipkg/info/"+location, "*.list", // No tr 257 QDir dir( "/usr/lib/ipkg/info/"+location, "*.list", // No tr
250 QDir::Name, QDir::Files); 258 QDir::Name, QDir::Files);
251 if ( !dir.exists() ) 259 if ( !dir.exists() )
252 return; 260 return;
253 261
254 QStringList packages = dir.entryList(); 262 QStringList packages = dir.entryList();
255 for ( QStringList::Iterator it = packages.begin(); 263 for ( QStringList::Iterator it = packages.begin();
256 it != packages.end(); ++it ) { 264 it != packages.end(); ++it ) {
257 cleanupPackageFiles( *it ); 265 cleanupPackageFiles( *it );
258 } 266 }
259 267
260 //remove the backup directory 268 //remove the backup directory
261 //### 269 //###
262} 270}
263 271
264void PackageHandler::prepareInstall( const QString& size, const QString& path ) 272void PackageHandler::prepareInstall( const QString& size, const QString& path )
265{ 273{
266 // Check whether there will be enough space to install the next package. 274 // Check whether there will be enough space to install the next package.
267 bool ok; 275 bool ok;
268 unsigned int s = size.toUInt( &ok ); 276 unsigned int s = size.toUInt( &ok );
269 277
270 if ( !ok ) 278 if ( !ok )
271 return; 279 return;
272 280
273 // Shamelessly stolen from the sysinfo application (Werner) 281 // Shamelessly stolen from the sysinfo application (Werner)
274#if defined(_OS_LINUX_) || defined(Q_OS_LINUX) 282#if defined(_OS_LINUX_) || defined(Q_OS_LINUX)
275 struct statfs fs; 283 struct statfs fs;
276 if ( statfs( path.latin1(), &fs ) == 0 ) 284 if ( statfs( path.latin1(), &fs ) == 0 )
277 if ( s > fs.f_bsize * fs.f_bavail ) { 285 if ( s > fs.f_bsize * fs.f_bavail ) {
278 //odebug << "############### Not enough space left ###############" << oendl; 286 //odebug << "############### Not enough space left ###############" << oendl;
279 mNoSpaceLeft = TRUE; 287 mNoSpaceLeft = TRUE;
280 } 288 }
281#endif 289#endif
282} 290}
283 291
284void PackageHandler::iProcessExited() 292void PackageHandler::iProcessExited()
285{ 293{
286 if ( currentProcess->normalExit() && currentProcess->exitStatus() == 0 ) 294 if ( currentProcess->normalExit() && currentProcess->exitStatus() == 0 )
287 sendReply( "installDone(QString)", currentPackage ); 295 sendReply( "installDone(QString)", currentPackage );
288 else { 296 else {
289#ifndef QT_NO_COP 297#ifndef QT_NO_COP
290 QCopEnvelope e( "QPE/Desktop", "installFailed(QString,int,QString)" ); 298 QCopEnvelope e( "QPE/Desktop", "installFailed(QString,int,QString)" );