--- kdebase-3.1.3/kioslave/devices/kdedmodule/mountwatcher.cpp-- 2003-09-09 17:42:01.000000000 -0400 +++ kdebase-3.1.3/kioslave/devices/kdedmodule/mountwatcher.cpp 2003-09-09 17:49:08.000000000 -0400 @@ -44,6 +44,8 @@ MountWatcherModule::MountWatcherModule(c : KDEDModule(obj),mDiskList(this),mtabsize(0) { firstTime=true; + connect(&mDiskList,SIGNAL(readDFDone()),this,SLOT(readDFDone())); + connect(&mDiskList,SIGNAL(scanDevice( const QString &)),this,SLOT(slotScanDevice(const QString&))); mDiskList.readFSTAB(); @@ -65,7 +67,7 @@ MountWatcherModule::MountWatcherModule(c #endif #endif -connect(&mDiskList,SIGNAL(readDFDone()),this,SLOT(readDFDone())); +//connect(&mDiskList,SIGNAL(readDFDone()),this,SLOT(readDFDone())); } MountWatcherModule::~MountWatcherModule() --- kdebase-3.1.3/kioslave/devices/kdedmodule/disklist.cpp-- 2003-09-09 17:42:01.000000000 -0400 +++ kdebase-3.1.3/kioslave/devices/kdedmodule/disklist.cpp 2003-09-09 17:48:32.000000000 -0400 @@ -31,7 +31,6 @@ #include <kapplication.h> #include "disklist.h" -#include <iostream.h> #define BLANK ' ' #define DELIMITER '#' #define FULL_PERCENT 95.0 @@ -77,20 +76,10 @@ if (NO_FS_TYPE) disks = new Disks; disks->setAutoDelete(TRUE); - // BackgroundProcesses **************************************** - dfProc = new KProcess(); Q_CHECK_PTR(dfProc); - connect( dfProc, SIGNAL(receivedStdout(KProcess *, char *, int) ), - this, SLOT (receivedDFStdErrOut(KProcess *, char *, int)) ); - //connect( dfProc, SIGNAL(receivedStderr(KProcess *, char *, int) ), - // this, SLOT (receivedDFStdErrOut(KProcess *, char *, int)) ); - connect(dfProc,SIGNAL(processExited(KProcess *) ), - this, SLOT(dfDone() ) ); - - readingDFStdErrOut=FALSE; - config = kapp->config(); - loadSettings(); - //readFSTAB(); - //readDF(); + config = kapp->config(); + loadSettings(); + //readFSTAB(); + //readDF(); } @@ -99,7 +88,6 @@ if (NO_FS_TYPE) **/ DiskList::~DiskList() { - delete dfProc; } @@ -164,258 +152,166 @@ void DiskList::loadSettings() } } -/*************************************************************************** - * tries to figure out the possibly mounted fs -**/ -int DiskList::readFSTAB() +int DiskList::parseMountFile( bool mtab ) { - if (readingDFStdErrOut || dfProc->isRunning()) return -1; + QFile f; + if( mtab ) + f.setName(MTAB); + else + f.setName(FSTAB); + if ( f.open(IO_ReadOnly) ) + { + QTextStream t (&f); + DiskEntry *disk; + QString s; + + if( mtab ) + disks->clear(); + + while ( !t.atEnd() ) + { + s=t.readLine(); + s=s.simplifyWhiteSpace(); - QFile f(FSTAB); - if ( f.open(IO_ReadOnly) ) { - QTextStream t (&f); - QString s; - DiskEntry *disk; - - disks->clear(); // ############ - - while (! t.eof()) { - s=t.readLine(); - s=s.simplifyWhiteSpace(); - if ( (!s.isEmpty() ) && (s.find(DELIMITER)!=0) ) { - // not empty or commented out by '#' - // kdDebug() << "GOT: [" << s << "]" << endl; - disk = new DiskEntry();// Q_CHECK_PTR(disk); - disk->setMounted(FALSE); - disk->setDeviceName(s.left(s.find(BLANK)) ); - s=s.remove(0,s.find(BLANK)+1 ); - //kdDebug() << " deviceName: [" << disk->deviceName() << "]" << endl; + if ( (!s.isEmpty() ) && (s.find(DELIMITER)!=0) ) + { + // not empty or commented out by '#' + // kdDebug() << "GOT: [" << s << "]" << endl; + disk = new DiskEntry(); + disk->setMounted(FALSE); + disk->setDeviceName(s.left(s.find(BLANK)) ); + s=s.remove(0,s.find(BLANK)+1 ); + //kdDebug() << " deviceName: [" << disk->deviceName() << "]" << endl; #ifdef _OS_SOLARIS_ - //device to fsck - s=s.remove(0,s.find(BLANK)+1 ); + //device to fsck + s=s.remove(0,s.find(BLANK)+1 ); #endif - disk->setMountPoint(s.left(s.find(BLANK)) ); - s=s.remove(0,s.find(BLANK)+1 ); - //kdDebug() << " MountPoint: [" << disk->mountPoint() << "]" << endl; - //kdDebug() << " Icon: [" << disk->iconName() << "]" << endl; - disk->setFsType(s.left(s.find(BLANK)) ); - s=s.remove(0,s.find(BLANK)+1 ); - //kdDebug() << " FS-Type: [" << disk->fsType() << "]" << endl; - disk->setMountOptions(s.left(s.find(BLANK)) ); - s=s.remove(0,s.find(BLANK)+1 ); - //kdDebug() << " Mount-Options: [" << disk->mountOptions() << "]" << endl; - if( disk->mountOptions().find("user")==-1 && - !(disk->fsType()=="supermount" && disk->deviceName()=="none")) - { - delete disk; - } - else - { - if (!ignoreDisk(disk)) - replaceDeviceEntry(disk); + disk->setMountPoint(s.left(s.find(BLANK)) ); + s=s.remove(0,s.find(BLANK)+1 ); + //kdDebug() << " MountPoint: [" << disk->mountPoint() << "]" << endl; + //kdDebug() << " Icon: [" << disk->iconName() << "]" << endl; + disk->setFsType(s.left(s.find(BLANK)) ); + s=s.remove(0,s.find(BLANK)+1 ); + //kdDebug() << " FS-Type: [" << disk->fsType() << "]" << endl; + disk->setMountOptions(s.left(s.find(BLANK)) ); + s=s.remove(0,s.find(BLANK)+1 ); + //kdDebug() << " Mount-Options: [" << disk->mountOptions() << "]" << endl; + if( !mtab ) + { + if( (disk->fsType()!="nfs") &&(disk->mountOptions().find("user")==-1 && !(disk->fsType()=="supermount" && disk->deviceName()=="none"))) + { + delete disk; + } + else + { + if (!ignoreDisk(disk)) + { + replaceDeviceEntry(disk); + } + else + delete disk; + } + } else - delete disk; + { + if( !ignoreDisk(disk)) + { + disk->setMounted(true); + replaceDeviceEntryMounted(disk); + } + else + delete disk; + } + + } //if not empty + + }//while further lines available + + if( mtab ) + { + for ( DiskEntry *disk=disks->first(); disk != 0; disk=disks->next() ) + { + if ( disk->fsType()=="supermount" && disk->deviceName() == "none") + disk->setMounted(TRUE); } - } //if not empty - } //while - f.close(); - } //if f.open + loadSettings(); + emit readDFDone(); + } + else + loadSettings(); + f.close(); + return 1; + } + return 0; - loadSettings(); //to get the mountCommands - return 1; } -bool DiskList::ignoreDisk(DiskEntry *disk) +int DiskList::readMTAB() { - bool ignore; - if ( disk->fsType()=="supermount" && disk->deviceName() == "none") - { - emit scanDevice(disk->mountPoint()); - ignore = false; - } - else - { - if ( (disk->deviceName() != "none") - && (disk->fsType() != "swap") - &&(disk->fsType() != "tmpfs") - && (disk->deviceName() != "tmpfs") - && (disk->mountPoint() != "/dev/swap") - && (disk->mountPoint() != "/dev/pts") - && (disk->mountPoint().find("/proc") != 0) - && (disk->deviceName().find("shm") == -1 )) - ignore=false; - else - ignore=true; - } - if (!ignore) { - for (QRegExp *exp=mountPointExclusionList.getFirst();exp;exp=mountPointExclusionList.next()) - { - kdDebug()<<"TRYING TO DO A REGEXP SEARCH"<<endl; - if( disk->mountOptions().find("user")!=-1) - return false; - if (exp->search(disk->mountPoint())!=-1) - { - kdDebug()<<"IGNORING BECAUSE OF REGEXP SEARCH"<<endl; - return true; - } - } - } + for ( DiskEntry *disk=disks->first(); disk != 0; disk=disks->next() ) + disk->setMounted(FALSE); // set all devs unmounted + return parseMountFile( true ); - return ignore; } - - /*************************************************************************** - * is called, when the df-command writes on StdOut or StdErr + * tries to figure out the possibly mounted fs **/ -void DiskList::receivedDFStdErrOut(KProcess *, char *data, int len ) +int DiskList::readFSTAB() { - - /* ATTENTION: StdERR no longer connected to this... - * Do we really need StdErr?? on HP-UX there was eg. a line - * df: /home_tu1/ijzerman/floppy: Stale NFS file handle - * but this shouldn't cause a real problem - */ - - QString tmp = QString(data) + QString("\0"); // adds a zero-byte - tmp.truncate(len); - - dfStringErrOut.append(tmp); + return parseMountFile( false ); } -/*************************************************************************** - * reads the df-commands results -**/ -int DiskList::readDF() +bool DiskList::ignoreDisk(DiskEntry *disk) { - if (readingDFStdErrOut || dfProc->isRunning()) return -1; - setenv("LANG", "en_US", 1); - setenv("LC_ALL", "en_US", 1); - setenv("LC_MESSAGES", "en_US", 1); - setenv("LC_TYPE", "en_US", 1); - setenv("LANGUAGE", "en_US", 1); - dfStringErrOut=""; // yet no data received - dfProc->clearArguments(); - (*dfProc) << DF_COMMAND << DF_ARGS; - if (!dfProc->start( KProcess::NotifyOnExit, KProcess::AllOutput )) - { - kdWarning(7020)<<i18n("could not execute [%1]").arg(DF_COMMAND)<<endl; - return 0; - } + bool ignore; + if ( disk->fsType()=="supermount" && disk->deviceName() == "none") + { + emit scanDevice(disk->mountPoint()); + ignore = false; + } + else + { + if ( (disk->deviceName() != "none") + && (disk->fsType() != "swap") + &&(disk->fsType() != "tmpfs") + && (disk->deviceName() != "tmpfs") + && (disk->mountPoint() != "/dev/swap") + && (disk->mountPoint() != "/dev/pts") + && (disk->mountPoint().find("/proc") != 0) + && (disk->deviceName().find("shm") == -1 )) + { + ignore=false; + } + else + { + ignore=true; + } + } + if (!ignore) { + for (QRegExp *exp=mountPointExclusionList.getFirst();exp;exp=mountPointExclusionList.next()) + { + kdDebug()<<"TRYING TO DO A REGEXP SEARCH"<<endl; + if( disk->mountOptions().find("user")!=-1) + return false; + if (exp->search(disk->mountPoint())!=-1) + { + kdDebug()<<"IGNORING BECAUSE OF REGEXP SEARCH"<<endl; + return true; + } + } + } - return 1; + return ignore; } -/*************************************************************************** - * is called, when the df-command has finished -**/ -void DiskList::dfDone() +int DiskList::readDF() { - readingDFStdErrOut=TRUE; - for ( DiskEntry *disk=disks->first(); disk != 0; disk=disks->next() ) - disk->setMounted(FALSE); // set all devs unmounted - - QTextStream t (dfStringErrOut, IO_ReadOnly); - QString s=t.readLine(); - if ( ( s.isEmpty() ) || ( s.left(10) != "Filesystem" ) ) - { - kdWarning(7020)<<QString("Error running df command, couldn't parse output")<<endl; - return; - } - while ( !t.atEnd() ) { - QString u,v; - DiskEntry *disk; - s=t.readLine(); - s=s.simplifyWhiteSpace(); - if ( !s.isEmpty() ) { - disk = new DiskEntry(); Q_CHECK_PTR(disk); - - if (s.find(BLANK)<0) // devicename was too long, rest in next line - if ( !t.eof() ) { // just appends the next line - v=t.readLine(); - s=s.append(v.latin1() ); - s=s.simplifyWhiteSpace(); - //kdDebug() << "SPECIAL GOT: [" << s << "]" << endl; - }//if silly linefeed - - //kdDebug() << "EFFECTIVELY GOT " << s.length() << " chars: [" << s << "]" << endl; - - disk->setDeviceName(s.left(s.find(BLANK)) ); - s=s.remove(0,s.find(BLANK)+1 ); - //kdDebug() << " DeviceName: [" << disk->deviceName() << "]" << endl; - - if (NO_FS_TYPE) { - //kdDebug() << "THERE IS NO FS_TYPE_FIELD!" << endl; - disk->setFsType("?"); - } else { - disk->setFsType(s.left(s.find(BLANK)) ); - s=s.remove(0,s.find(BLANK)+1 ); - }; - //kdDebug() << " FS-Type: [" << disk->fsType() << "]" << endl; - //kdDebug() << " Icon: [" << disk->iconName() << "]" << endl; - - u=s.left(s.find(BLANK)); - disk->setKBSize(u.toInt() ); - s=s.remove(0,s.find(BLANK)+1 ); - //kdDebug() << " Size: [" << disk->kBSize() << "]" << endl; - - u=s.left(s.find(BLANK)); - disk->setKBUsed(u.toInt() ); - s=s.remove(0,s.find(BLANK)+1 ); - //kdDebug() << " Used: [" << disk->kBUsed() << "]" << endl; - - u=s.left(s.find(BLANK)); - disk->setKBAvail(u.toInt() ); - s=s.remove(0,s.find(BLANK)+1 ); - //kdDebug() << " Avail: [" << disk->kBAvail() << "]" << endl; - - - s=s.remove(0,s.find(BLANK)+1 ); // delete the capacity 94% - s=s.stripWhiteSpace(); - disk->setMountPoint(s ); - - //kdDebug() << " MountPoint: [" << disk->mountPoint() << "]" << endl; - - if ( (disk->kBSize() > 0) && - (!ignoreDisk(disk))) - { - disk->setMounted(TRUE); // its now mounted (df lists only mounted) - replaceDeviceEntryMounted(disk); - } else - delete disk; - - }//if not header - }//while further lines available - for ( DiskEntry *disk=disks->first(); disk != 0; disk=disks->next() ) - { - if ( disk->fsType()=="supermount" && disk->deviceName() == "none") - { - disk->setMounted(TRUE); -#if 0 - QDir dir(disk->mountPoint()); - QStringList files = dir.entryList(); - for ( QStringList::Iterator it = files.begin(); it != files.end(); ++it ) - { - if ( *it !="." && *it !="..") - { - disk->setMounted(TRUE); - break; - } - } -#endif - } - } - - readingDFStdErrOut=FALSE; - loadSettings(); //to get the mountCommands - emit readDFDone(); - + return readMTAB(); } - void DiskList::replaceDeviceEntryMounted(DiskEntry *disk) { //I'm assuming that df always returns the real device name, not a symlink @@ -432,13 +328,10 @@ void DiskList::replaceDeviceEntryMounted break; } } - //if( pos !=-1 ) - delete disk; - //if (pos==-1) - //disks->append(disk); -// else -// delete disk; - + if (pos==-1) + disks->append(disk); + else + delete disk; } /*************************************************************************** @@ -457,7 +350,6 @@ void DiskList::replaceDeviceEntry(DiskEn // never called. // //int pos=disks->find(disk); - int pos = -1; for( u_int i=0; i<disks->count(); i++ ) { --- kdebase-3.1.3/kioslave/devices/kdedmodule/disklist.h-- 2003-09-09 17:42:00.000000000 -0400 +++ kdebase-3.1.3/kioslave/devices/kdedmodule/disklist.h 2003-09-09 17:46:49.000000000 -0400 @@ -44,7 +44,7 @@ #else #define DF_ARGS "-k" #define NO_FS_TYPE true -#endif +#endif #ifdef _OS_SOLARIS_ @@ -75,8 +75,8 @@ class Disks : public DisksBase public: Disks(bool deepCopies=TRUE) { dc = deepCopies;}; ~Disks() { clear(); }; -private: - int compareItems( DiskEntry s1, DiskEntry s2 ) +private: + int compareItems( DiskEntry s1, DiskEntry s2 ) { int ret = s1.deviceName().compare(s2.deviceName()); if( ret == 0 ) @@ -109,7 +109,7 @@ class DiskList : public QObject public: DiskList( QObject *parent=0, const char *name=0 ); ~DiskList(); - int readFSTAB(); + int readFSTAB(); int readDF(); int find(const DiskEntry* disk) {return disks->find(disk);}; DiskEntry* at(uint index) {return disks->at(index);}; @@ -126,22 +126,17 @@ public slots: void loadSettings(); void applySettings(); void loadExclusionLists(); - -private slots: - void receivedDFStdErrOut(KProcess *, char *data, int len); - void dfDone(); -private: +private: void replaceDeviceEntry(DiskEntry *disk); void replaceDeviceEntryMounted(DiskEntry *disk); bool ignoreDisk(DiskEntry *disk); - + int readMTAB(); + int parseMountFile( bool mtab ); Disks *disks; - KProcess *dfProc; - QString dfStringErrOut; bool readingDFStdErrOut; KConfig *config; - QPtrList<QRegExp> mountPointExclusionList; + QPtrList<QRegExp> mountPointExclusionList; }; /***************************************************************************/