summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2004-08-08 12:30:41 (UTC)
committer zautrix <zautrix>2004-08-08 12:30:41 (UTC)
commit75138e84a2271f8929478853151a6ed4a73fb2cc (patch) (unidiff)
tree804b3277bf2e4c4e371611677481803f527bf90e
parent4cc869512488b72304c7cbb5526c6f4cc957e677 (diff)
downloadkdepimpi-75138e84a2271f8929478853151a6ed4a73fb2cc.zip
kdepimpi-75138e84a2271f8929478853151a6ed4a73fb2cc.tar.gz
kdepimpi-75138e84a2271f8929478853151a6ed4a73fb2cc.tar.bz2
Fixed kdirwatch
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--microkde/kio/kio/kdirwatch.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/microkde/kio/kio/kdirwatch.cpp b/microkde/kio/kio/kdirwatch.cpp
index 98d24e0..1596d1f 100644
--- a/microkde/kio/kio/kdirwatch.cpp
+++ b/microkde/kio/kio/kdirwatch.cpp
@@ -502,193 +502,194 @@ bool KDirWatchPrivate::useDNotify(Entry* e)
502 else { // File 502 else { // File
503 // we always watch the directory (DNOTIFY can't watch files alone) 503 // we always watch the directory (DNOTIFY can't watch files alone)
504 // this notifies us about changes of files therein 504 // this notifies us about changes of files therein
505 addEntry(0, QFileInfo(e->path).dirPath(true), e, true); 505 addEntry(0, QFileInfo(e->path).dirPath(true), e, true);
506 } 506 }
507 507
508 return true; 508 return true;
509} 509}
510#endif 510#endif
511 511
512 512
513bool KDirWatchPrivate::useStat(Entry* e) 513bool KDirWatchPrivate::useStat(Entry* e)
514{ 514{
515//US we have no KIO::probably_slow_mounted. So disable this part 515//US we have no KIO::probably_slow_mounted. So disable this part
516//US if (KIO::probably_slow_mounted(e->path)) 516//US if (KIO::probably_slow_mounted(e->path))
517//US useFreq(e, m_nfsPollInterval); 517//US useFreq(e, m_nfsPollInterval);
518//US else 518//US else
519 useFreq(e, m_PollInterval); 519 useFreq(e, m_PollInterval);
520 520
521 if (e->m_mode != StatMode) { 521 if (e->m_mode != StatMode) {
522 e->m_mode = StatMode; 522 e->m_mode = StatMode;
523 statEntries++; 523 statEntries++;
524 524
525 if ( statEntries == 1 ) { 525 if ( statEntries == 1 ) {
526 // if this was first STAT entry (=timer was stopped) 526 // if this was first STAT entry (=timer was stopped)
527 timer->start(freq); // then start the timer 527 timer->start(freq); // then start the timer
528 kdDebug(7001) << " Started Polling Timer, freq " << freq << endl; 528 kdDebug(7001) << " Started Polling Timer, freq " << freq << endl;
529 } 529 }
530 } 530 }
531 531
532 kdDebug(7001) << " Setup Stat (freq " << e->freq 532 kdDebug(7001) << " Setup Stat (freq " << e->freq
533 << ") for " << e->path << endl; 533 << ") for " << e->path << endl;
534 534
535 return true; 535 return true;
536} 536}
537 537
538 538
539/* If <instance> !=0, this KDirWatch instance wants to watch at <_path>, 539/* If <instance> !=0, this KDirWatch instance wants to watch at <_path>,
540 * providing in <isDir> the type of the entry to be watched. 540 * providing in <isDir> the type of the entry to be watched.
541 * Sometimes, entries are dependant on each other: if <sub_entry> !=0, 541 * Sometimes, entries are dependant on each other: if <sub_entry> !=0,
542 * this entry needs another entry to watch himself (when notExistent). 542 * this entry needs another entry to watch himself (when notExistent).
543 */ 543 */
544void KDirWatchPrivate::addEntry(KDirWatch* instance, const QString& _path, 544void KDirWatchPrivate::addEntry(KDirWatch* instance, const QString& _path,
545 Entry* sub_entry, bool isDir) 545 Entry* sub_entry, bool isDir)
546{ 546{
547 QString path = _path; 547 QString path = _path;
548 if (path.startsWith("/dev/") || (path == "/dev")) 548 if (path.startsWith("/dev/") || (path == "/dev"))
549 return; // Don't even go there. 549 return; // Don't even go there.
550 550
551 if ( path.length() > 1 && path.right(1) == "/" ) 551 if ( path.length() > 1 && path.right(1) == "/" )
552 path.truncate( path.length() - 1 ); 552 path.truncate( path.length() - 1 );
553 553
554 EntryMap::Iterator it = m_mapEntries.find( path ); 554 EntryMap::Iterator it = m_mapEntries.find( path );
555 if ( it != m_mapEntries.end() ) 555 if ( it != m_mapEntries.end() )
556 { 556 {
557 if (sub_entry) { 557 if (sub_entry) {
558 (*it).m_entries.append(sub_entry); 558 (*it).m_entries.append(sub_entry);
559 kdDebug(7001) << "Added already watched Entry " << path 559 kdDebug(7001) << "Added already watched Entry " << path
560 << " (for " << sub_entry->path << ")" << endl; 560 << " (for " << sub_entry->path << ")" << endl;
561#ifdef HAVE_DNOTIFY 561#ifdef HAVE_DNOTIFY
562 Entry* e = &(*it); 562 Entry* e = &(*it);
563 if( e->dn_fd > 0 ) { 563 if( e->dn_fd > 0 ) {
564 int mask = DN_DELETE|DN_CREATE|DN_RENAME|DN_MULTISHOT; 564 int mask = DN_DELETE|DN_CREATE|DN_RENAME|DN_MULTISHOT;
565 // if dependant is a file watch, we check for MODIFY & ATTRIB too 565 // if dependant is a file watch, we check for MODIFY & ATTRIB too
566 for(Entry* dep=e->m_entries.first();dep;dep=e->m_entries.next()) 566 for(Entry* dep=e->m_entries.first();dep;dep=e->m_entries.next())
567 if (!dep->isDir) { mask |= DN_MODIFY|DN_ATTRIB; break; } 567 if (!dep->isDir) { mask |= DN_MODIFY|DN_ATTRIB; break; }
568 if( fcntl(e->dn_fd, F_NOTIFY, mask) < 0) { // shouldn't happen 568 if( fcntl(e->dn_fd, F_NOTIFY, mask) < 0) { // shouldn't happen
569 ::close(e->dn_fd); 569 ::close(e->dn_fd);
570 e->m_mode = UnknownMode; 570 e->m_mode = UnknownMode;
571 fd_Entry.remove(e->dn_fd); 571 fd_Entry.remove(e->dn_fd);
572 e->dn_fd = 0; 572 e->dn_fd = 0;
573 useStat( e ); 573 useStat( e );
574 } 574 }
575 } 575 }
576#endif 576#endif
577 } 577 }
578 else { 578 else {
579 (*it).addClient(instance); 579 (*it).addClient(instance);
580 kdDebug(7001) << "Added already watched Entry " << path 580 kdDebug(7001) << "Added already watched Entry " << path
581 << " (now " << (*it).clients() << " clients)" 581 << " (now " << (*it).clients() << " clients)"
582 << QString(" [%1]").arg(instance->name()) << endl; 582 << QString(" [%1]").arg(instance->name()) << endl;
583 } 583 }
584 return; 584 return;
585 } 585 }
586 586
587 // we have a new path to watch 587 // we have a new path to watch
588 588
589 struct stat stat_buf; 589 struct stat stat_buf;
590 bool exists = (stat(QFile::encodeName(path), &stat_buf) == 0); 590 bool exists = (stat(QFile::encodeName(path), &stat_buf) == 0);
591 591
592 Entry newEntry; 592 Entry newEntry;
593 m_mapEntries.insert( path, newEntry ); 593 m_mapEntries.insert( path, newEntry );
594 // the insert does a copy, so we have to use <e> now 594 // the insert does a copy, so we have to use <e> now
595 Entry* e = &(m_mapEntries[path]); 595 Entry* e = &(m_mapEntries[path]);
596 596
597 if (exists) { 597 if (exists) {
598 e->isDir = S_ISDIR(stat_buf.st_mode); 598 QFileInfo fi ( path );
599 e->isDir = fi.isDir();
599 600
600 if (e->isDir && !isDir) 601 if (e->isDir && !isDir)
601 qWarning("KDirWatch: %s is a directory. Use addDir!", path.ascii()); 602 qWarning("KDirWatch: %s is a directory. Use addDir!", path.ascii());
602 else if (!e->isDir && isDir) 603 else if (!e->isDir && isDir)
603 qWarning("KDirWatch: %s is a file. Use addFile!", path.ascii()); 604 qWarning("KDirWatch: %s is a file. Use addFile!", path.ascii());
604 605
605 e->m_ctime = stat_buf.st_ctime; 606 e->m_ctime = stat_buf.st_ctime;
606 e->m_status = Normal; 607 e->m_status = Normal;
607 e->m_nlink = stat_buf.st_nlink; 608 e->m_nlink = stat_buf.st_nlink;
608 } 609 }
609 else { 610 else {
610 e->isDir = isDir; 611 e->isDir = isDir;
611 e->m_ctime = invalid_ctime; 612 e->m_ctime = invalid_ctime;
612 e->m_status = NonExistent; 613 e->m_status = NonExistent;
613 e->m_nlink = 0; 614 e->m_nlink = 0;
614 } 615 }
615 616
616 e->path = path; 617 e->path = path;
617 if (sub_entry) 618 if (sub_entry)
618 e->m_entries.append(sub_entry); 619 e->m_entries.append(sub_entry);
619 else 620 else
620 e->addClient(instance); 621 e->addClient(instance);
621 622
622 kdDebug(7001) << "Added " << (e->isDir ? "Dir ":"File ") << path 623 kdDebug(7001) << "Added " << (e->isDir ? "Dir ":"File ") << path
623 << (e->m_status == NonExistent ? " NotExisting" : "") 624 << (e->m_status == NonExistent ? " NotExisting" : "")
624 << (sub_entry ? QString(" for %1").arg(sub_entry->path) : QString("")) 625 << (sub_entry ? QString(" for %1").arg(sub_entry->path) : QString(""))
625 << (instance ? QString(" [%1]").arg(instance->name()) : QString("")) 626 << (instance ? QString(" [%1]").arg(instance->name()) : QString(""))
626 << endl; 627 << endl;
627 628
628 629
629 // now setup the notification method 630 // now setup the notification method
630 e->m_mode = UnknownMode; 631 e->m_mode = UnknownMode;
631 e->msecLeft = 0; 632 e->msecLeft = 0;
632 633
633#if defined(HAVE_FAM) 634#if defined(HAVE_FAM)
634 if (useFAM(e)) return; 635 if (useFAM(e)) return;
635#endif 636#endif
636 637
637#ifdef HAVE_DNOTIFY 638#ifdef HAVE_DNOTIFY
638 if (useDNotify(e)) return; 639 if (useDNotify(e)) return;
639#endif 640#endif
640 641
641 useStat(e); 642 useStat(e);
642} 643}
643 644
644 645
645void KDirWatchPrivate::removeEntry( KDirWatch* instance, 646void KDirWatchPrivate::removeEntry( KDirWatch* instance,
646 const QString& _path, Entry* sub_entry ) 647 const QString& _path, Entry* sub_entry )
647{ 648{
648 Entry* e = entry(_path); 649 Entry* e = entry(_path);
649 if (!e) { 650 if (!e) {
650 kdWarning(7001) << "KDirWatch::removeDir can't handle '" << _path << "'" << endl; 651 kdWarning(7001) << "KDirWatch::removeDir can't handle '" << _path << "'" << endl;
651 return; 652 return;
652 } 653 }
653 654
654 if (sub_entry) 655 if (sub_entry)
655 e->m_entries.removeRef(sub_entry); 656 e->m_entries.removeRef(sub_entry);
656 else 657 else
657 e->removeClient(instance); 658 e->removeClient(instance);
658 659
659 if (e->m_clients.count() || e->m_entries.count()) 660 if (e->m_clients.count() || e->m_entries.count())
660 return; 661 return;
661 662
662 if (delayRemove) { 663 if (delayRemove) {
663 // removeList is allowed to contain any entry at most once 664 // removeList is allowed to contain any entry at most once
664 if (removeList.findRef(e)==-1) 665 if (removeList.findRef(e)==-1)
665 removeList.append(e); 666 removeList.append(e);
666 // now e->isValid() is false 667 // now e->isValid() is false
667 return; 668 return;
668 } 669 }
669 670
670#ifdef HAVE_FAM 671#ifdef HAVE_FAM
671 if (e->m_mode == FAMMode) { 672 if (e->m_mode == FAMMode) {
672 if ( e->m_status == Normal) { 673 if ( e->m_status == Normal) {
673 FAMCancelMonitor(&fc, &(e->fr) ); 674 FAMCancelMonitor(&fc, &(e->fr) );
674 kdDebug(7001) << "Cancelled FAM (Req " 675 kdDebug(7001) << "Cancelled FAM (Req "
675 << FAMREQUEST_GETREQNUM(&(e->fr)) 676 << FAMREQUEST_GETREQNUM(&(e->fr))
676 << ") for " << e->path << endl; 677 << ") for " << e->path << endl;
677 } 678 }
678 else { 679 else {
679 if (e->isDir) 680 if (e->isDir)
680 removeEntry(0, QDir::cleanDirPath(e->path+"/.."), e); 681 removeEntry(0, QDir::cleanDirPath(e->path+"/.."), e);
681 else 682 else
682 removeEntry(0, QFileInfo(e->path).dirPath(true), e); 683 removeEntry(0, QFileInfo(e->path).dirPath(true), e);
683 } 684 }
684 } 685 }
685#endif 686#endif
686 687
687#ifdef HAVE_DNOTIFY 688#ifdef HAVE_DNOTIFY
688 if (e->m_mode == DNotifyMode) { 689 if (e->m_mode == DNotifyMode) {
689 if (!e->isDir) { 690 if (!e->isDir) {
690 removeEntry(0, QFileInfo(e->path).dirPath(true), e); 691 removeEntry(0, QFileInfo(e->path).dirPath(true), e);
691 } 692 }
692 else { // isDir 693 else { // isDir
693 // must close the FD. 694 // must close the FD.
694 if ( e->m_status == Normal) { 695 if ( e->m_status == Normal) {