summaryrefslogtreecommitdiffabout
Unidiff
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
@@ -534,129 +534,130 @@ bool KDirWatchPrivate::useStat(Entry* e)
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) {