@ -985,6 +985,19 @@ int VolumeManager::mountAsec(const char *id, const char *key, int ownerUid) {
return 0 ;
}
Volume * VolumeManager : : getVolumeForFile ( const char * fileName ) {
VolumeCollection : : iterator i ;
for ( i = mVolumes - > begin ( ) ; i ! = mVolumes - > end ( ) ; + + i ) {
const char * mountPoint = ( * i ) - > getMountpoint ( ) ;
if ( ! strncmp ( fileName , mountPoint , strlen ( mountPoint ) ) ) {
return * i ;
}
}
return NULL ;
}
/**
* Mounts an image file < code > img < / code > .
*/
@ -1113,7 +1126,7 @@ int VolumeManager::listMountedObbs(SocketClient* cli) {
}
// Create a string to compare against that has a trailing slash
int loopDirLen = sizeof ( Volume : : LOOPDIR ) ;
int loopDirLen = strlen ( Volume : : LOOPDIR ) ;
char loopDir [ loopDirLen + 2 ] ;
strcpy ( loopDir , Volume : : LOOPDIR ) ;
loopDir [ loopDirLen + + ] = ' / ' ;
@ -1462,25 +1475,35 @@ bool VolumeManager::isMountpointMounted(const char *mp)
}
int VolumeManager : : cleanupAsec ( Volume * v , bool force ) {
while ( mActiveContainers - > size ( ) ) {
AsecIdCollection : : iterator it = mActiveContainers - > begin ( ) ;
int rc = unmountAllAsecsInDir ( Volume : : SEC_ASECDIR_EXT ) ;
AsecIdCollection toUnmount ;
// Find the remaining OBB files that are on external storage.
for ( AsecIdCollection : : iterator it = mActiveContainers - > begin ( ) ; it ! = mActiveContainers - > end ( ) ;
+ + it ) {
ContainerData * cd = * it ;
SLOGI ( " Unmounting ASEC %s (dependant on %s) " , cd - > id , v - > getMountpoint ( ) ) ;
if ( cd - > type = = ASEC ) {
if ( unmountAsec ( cd - > id , force ) ) {
SLOGE ( " Failed to unmount ASEC %s (%s) " , cd - > id , strerror ( errno ) ) ;
return - 1 ;
}
// nothing
} else if ( cd - > type = = OBB ) {
if ( unmountObb ( cd - > id , force ) ) {
SLOGE ( " Failed to unmount OBB %s (%s) " , cd - > id , strerror ( errno ) ) ;
return - 1 ;
if ( v = = getVolumeForFile ( cd - > id ) ) {
toUnmount . push_back ( cd ) ;
}
} else {
SLOGE ( " Unknown container type %d! " , cd - > type ) ;
return - 1 ;
}
}
return 0 ;
for ( AsecIdCollection : : iterator it = toUnmount . begin ( ) ; it ! = toUnmount . end ( ) ; + + it ) {
ContainerData * cd = * it ;
SLOGI ( " Unmounting ASEC %s (dependant on %s) " , cd - > id , v - > getMountpoint ( ) ) ;
if ( unmountObb ( cd - > id , force ) ) {
SLOGE ( " Failed to unmount OBB %s (%s) " , cd - > id , strerror ( errno ) ) ;
rc = - 1 ;
}
}
return rc ;
}