-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp index 17efda9..dd9e78d 100644 --- a/noncore/settings/aqpkg/ipkg.cpp +++ b/noncore/settings/aqpkg/ipkg.cpp | |||
@@ -205,331 +205,336 @@ void Ipkg :: removeStatusEntry() | |||
205 | tempstr.append( statusFile ); | 205 | tempstr.append( statusFile ); |
206 | emit outputText( tempstr ); | 206 | emit outputText( tempstr ); |
207 | return; | 207 | return; |
208 | } | 208 | } |
209 | 209 | ||
210 | if ( !writeFile.open( IO_WriteOnly ) ) | 210 | if ( !writeFile.open( IO_WriteOnly ) ) |
211 | { | 211 | { |
212 | tempstr = tr("Couldn't create tempory status file - "); | 212 | tempstr = tr("Couldn't create tempory status file - "); |
213 | tempstr.append( outStatusFile ); | 213 | tempstr.append( outStatusFile ); |
214 | emit outputText( tempstr ); | 214 | emit outputText( tempstr ); |
215 | return; | 215 | return; |
216 | } | 216 | } |
217 | 217 | ||
218 | int i = 0; | 218 | int i = 0; |
219 | 219 | ||
220 | QTextStream readStream( &readFile ); | 220 | QTextStream readStream( &readFile ); |
221 | QTextStream writeStream( &writeFile ); | 221 | QTextStream writeStream( &writeFile ); |
222 | QString line; | 222 | QString line; |
223 | 223 | ||
224 | char k[21]; | 224 | char k[21]; |
225 | char v[1001]; | 225 | char v[1001]; |
226 | QString key; | 226 | QString key; |
227 | QString value; | 227 | QString value; |
228 | 228 | ||
229 | while ( !readStream.atEnd() ) | 229 | while ( !readStream.atEnd() ) |
230 | { | 230 | { |
231 | //read new line | 231 | //read new line |
232 | line = readStream.readLine(); | 232 | line = readStream.readLine(); |
233 | 233 | ||
234 | if ( line.contains( ":", TRUE ) ) | 234 | if ( line.contains( ":", TRUE ) ) |
235 | { | 235 | { |
236 | //grep key and value from line | 236 | //grep key and value from line |
237 | k[0] = '\0'; | 237 | k[0] = '\0'; |
238 | v[0] = '\0'; | 238 | v[0] = '\0'; |
239 | sscanf( line, "%[^:]: %[^\n]", k, v ); | 239 | sscanf( line, "%[^:]: %[^\n]", k, v ); |
240 | key = k; | 240 | key = k; |
241 | value = v; | 241 | value = v; |
242 | key = key.stripWhiteSpace(); | 242 | key = key.stripWhiteSpace(); |
243 | value = value.stripWhiteSpace(); | 243 | value = value.stripWhiteSpace(); |
244 | } else { | 244 | } else { |
245 | key = ""; | 245 | key = ""; |
246 | value = ""; | 246 | value = ""; |
247 | } | 247 | } |
248 | 248 | ||
249 | if ( key == "Package" && value == package ) | 249 | if ( key == "Package" && value == package ) |
250 | { | 250 | { |
251 | //skip lines from the deleted package | 251 | //skip lines from the deleted package |
252 | while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) ) | 252 | while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) ) |
253 | { | 253 | { |
254 | line = readStream.readLine(); | 254 | line = readStream.readLine(); |
255 | } | 255 | } |
256 | } else { | 256 | } else { |
257 | 257 | ||
258 | //write other lines into the tempfile | 258 | //write other lines into the tempfile |
259 | writeStream << line << "\n"; | 259 | writeStream << line << "\n"; |
260 | 260 | ||
261 | // Improve UI responsiveness | 261 | // Improve UI responsiveness |
262 | i++; | 262 | i++; |
263 | if ( ( i % 50 ) == 0 ) | 263 | if ( ( i % 50 ) == 0 ) |
264 | qApp->processEvents(); | 264 | qApp->processEvents(); |
265 | } | 265 | } |
266 | } | 266 | } |
267 | 267 | ||
268 | readFile.close(); | 268 | readFile.close(); |
269 | writeFile.close(); | 269 | writeFile.close(); |
270 | 270 | ||
271 | // Remove old status file and put tmp stats file in its place | 271 | // Remove old status file and put tmp stats file in its place |
272 | remove( statusFile ); | 272 | remove( statusFile ); |
273 | rename( outStatusFile, statusFile ); | 273 | rename( outStatusFile, statusFile ); |
274 | } | 274 | } |
275 | 275 | ||
276 | int Ipkg :: executeIpkgLinkCommand( QStringList *cmd ) | 276 | int Ipkg :: executeIpkgLinkCommand( QStringList *cmd ) |
277 | { | 277 | { |
278 | // If one is already running - should never be but just to be safe | 278 | // If one is already running - should never be but just to be safe |
279 | if ( proc ) | 279 | if ( proc ) |
280 | { | 280 | { |
281 | delete proc; | 281 | delete proc; |
282 | proc = 0; | 282 | proc = 0; |
283 | } | 283 | } |
284 | 284 | ||
285 | // OK we're gonna use OProcess to run this thing | 285 | // OK we're gonna use OProcess to run this thing |
286 | proc = new OProcess(); | 286 | proc = new OProcess(); |
287 | aborted = false; | 287 | aborted = false; |
288 | 288 | ||
289 | // Connect up our slots | 289 | // Connect up our slots |
290 | connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), | 290 | connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), |
291 | this, SLOT( linkProcessFinished())); | 291 | this, SLOT( linkProcessFinished())); |
292 | connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), | 292 | connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), |
293 | this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int))); | 293 | this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int))); |
294 | 294 | ||
295 | *proc << *cmd; | 295 | *proc << *cmd; |
296 | 296 | ||
297 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) | 297 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) |
298 | { | 298 | { |
299 | emit outputText( tr("Couldn't start ipkg-link process" ) ); | 299 | emit outputText( tr("Couldn't start ipkg-link process" ) ); |
300 | } | 300 | } |
301 | |||
302 | return 0; | ||
301 | } | 303 | } |
302 | 304 | ||
303 | void Ipkg::linkProcessFinished() | 305 | void Ipkg::linkProcessFinished() |
304 | { | 306 | { |
305 | // Report that the link process succeeded/failed | 307 | // Report that the link process succeeded/failed |
306 | 308 | ||
307 | if ( error ) | 309 | if ( error ) |
308 | emit outputText( tr("Symbolic linking failed!\n") ); | 310 | emit outputText( tr("Symbolic linking failed!\n") ); |
309 | else | 311 | else |
310 | emit outputText( tr("Symbolic linking succeeded.\n") ); | 312 | emit outputText( tr("Symbolic linking succeeded.\n") ); |
311 | 313 | ||
312 | delete proc; | 314 | delete proc; |
313 | proc = 0; | 315 | proc = 0; |
314 | finished = true; | 316 | finished = true; |
315 | } | 317 | } |
316 | 318 | ||
317 | void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen) | 319 | void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen) |
318 | { | 320 | { |
319 | QString lineStr = buffer; | 321 | QString lineStr = buffer; |
320 | if ( lineStr[buflen-1] == '\n' ) | 322 | if ( lineStr[buflen-1] == '\n' ) |
321 | buflen --; | 323 | buflen --; |
322 | lineStr = lineStr.left( buflen ); | 324 | lineStr = lineStr.left( buflen ); |
323 | emit outputText( lineStr ); | 325 | emit outputText( lineStr ); |
324 | 326 | ||
325 | if ( lineStr.find( " not found." ) != -1 ) | 327 | if ( lineStr.find( " not found." ) != -1 ) |
326 | { | 328 | { |
327 | // Capture ipkg-link errors | 329 | // Capture ipkg-link errors |
328 | error = true; | 330 | error = true; |
329 | } | 331 | } |
330 | 332 | ||
331 | buffer[0] = '\0'; | 333 | buffer[0] = '\0'; |
332 | } | 334 | } |
333 | 335 | ||
334 | int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) | 336 | int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) |
335 | { | 337 | { |
336 | // If one is already running - should never be but just to be safe | 338 | // If one is already running - should never be but just to be safe |
337 | if ( proc ) | 339 | if ( proc ) |
338 | { | 340 | { |
339 | delete proc; | 341 | delete proc; |
340 | proc = 0; | 342 | proc = 0; |
341 | } | 343 | } |
342 | 344 | ||
343 | // OK we're gonna use OProcess to run this thing | 345 | // OK we're gonna use OProcess to run this thing |
344 | proc = new OProcess(); | 346 | proc = new OProcess(); |
345 | aborted = false; | 347 | aborted = false; |
346 | 348 | ||
347 | 349 | ||
348 | // Connect up our slots | 350 | // Connect up our slots |
349 | connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), | 351 | connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), |
350 | this, SLOT( processFinished())); | 352 | this, SLOT( processFinished())); |
351 | 353 | ||
352 | connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), | 354 | connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), |
353 | this, SLOT(commandStdout(Opie::Core::OProcess*,char*,int))); | 355 | this, SLOT(commandStdout(Opie::Core::OProcess*,char*,int))); |
354 | 356 | ||
355 | connect(proc, SIGNAL(receivedStderr(Opie::Core::OProcess*,char*,int)), | 357 | connect(proc, SIGNAL(receivedStderr(Opie::Core::OProcess*,char*,int)), |
356 | this, SLOT(commandStderr(Opie::Core::OProcess*,char*,int))); | 358 | this, SLOT(commandStderr(Opie::Core::OProcess*,char*,int))); |
357 | 359 | ||
358 | for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it ) | 360 | for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it ) |
359 | { | 361 | { |
360 | *proc << (*it).latin1(); | 362 | *proc << (*it).latin1(); |
361 | } | 363 | } |
362 | 364 | ||
363 | // Start the process going | 365 | // Start the process going |
364 | finished = false; | 366 | finished = false; |
365 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) | 367 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) |
366 | { | 368 | { |
367 | emit outputText( tr("Couldn't start ipkg process" ) ); | 369 | emit outputText( tr("Couldn't start ipkg process" ) ); |
368 | } | 370 | } |
371 | |||
372 | return 0; | ||
369 | } | 373 | } |
370 | 374 | ||
371 | void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) | 375 | void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) |
372 | { | 376 | { |
373 | QString lineStr = buffer; | 377 | QString lineStr = buffer; |
374 | if ( lineStr[buflen-1] == '\n' ) | 378 | if ( lineStr[buflen-1] == '\n' ) |
375 | buflen --; | 379 | buflen --; |
376 | lineStr = lineStr.left( buflen ); | 380 | lineStr = lineStr.left( buflen ); |
377 | emit outputText( lineStr ); | 381 | emit outputText( lineStr ); |
378 | 382 | ||
379 | // check if we are installing dependant packages | 383 | // check if we are installing dependant packages |
380 | if ( option == "install" || option == "reinstall" ) | 384 | if ( option == "install" || option == "reinstall" ) |
381 | { | 385 | { |
382 | // Need to keep track of any dependant packages that get installed | 386 | // Need to keep track of any dependant packages that get installed |
383 | // so that we can create links to them as necessary | 387 | // so that we can create links to them as necessary |
384 | if ( lineStr.startsWith( "Installing " ) ) | 388 | if ( lineStr.startsWith( "Installing " ) ) |
385 | { | 389 | { |
386 | int start = lineStr.find( " " ) + 1; | 390 | int start = lineStr.find( " " ) + 1; |
387 | int end = lineStr.find( " ", start ); | 391 | int end = lineStr.find( " ", start ); |
388 | QString *package = new QString( lineStr.mid( start, end-start ) ); | 392 | QString *package = new QString( lineStr.mid( start, end-start ) ); |
389 | dependantPackages->append( package ); | 393 | dependantPackages->append( package ); |
390 | } | 394 | } |
391 | } | 395 | } |
392 | else if ( option == "remove" && !( flags & FORCE_DEPENDS ) && | 396 | else if ( option == "remove" && !( flags & FORCE_DEPENDS ) && |
393 | lineStr.find( "is depended upon by packages:" ) != -1 ) | 397 | lineStr.find( "is depended upon by packages:" ) != -1 ) |
394 | { | 398 | { |
395 | // Ipkg should send this to STDERR, but doesn't - so trap here | 399 | // Ipkg should send this to STDERR, but doesn't - so trap here |
396 | error = true; | 400 | error = true; |
397 | } | 401 | } |
398 | 402 | ||
399 | buffer[0] = '\0'; | 403 | buffer[0] = '\0'; |
400 | } | 404 | } |
401 | 405 | ||
402 | void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) | 406 | void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) |
403 | { | 407 | { |
404 | QString lineStr = buffer; | 408 | QString lineStr = buffer; |
405 | if ( lineStr[buflen-1] == '\n' ) | 409 | if ( lineStr[buflen-1] == '\n' ) |
406 | buflen --; | 410 | buflen --; |
407 | lineStr=lineStr.left( buflen ); | 411 | lineStr=lineStr.left( buflen ); |
408 | emit outputText( lineStr ); | 412 | emit outputText( lineStr ); |
409 | buffer[0] = '\0'; | 413 | buffer[0] = '\0'; |
410 | error = true; | 414 | error = true; |
411 | } | 415 | } |
412 | 416 | ||
413 | void Ipkg::processFinished() | 417 | void Ipkg::processFinished() |
414 | { | 418 | { |
415 | // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file | 419 | // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file |
416 | // to workaround an ipkg bug which stops reinstall to a different location | 420 | // to workaround an ipkg bug which stops reinstall to a different location |
417 | 421 | ||
418 | if ( !error && option == "remove" ) | 422 | if ( !error && option == "remove" ) |
419 | removeStatusEntry(); | 423 | removeStatusEntry(); |
420 | 424 | ||
421 | delete proc; | 425 | delete proc; |
422 | proc = 0; | 426 | proc = 0; |
423 | finished = true; | 427 | finished = true; |
424 | 428 | ||
425 | emit ipkgFinished(); | 429 | emit ipkgFinished(); |
426 | } | 430 | } |
427 | 431 | ||
428 | 432 | ||
429 | void Ipkg :: abort() | 433 | void Ipkg :: abort() |
430 | { | 434 | { |
431 | if ( proc ) | 435 | if ( proc ) |
432 | { | 436 | { |
433 | proc->kill(); | 437 | proc->kill(); |
434 | aborted = true; | 438 | aborted = true; |
435 | } | 439 | } |
436 | } | 440 | } |
437 | 441 | ||
438 | void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) | 442 | void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) |
439 | { | 443 | { |
444 | Q_CONST_UNUSED( destDir ) | ||
440 | if ( dest == "root" || dest == "/" ) | 445 | if ( dest == "root" || dest == "/" ) |
441 | return; | 446 | return; |
442 | 447 | ||
443 | if( option == "remove" || option == "reinstall" || option == "upgrade" ) | 448 | if( option == "remove" || option == "reinstall" || option == "upgrade" ) |
444 | { | 449 | { |
445 | QStringList commands; | 450 | QStringList commands; |
446 | 451 | ||
447 | if ( runtimeDir != "" ) | 452 | if ( runtimeDir != "" ) |
448 | { | 453 | { |
449 | commands << "cd "; | 454 | commands << "cd "; |
450 | commands << runtimeDir; | 455 | commands << runtimeDir; |
451 | commands << ";"; | 456 | commands << ";"; |
452 | } | 457 | } |
453 | commands << "ipkg-link" << "remove" << packFileName; | 458 | commands << "ipkg-link" << "remove" << packFileName; |
454 | executeIpkgLinkCommand( &commands ); | 459 | executeIpkgLinkCommand( &commands ); |
455 | } | 460 | } |
456 | 461 | ||
457 | if( option == "install" || option == "reinstall" || option == "upgrade" ) | 462 | if( option == "install" || option == "reinstall" || option == "upgrade" ) |
458 | { | 463 | { |
459 | QStringList commands; | 464 | QStringList commands; |
460 | if ( runtimeDir != "" ) | 465 | if ( runtimeDir != "" ) |
461 | { | 466 | { |
462 | commands << "cd "; | 467 | commands << "cd "; |
463 | commands << runtimeDir; | 468 | commands << runtimeDir; |
464 | commands << ";"; | 469 | commands << ";"; |
465 | } | 470 | } |
466 | commands << "ipkg-link" << "add" << packFileName; | 471 | commands << "ipkg-link" << "add" << packFileName; |
467 | executeIpkgLinkCommand( &commands ); | 472 | executeIpkgLinkCommand( &commands ); |
468 | } | 473 | } |
469 | /* | 474 | /* |
470 | qApp->processEvents(); | 475 | qApp->processEvents(); |
471 | QStringList *fileList = getList( packFileName, destDir ); | 476 | QStringList *fileList = getList( packFileName, destDir ); |
472 | qApp->processEvents(); | 477 | qApp->processEvents(); |
473 | processFileList( fileList, destDir ); | 478 | processFileList( fileList, destDir ); |
474 | delete fileList;*/ | 479 | delete fileList;*/ |
475 | } | 480 | } |
476 | /* | 481 | /* |
477 | QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) | 482 | QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) |
478 | { | 483 | { |
479 | QString packageFileDir = destDir; | 484 | QString packageFileDir = destDir; |
480 | packageFileDir.append( "/usr/lib/ipkg/info/" ); | 485 | packageFileDir.append( "/usr/lib/ipkg/info/" ); |
481 | packageFileDir.append( packageFilename ); | 486 | packageFileDir.append( packageFilename ); |
482 | packageFileDir.append( ".list" ); | 487 | packageFileDir.append( ".list" ); |
483 | QFile f( packageFileDir ); | 488 | QFile f( packageFileDir ); |
484 | 489 | ||
485 | if ( !f.open(IO_ReadOnly) ) | 490 | if ( !f.open(IO_ReadOnly) ) |
486 | { | 491 | { |
487 | // Couldn't open from dest, try from / | 492 | // Couldn't open from dest, try from / |
488 | f.close(); | 493 | f.close(); |
489 | 494 | ||
490 | packageFileDir = "/usr/lib/ipkg/info/"; | 495 | packageFileDir = "/usr/lib/ipkg/info/"; |
491 | packageFileDir.append( packageFilename ); | 496 | packageFileDir.append( packageFilename ); |
492 | packageFileDir.append( ".list" ); | 497 | packageFileDir.append( ".list" ); |
493 | f.setName( packageFileDir ); | 498 | f.setName( packageFileDir ); |
494 | if ( ! f.open(IO_ReadOnly) ) | 499 | if ( ! f.open(IO_ReadOnly) ) |
495 | { | 500 | { |
496 | QString tempstr = tr("Could not open :"); | 501 | QString tempstr = tr("Could not open :"); |
497 | tempstr.append( packageFileDir ); | 502 | tempstr.append( packageFileDir ); |
498 | emit outputText( tempstr ); | 503 | emit outputText( tempstr ); |
499 | return (QStringList*)0; | 504 | return (QStringList*)0; |
500 | } | 505 | } |
501 | } | 506 | } |
502 | QStringList *fileList = new QStringList(); | 507 | QStringList *fileList = new QStringList(); |
503 | QTextStream t( &f ); | 508 | QTextStream t( &f ); |
504 | while ( !t.eof() ) | 509 | while ( !t.eof() ) |
505 | *fileList += t.readLine(); | 510 | *fileList += t.readLine(); |
506 | 511 | ||
507 | f.close(); | 512 | f.close(); |
508 | return fileList; | 513 | return fileList; |
509 | } | 514 | } |
510 | 515 | ||
511 | void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) | 516 | void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) |
512 | { | 517 | { |
513 | if ( !fileList || fileList->isEmpty() ) | 518 | if ( !fileList || fileList->isEmpty() ) |
514 | return; | 519 | return; |
515 | 520 | ||
516 | QString baseDir = ROOT; | 521 | QString baseDir = ROOT; |
517 | 522 | ||
518 | if ( createLinks == true ) | 523 | if ( createLinks == true ) |
519 | { | 524 | { |
520 | for ( uint i=0; i < fileList->count(); i++ ) | 525 | for ( uint i=0; i < fileList->count(); i++ ) |
521 | { | 526 | { |
522 | processLinkDir( (*fileList)[i], baseDir, destDir ); | 527 | processLinkDir( (*fileList)[i], baseDir, destDir ); |
523 | qApp->processEvents(); | 528 | qApp->processEvents(); |
524 | } | 529 | } |
525 | } | 530 | } |
526 | else | 531 | else |
527 | { | 532 | { |
528 | for ( int i = fileList->count()-1; i >= 0 ; i-- ) | 533 | for ( int i = fileList->count()-1; i >= 0 ; i-- ) |
529 | { | 534 | { |
530 | processLinkDir( (*fileList)[i], baseDir, destDir ); | 535 | processLinkDir( (*fileList)[i], baseDir, destDir ); |
531 | qApp->processEvents(); | 536 | qApp->processEvents(); |
532 | } | 537 | } |
533 | } | 538 | } |
534 | } | 539 | } |
535 | 540 | ||