diff --git a/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp b/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp index 70414ea8e9..19c30a4832 100644 --- a/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp +++ b/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp @@ -26,143 +26,143 @@ void GetNewStorageDevices( vector& vDevicesOut ); static int RunProgram( const char *path, char *const args[], CString &out ) { - int fds[2]; - if( pipe(fds) == -1 ) - return -1; - - int pid = fork(); - if( pid == -1 ) + int fds[2]; + if( pipe(fds) == -1 ) + return -1; + + int pid = fork(); + if( pid == -1 ) { - close( fds[0] ); - close( fds[1] ); - return -1; + close( fds[0] ); + close( fds[1] ); + return -1; } - - if( pid == 0 ) + + if( pid == 0 ) { - close( fds[0] ); - close( fileno(stdout) ); - - dup2( fds[1], fileno(stdout) ); - - for( int i = 0; i < 1024; ++i ) - if( i != fileno(stdout) ) - close( i ); - execvp( path, args ); - _exit(1); + close( fds[0] ); + close( fileno(stdout) ); + + dup2( fds[1], fileno(stdout) ); + + for( int i = 0; i < 1024; ++i ) + if( i != fileno(stdout) ) + close( i ); + execvp( path, args ); + _exit(1); } - - close( fds[1] ); - - while( 1 ) + + close( fds[1] ); + + while( 1 ) { - char buf[1024]; - int got = read( fds[0], buf, sizeof(buf) ); - if( got == -1 ) - { - if( errno == EINTR ) - continue; - fprintf( stderr, "err %s\n", strerror(errno) ); - exit(0); - } - - if( got == 0 ) - break; - - out.append( buf, got ); + char buf[1024]; + int got = read( fds[0], buf, sizeof(buf) ); + if( got == -1 ) + { + if( errno == EINTR ) + continue; + fprintf( stderr, "err %s\n", strerror(errno) ); + exit(0); + } + + if( got == 0 ) + break; + + out.append( buf, got ); } - - close( fds[0] ); - int status; - int ret = waitpid( pid, &status, 0 ); - - if( ret == -1 ) - return -1; - - if( !WIFEXITED(status) ) - return -1; /* signal */ - - return WEXITSTATUS(status); + + close( fds[0] ); + int status; + int ret = waitpid( pid, &status, 0 ); + + if( ret == -1 ) + return -1; + + if( !WIFEXITED(status) ) + return -1; /* signal */ + + return WEXITSTATUS(status); } template bool VectorsAreEqual( const T &a, const T &b ) { - if( a.size() != b.size() ) - return false; - - for( unsigned i=0; iTrace( "executing '%s'", sCommand.c_str() ); - int ret = system(sCommand); - LOG->Trace( "done executing '%s'", sCommand.c_str() ); - if( ret != 0 ) - LOG->Warn( "failed to execute '%s' with error %d.", sCommand.c_str(), ret ); - return ret == 0; + LOG->Trace( "executing '%s'", sCommand.c_str() ); + int ret = system(sCommand); + LOG->Trace( "done executing '%s'", sCommand.c_str() ); + if( ret != 0 ) + LOG->Warn( "failed to execute '%s' with error %d.", sCommand.c_str(), ret ); + return ret == 0; } MemoryCardDriverThreaded_Linux::MemoryCardDriverThreaded_Linux() { - m_fd = open(USB_DEVICE_LIST_FILE, O_RDONLY); - if( m_fd == -1 ) + m_fd = open(USB_DEVICE_LIST_FILE, O_RDONLY); + if( m_fd == -1 ) { - LOG->Warn( "Failed to open \"%s\": %s", USB_DEVICE_LIST_FILE, strerror(errno) ); + LOG->Warn( "Failed to open \"%s\": %s", USB_DEVICE_LIST_FILE, strerror(errno) ); } - this->StartThread(); + this->StartThread(); } void MemoryCardDriverThreaded_Linux::MountThreadReset() { - // - // if usb-storage gets in a bad state, resetting usb-storage will sometimes fix it. - // - - LockMut( m_mutexStorageDevices ); - - // unmount all devices before trying to remove the module - for( unsigned i=0; iTrace( "reset unmount %i/%i (%s)", i, m_vStorageDevices.size(), sCommand.c_str() ); - ExecuteCommand( sCommand ); - LOG->Trace( "reset unmount %i/%i done", i, m_vStorageDevices.size() ); + UsbStorageDeviceEx &d = m_vStorageDevices[i]; + CString sCommand = "umount " + d.sOsMountDir; + LOG->Trace( "reset unmount %i/%i (%s)", i, m_vStorageDevices.size(), sCommand.c_str() ); + ExecuteCommand( sCommand ); + LOG->Trace( "reset unmount %i/%i done", i, m_vStorageDevices.size() ); } - - ExecuteCommand( "rmmod usb-storage" ); - ExecuteCommand( "modprobe usb-storage" ); - - m_vDevicesLastSeen.clear(); // redetect all devices + + ExecuteCommand( "rmmod usb-storage" ); + ExecuteCommand( "modprobe usb-storage" ); + + m_vDevicesLastSeen.clear(); // redetect all devices } void MemoryCardDriverThreaded_Linux::MountThreadDoOneUpdate() { if( m_fd == -1 ) return; - + pollfd pfd = { m_fd, POLLIN, 0 }; int ret = poll( &pfd, 1, 100 ); switch( ret ) @@ -174,151 +174,151 @@ void MemoryCardDriverThreaded_Linux::MountThreadDoOneUpdate() return; case -1: if( errno != EINTR ) - LOG->Warn( "Error polling: %s", strerror(errno) ); + LOG->Warn( "Error polling: %s", strerror(errno) ); return; } - - // TRICKY: We're waiting for a change in the USB device list, but - // the usb-storage descriptors take a bit longer to update. It's more convenient to wait - // on the USB device list because the usb-storage descriptors are separate files per - // device. So, sleep for a little bit of time after we detect a new USB device and give - // usb-storage a chance to initialize. - usleep(1000*300); - - vector vDevicesNow; - GetNewStorageDevices( vDevicesNow ); - - vector &vNew = vDevicesNow; - vector &vOld = m_vDevicesLastSeen; - - // check for disconnects - vector vDisconnects; - for( unsigned i=0; i vDevicesNow; + GetNewStorageDevices( vDevicesNow ); + + vector &vNew = vDevicesNow; + vector &vOld = m_vDevicesLastSeen; + + // check for disconnects + vector vDisconnects; + for( unsigned i=0; iTrace( ssprintf("Disconnected bus %d port %d level %d path %s", old.iBus, old.iPort, old.iLevel, old.sOsMountDir.c_str()) ); - vDisconnects.push_back( &old ); - } + UsbStorageDeviceEx &old = vOld[i]; + if( find(vNew.begin(),vNew.end(),old) == vNew.end() )// didn't find + { + LOG->Trace( ssprintf("Disconnected bus %d port %d level %d path %s", old.iBus, old.iPort, old.iLevel, old.sOsMountDir.c_str()) ); + vDisconnects.push_back( &old ); + } } - - // check for connects - vector vConnects; - for( unsigned i=0; i vConnects; + for( unsigned i=0; iTrace( ssprintf("Connected bus %d port %d level %d path %s", newd.iBus, newd.iPort, newd.iLevel, newd.sOsMountDir.c_str()) ); - vConnects.push_back( &newd ); - } + UsbStorageDeviceEx &newd = vNew[i]; + if( find(vOld.begin(),vOld.end(),newd) == vOld.end() )// didn't find + { + LOG->Trace( ssprintf("Connected bus %d port %d level %d path %s", newd.iBus, newd.iPort, newd.iLevel, newd.sOsMountDir.c_str()) ); + vConnects.push_back( &newd ); + } } - - // unmount all disconnects - for( unsigned i=0; iTrace( "unmount disconnects %i/%i (%s)", i, vDisconnects.size(), sCommand.c_str() ); - ExecuteCommand( sCommand ); - LOG->Trace( "unmount disconnects %i/%i done", i, vDisconnects.size() ); + UsbStorageDeviceEx &d = *vDisconnects[i]; + CString sCommand = "umount " + d.sOsMountDir; + LOG->Trace( "unmount disconnects %i/%i (%s)", i, vDisconnects.size(), sCommand.c_str() ); + ExecuteCommand( sCommand ); + LOG->Trace( "unmount disconnects %i/%i done", i, vDisconnects.size() ); } - - // mount all connects - for( unsigned i=0; iTrace( "unmount old connect %i/%i (%s)", i, vConnects.size(), sCommand.c_str() ); - ExecuteCommand( sCommand ); // don't care if this fails - LOG->Trace( "unmount old connect %i/%i done", i, vConnects.size() ); - - sCommand = "mount " + d.sOsMountDir; - LOG->Trace( "unmount new connect %i/%i (%s)", i, vConnects.size(), sCommand.c_str() ); - bool bMountedSuccessfully = ExecuteCommand( sCommand ); - LOG->Trace( "unmount new connect %i/%i done", i, vConnects.size() ); - - d.bWriteTestSucceeded = bMountedSuccessfully && TestWrite( d.sOsMountDir ); - - // read name - this->Mount( &d, TEMP_MOUNT_POINT ); - FILEMAN->FlushDirCache( TEMP_MOUNT_POINT ); - Profile profile; - CString sProfileDir = TEMP_MOUNT_POINT + PREFSMAN->m_sMemoryCardProfileSubdir + '/'; - profile.LoadEditableDataFromDir( sProfileDir ); - d.sName = profile.GetDisplayName(); - - LOG->Trace( "write test %s", d.bWriteTestSucceeded ? "succeeded" : "failed" ); + UsbStorageDeviceEx &d = *vConnects[i]; + CString sCommand; + + // unmount this device before trying to mount it. If this device + // wasn't unmounted before, then our mount call will fail and the + // mount may contain an out-of-date view of the files on the device. + sCommand = "umount " + d.sOsMountDir; + LOG->Trace( "unmount old connect %i/%i (%s)", i, vConnects.size(), sCommand.c_str() ); + ExecuteCommand( sCommand ); // don't care if this fails + LOG->Trace( "unmount old connect %i/%i done", i, vConnects.size() ); + + sCommand = "mount " + d.sOsMountDir; + LOG->Trace( "unmount new connect %i/%i (%s)", i, vConnects.size(), sCommand.c_str() ); + bool bMountedSuccessfully = ExecuteCommand( sCommand ); + LOG->Trace( "unmount new connect %i/%i done", i, vConnects.size() ); + + d.bWriteTestSucceeded = bMountedSuccessfully && TestWrite( d.sOsMountDir ); + + // read name + this->Mount( &d, TEMP_MOUNT_POINT ); + FILEMAN->FlushDirCache( TEMP_MOUNT_POINT ); + Profile profile; + CString sProfileDir = TEMP_MOUNT_POINT + PREFSMAN->m_sMemoryCardProfileSubdir + '/'; + profile.LoadEditableDataFromDir( sProfileDir ); + d.sName = profile.GetDisplayName(); + + LOG->Trace( "write test %s", d.bWriteTestSucceeded ? "succeeded" : "failed" ); } - - if( !vDisconnects.empty() || !vConnects.empty() ) + + if( !vDisconnects.empty() || !vConnects.empty() ) { - LockMut( m_mutexStorageDevices ); - m_bStorageDevicesChanged = true; - m_vStorageDevices = vDevicesNow; - for( unsigned i=0; iTrace( "index %d, bWriteTestSucceeded %d", i, d.bWriteTestSucceeded ); - } + LockMut( m_mutexStorageDevices ); + m_bStorageDevicesChanged = true; + m_vStorageDevices = vDevicesNow; + for( unsigned i=0; iTrace( "index %d, bWriteTestSucceeded %d", i, d.bWriteTestSucceeded ); + } } - - m_vDevicesLastSeen = vDevicesNow; - - CHECKPOINT; + + m_vDevicesLastSeen = vDevicesNow; + + CHECKPOINT; } bool ReadUsbStorageDescriptor( CString fn, int iScsiIndex, vector& vDevicesOut ) { - LOG->Trace( "ReadUsbStorageDescriptor %s", fn.c_str() ); - - // Read the usb-storage descriptor. It looks like: - - // Host scsi0: usb-storage - // Vendor: KINGSTON - // Product: USB DRIVE - // Serial Number: 1125198948886 - // Protocol: Transparent SCSI - // Transport: Bulk - // GUID: 04e801000001125198948886 - // Attached: Yes - - ifstream f; - f.open(fn); - if( !f.is_open() ) - return false; - - CString sLine; - while( getline(f, sLine) ) + LOG->Trace( "ReadUsbStorageDescriptor %s", fn.c_str() ); + + // Read the usb-storage descriptor. It looks like: + + // Host scsi0: usb-storage + // Vendor: KINGSTON + // Product: USB DRIVE + // Serial Number: 1125198948886 + // Protocol: Transparent SCSI + // Transport: Bulk + // GUID: 04e801000001125198948886 + // Attached: Yes + + ifstream f; + f.open(fn); + if( !f.is_open() ) + return false; + + CString sLine; + while( getline(f, sLine) ) { - // Serial Number: 1125198948886 - char szSerial[1024]; - int iRet = sscanf( sLine.c_str(), "Serial Number: %[^\n]", szSerial ); - if( iRet == 1 ) // we found our line - { - // Search for the device corresponding to this serial number. - for( unsigned j=0; jTrace( "iScsiIndex: %d, iBus: %d, iLevel: %d, iPort: %d, sSerial: %s", - usbd.iScsiIndex, usbd.iBus, usbd.iLevel, usbd.iPort, usbd.sSerial.c_str() ); - break; // done looking for the corresponding device. + // Search for the device corresponding to this serial number. + for( unsigned j=0; jTrace( "iScsiIndex: %d, iBus: %d, iLevel: %d, iPort: %d, sSerial: %s", + usbd.iScsiIndex, usbd.iBus, usbd.iLevel, usbd.iPort, usbd.sSerial.c_str() ); + break; // done looking for the corresponding device. + } + } + break; // we already found the line we care about } - } - break; // we already found the line we care about - } } - return true; + return true; } #if 0 @@ -345,7 +345,7 @@ static bool GetPortAndLevelFromSerial( CString sSerial, UsbStorageDeviceEx &usbd // I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage // E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms // E: Ad=03(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms - + RageFile f; CString fn = "/proc/bus/usb/devices"; LOG->Trace( fn ); @@ -354,18 +354,18 @@ static bool GetPortAndLevelFromSerial( CString sSerial, UsbStorageDeviceEx &usbd LOG->Warn( "can't open \"%s\": %s", fn.c_str(), f.GetError().c_str() ); return false; } - + CString sLine; int iPort, iLevel; while( f.GetLine(sLine) > 0 ) { int iRet, iThrowAway; - + // T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 iRet = sscanf( sLine.c_str(), "T: Bus=%d Lev=%d Prnt=%d Port=%d Cnt=%d Dev#=%d Spd=%d MxCh=%d", &iThrowAway, &iLevel, &iThrowAway, &iPort, &iThrowAway, &iThrowAway, &iThrowAway, &iThrowAway ); if( iRet == 8 ) continue; // stop processing this line - + // S: SerialNumber=ff80 char szSerial[1024]; iRet = sscanf( sLine.c_str(), "S: SerialNumber=%[^\n]", szSerial ); @@ -387,160 +387,160 @@ static bool GetPortAndLevelFromSerial( CString sSerial, UsbStorageDeviceEx &usbd void GetNewStorageDevices( vector& vDevicesOut ) { - LOG->Trace( "GetNewStorageDevices" ); - + LOG->Trace( "GetNewStorageDevices" ); + vDevicesOut.clear(); - + { - // Bus 002 Device 001: ID 0000:0000 - // iSerial 3 1125198948886 - // bInterfaceClass 8 Mass Storage - - CString sCommand = "/usr/sbin/lsusb"; - char *szParams[] = { "/usr/sbin/lsusb", "-v", NULL }; - CString sOutput; - LOG->Trace( sCommand ); - RunProgram( sCommand, szParams, sOutput ); - - CStringArray vsLines; - split( sOutput, "\n", vsLines ); - - UsbStorageDeviceEx usbd; - for( unsigned i=0; iTrace( "iBus = %d", iBus ); - continue; // stop processing this line - } - - // iSerial 3 1125198948886 - char szSerial[1024]; - iRet = sscanf( sLine.c_str(), " iSerial %d %[^\n]", &iThrowAway, szSerial ); - if( iRet == 2 ) - { - usbd.sSerial = szSerial; - LOG->Trace( "sSerial = %s", szSerial ); - continue; // stop processing this line - } - - // bInterfaceClass 8 Mass Storage - int iClass; - iRet = sscanf( sLine.c_str(), " bInterfaceClass %d", &iClass ); - if( iRet == 1 ) - { - if( iClass == 8 ) // storage class - { - vDevicesOut.push_back( usbd ); - LOG->Trace( "iScsiIndex: %d, iBus: %d, iLevel: %d, iPort: %d", - usbd.iScsiIndex, usbd.iBus, usbd.iLevel, usbd.iPort ); - } - continue; // stop processing this line - } - } - } - - { - // Find the usb-storage device index for all storage class devices. - - const CString sDir = "/proc/scsi/usb-storage/"; - LOG->Trace( sDir ); - DIR *dirp = opendir( sDir ); - if( dirp ) - { - // 2.6 kernel style - - struct dirent *direntp; - while ( (direntp = readdir( dirp )) != NULL ) - { - if( stricmp(direntp->d_name,".")==0 || stricmp(direntp->d_name,"..")==0 ) - continue; - - int iScsiIndex = atoi( direntp->d_name ); - CString fn = sDir + direntp->d_name; - - ReadUsbStorageDescriptor( fn, iScsiIndex, vDevicesOut ); - } - closedir( dirp ); - dirp = NULL; - - - // Get the mapping from Scsi device number to Scsi file device. Requires "sg-utils". - // sg_scan. It looks like: - - // /dev/sg0: scsi47 channel=0 id=0 lun=0 [em] type=0 - // /dev/sg1: scsi46 channel=0 id=0 lun=0 [em] type=0 - + // Bus 002 Device 001: ID 0000:0000 + // iSerial 3 1125198948886 + // bInterfaceClass 8 Mass Storage + + CString sCommand = "/usr/sbin/lsusb"; + char *szParams[] = { "/usr/sbin/lsusb", "-v", NULL }; CString sOutput; - CString sCommand = "/usr/bin/sg_scan"; LOG->Trace( sCommand ); - RunProgram( sCommand, NULL, sOutput ); - + RunProgram( sCommand, szParams, sOutput ); + CStringArray vsLines; split( sOutput, "\n", vsLines ); - + + UsbStorageDeviceEx usbd; for( unsigned i=0; iTrace( "sLine: %s", sLine.c_str() ); - - int iSg; - int iScsiIndex; - int iRet = sscanf( sLine.c_str(), "/dev/sg%i: scsi%d", &iSg, &iScsiIndex ); - if( iRet != 2 ) - continue; // don't process this line - - // search for the usb-storage device corresponding to the SCSI device - for( unsigned i=0; iTrace( "iScsiIndex: %d, iBus: %d, iLevel: %d, iPort: %d, sScsiDevice: %s", - usbd.iScsiIndex, usbd.iBus, usbd.iLevel, usbd.iPort, usbd.sScsiDevice.c_str() ); - break; // stop looking for a match - } - } - } - } - else - { - // 2.4 kernel style - - // Find the usb-storage device index for all storage class devices. - for( unsigned i=0; true; i++ ) { - CString fn = ssprintf( "/proc/scsi/usb-storage-%d/%d", i, i ); - if( !ReadUsbStorageDescriptor( fn, i, vDevicesOut ) ) - break; + CString &sLine = vsLines[i]; + + int iRet, iThrowAway; + + // Bus 002 Device 001: ID 0000:0000 + int iBus; + iRet = sscanf( sLine.c_str(), "Bus %d", &iBus ); + if( iRet == 1 ) + { + usbd.iBus = iBus; + LOG->Trace( "iBus = %d", iBus ); + continue; // stop processing this line + } + + // iSerial 3 1125198948886 + char szSerial[1024]; + iRet = sscanf( sLine.c_str(), " iSerial %d %[^\n]", &iThrowAway, szSerial ); + if( iRet == 2 ) + { + usbd.sSerial = szSerial; + LOG->Trace( "sSerial = %s", szSerial ); + continue; // stop processing this line + } + + // bInterfaceClass 8 Mass Storage + int iClass; + iRet = sscanf( sLine.c_str(), " bInterfaceClass %d", &iClass ); + if( iRet == 1 ) + { + if( iClass == 8 ) // storage class + { + vDevicesOut.push_back( usbd ); + LOG->Trace( "iScsiIndex: %d, iBus: %d, iLevel: %d, iPort: %d", + usbd.iScsiIndex, usbd.iBus, usbd.iLevel, usbd.iPort ); + } + continue; // stop processing this line + } } - - for( unsigned i=0; iTrace( sDir ); + DIR *dirp = opendir( sDir ); + if( dirp ) + { + // 2.6 kernel style + + struct dirent *direntp; + while ( (direntp = readdir( dirp )) != NULL ) + { + if( stricmp(direntp->d_name,".")==0 || stricmp(direntp->d_name,"..")==0 ) + continue; + + int iScsiIndex = atoi( direntp->d_name ); + CString fn = sDir + direntp->d_name; + + ReadUsbStorageDescriptor( fn, iScsiIndex, vDevicesOut ); + } + closedir( dirp ); + dirp = NULL; + + + // Get the mapping from Scsi device number to Scsi file device. Requires "sg-utils". + // sg_scan. It looks like: + + // /dev/sg0: scsi47 channel=0 id=0 lun=0 [em] type=0 + // /dev/sg1: scsi46 channel=0 id=0 lun=0 [em] type=0 + + CString sOutput; + CString sCommand = "/usr/bin/sg_scan"; + LOG->Trace( sCommand ); + RunProgram( sCommand, NULL, sOutput ); + + CStringArray vsLines; + split( sOutput, "\n", vsLines ); + + for( unsigned i=0; iTrace( "sLine: %s", sLine.c_str() ); + + int iSg; + int iScsiIndex; + int iRet = sscanf( sLine.c_str(), "/dev/sg%i: scsi%d", &iSg, &iScsiIndex ); + if( iRet != 2 ) + continue; // don't process this line + + // search for the usb-storage device corresponding to the SCSI device + for( unsigned i=0; iTrace( "iScsiIndex: %d, iBus: %d, iLevel: %d, iPort: %d, sScsiDevice: %s", + usbd.iScsiIndex, usbd.iBus, usbd.iLevel, usbd.iPort, usbd.sScsiDevice.c_str() ); + break; // stop looking for a match + } + } + } + } + else + { + // 2.4 kernel style + + // Find the usb-storage device index for all storage class devices. + for( unsigned i=0; true; i++ ) + { + CString fn = ssprintf( "/proc/scsi/usb-storage-%d/%d", i, i ); + if( !ReadUsbStorageDescriptor( fn, i, vDevicesOut ) ) + break; + } + + for( unsigned i=0; iTrace( fn ); RageFile f; @@ -549,7 +549,7 @@ void GetNewStorageDevices( vector& vDevicesOut ) LOG->Warn( "can't open '%s': %s", fn.c_str(), f.GetError().c_str() ); return; } - + CString sLine; while( !f.AtEOF() ) { @@ -560,18 +560,18 @@ void GetNewStorageDevices( vector& vDevicesOut ) LOG->Warn( "error reading '%s': %s", fn.c_str(), f.GetError().c_str() ); return; } - + char szScsiDevice[1024]; char szMountPoint[1024]; int iRet = sscanf( sLine, "%s %s", szScsiDevice, szMountPoint ); if( iRet != 2 ) continue; // don't process this line - - + + CString sMountPoint = szMountPoint; TrimLeft( sMountPoint ); TrimRight( sMountPoint ); - + // search for the usb-storage device corresponding to the SCSI device for( unsigned i=0; i& vDevicesOut ) if( usbd.sScsiDevice+"1" == szScsiDevice ) // found our match { usbd.sOsMountDir = sMountPoint; - + LOG->Trace( "iScsiIndex: %d, sScsiDevice: %s, iBus: %d, iLevel: %d, iPort: %d, sOsMountDir: %s", usbd.iScsiIndex, usbd.sScsiDevice.c_str(), usbd.iBus, usbd.iLevel, usbd.iPort, usbd.sOsMountDir.c_str() ); - + break; // stop looking for a match } } } } - - leave: - + +leave: + /* Remove any devices that we couldn't find a mountpoint for. */ for( unsigned i=0; i& vDevicesOut ) --i; } } - + LOG->Trace( "Done with GetNewStorageDevices" ); } void MemoryCardDriverThreaded_Linux::Mount( UsbStorageDevice* pDevice, CString sMountPoint ) { - ASSERT( !pDevice->sOsMountDir.empty() ); - - /* Unmount any previous mounts for this mountpoint. */ - vector Mounts; - FILEMAN->GetLoadedDrivers( Mounts ); - for( unsigned i = 0; i < Mounts.size(); ++i ) + ASSERT( !pDevice->sOsMountDir.empty() ); + + /* Unmount any previous mounts for this mountpoint. */ + vector Mounts; + FILEMAN->GetLoadedDrivers( Mounts ); + for( unsigned i = 0; i < Mounts.size(); ++i ) { - if( Mounts[i].Type.CompareNoCase( "dir" ) ) - continue; // wrong type + if( Mounts[i].Type.CompareNoCase( "dir" ) ) + continue; // wrong type if( Mounts[i].MountPoint.CompareNoCase( sMountPoint ) ) - continue; // wrong mount point - FILEMAN->Unmount( Mounts[i].Type, Mounts[i].Root, Mounts[i].MountPoint ); + continue; // wrong mount point + FILEMAN->Unmount( Mounts[i].Type, Mounts[i].Root, Mounts[i].MountPoint ); } - - FILEMAN->Mount( "dir", pDevice->sOsMountDir, sMountPoint.c_str() ); - LOG->Trace( "FILEMAN->Mount %s %s", pDevice->sOsMountDir.c_str(), sMountPoint.c_str() ); + + FILEMAN->Mount( "dir", pDevice->sOsMountDir, sMountPoint.c_str() ); + LOG->Trace( "FILEMAN->Mount %s %s", pDevice->sOsMountDir.c_str(), sMountPoint.c_str() ); } void MemoryCardDriverThreaded_Linux::Unmount( UsbStorageDevice* pDevice, CString sMountPoint ) { if( pDevice->sOsMountDir.empty() ) return; - + // already unmounted by the mounting thread } @@ -638,7 +638,7 @@ void MemoryCardDriverThreaded_Linux::Flush( UsbStorageDevice* pDevice ) { if( pDevice->sOsMountDir.empty() ) return; - + // "sync" will only flush all file systems at the same time. -Chris // I don't think so. Also, sync() merely queues a flush; it doesn't guarantee // that the flush is completed on return. However, we can mount the filesystem