author | zautrix <zautrix> | 2004-08-08 12:30:41 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-08-08 12:30:41 (UTC) |
commit | 75138e84a2271f8929478853151a6ed4a73fb2cc (patch) (unidiff) | |
tree | 804b3277bf2e4c4e371611677481803f527bf90e | |
parent | 4cc869512488b72304c7cbb5526c6f4cc957e677 (diff) | |
download | kdepimpi-75138e84a2271f8929478853151a6ed4a73fb2cc.zip kdepimpi-75138e84a2271f8929478853151a6ed4a73fb2cc.tar.gz kdepimpi-75138e84a2271f8929478853151a6ed4a73fb2cc.tar.bz2 |
Fixed kdirwatch
-rw-r--r-- | microkde/kio/kio/kdirwatch.cpp | 3 |
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 | ||
513 | bool KDirWatchPrivate::useStat(Entry* e) | 513 | bool 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 | */ |
544 | void KDirWatchPrivate::addEntry(KDirWatch* instance, const QString& _path, | 544 | void 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 | ||
645 | void KDirWatchPrivate::removeEntry( KDirWatch* instance, | 646 | void 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) { |