1*acea8879SAndroid Build Coastguard Worker /* 2*acea8879SAndroid Build Coastguard Worker * Copyright (C) 2007 The Android Open Source Project 3*acea8879SAndroid Build Coastguard Worker * 4*acea8879SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*acea8879SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*acea8879SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*acea8879SAndroid Build Coastguard Worker * 8*acea8879SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*acea8879SAndroid Build Coastguard Worker * 10*acea8879SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*acea8879SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*acea8879SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*acea8879SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*acea8879SAndroid Build Coastguard Worker * limitations under the License. 15*acea8879SAndroid Build Coastguard Worker */ 16*acea8879SAndroid Build Coastguard Worker 17*acea8879SAndroid Build Coastguard Worker #include "mounts.h" 18*acea8879SAndroid Build Coastguard Worker 19*acea8879SAndroid Build Coastguard Worker #include <errno.h> 20*acea8879SAndroid Build Coastguard Worker #include <fcntl.h> 21*acea8879SAndroid Build Coastguard Worker #include <mntent.h> 22*acea8879SAndroid Build Coastguard Worker #include <stdio.h> 23*acea8879SAndroid Build Coastguard Worker #include <stdlib.h> 24*acea8879SAndroid Build Coastguard Worker #include <string.h> 25*acea8879SAndroid Build Coastguard Worker #include <sys/mount.h> 26*acea8879SAndroid Build Coastguard Worker 27*acea8879SAndroid Build Coastguard Worker #include <string> 28*acea8879SAndroid Build Coastguard Worker #include <vector> 29*acea8879SAndroid Build Coastguard Worker 30*acea8879SAndroid Build Coastguard Worker #include <android-base/logging.h> 31*acea8879SAndroid Build Coastguard Worker 32*acea8879SAndroid Build Coastguard Worker struct MountedVolume { 33*acea8879SAndroid Build Coastguard Worker std::string device; 34*acea8879SAndroid Build Coastguard Worker std::string mount_point; 35*acea8879SAndroid Build Coastguard Worker std::string filesystem; 36*acea8879SAndroid Build Coastguard Worker std::string flags; 37*acea8879SAndroid Build Coastguard Worker }; 38*acea8879SAndroid Build Coastguard Worker 39*acea8879SAndroid Build Coastguard Worker static std::vector<MountedVolume*> g_mounts_state; 40*acea8879SAndroid Build Coastguard Worker scan_mounted_volumes()41*acea8879SAndroid Build Coastguard Workerbool scan_mounted_volumes() { 42*acea8879SAndroid Build Coastguard Worker for (size_t i = 0; i < g_mounts_state.size(); ++i) { 43*acea8879SAndroid Build Coastguard Worker delete g_mounts_state[i]; 44*acea8879SAndroid Build Coastguard Worker } 45*acea8879SAndroid Build Coastguard Worker g_mounts_state.clear(); 46*acea8879SAndroid Build Coastguard Worker 47*acea8879SAndroid Build Coastguard Worker // Open and read mount table entries. 48*acea8879SAndroid Build Coastguard Worker FILE* fp = setmntent("/proc/mounts", "re"); 49*acea8879SAndroid Build Coastguard Worker if (fp == NULL) { 50*acea8879SAndroid Build Coastguard Worker return false; 51*acea8879SAndroid Build Coastguard Worker } 52*acea8879SAndroid Build Coastguard Worker mntent* e; 53*acea8879SAndroid Build Coastguard Worker while ((e = getmntent(fp)) != NULL) { 54*acea8879SAndroid Build Coastguard Worker MountedVolume* v = new MountedVolume; 55*acea8879SAndroid Build Coastguard Worker v->device = e->mnt_fsname; 56*acea8879SAndroid Build Coastguard Worker v->mount_point = e->mnt_dir; 57*acea8879SAndroid Build Coastguard Worker v->filesystem = e->mnt_type; 58*acea8879SAndroid Build Coastguard Worker v->flags = e->mnt_opts; 59*acea8879SAndroid Build Coastguard Worker g_mounts_state.push_back(v); 60*acea8879SAndroid Build Coastguard Worker } 61*acea8879SAndroid Build Coastguard Worker endmntent(fp); 62*acea8879SAndroid Build Coastguard Worker return true; 63*acea8879SAndroid Build Coastguard Worker } 64*acea8879SAndroid Build Coastguard Worker find_mounted_volume_by_mount_point(const char * mount_point)65*acea8879SAndroid Build Coastguard WorkerMountedVolume* find_mounted_volume_by_mount_point(const char* mount_point) { 66*acea8879SAndroid Build Coastguard Worker for (size_t i = 0; i < g_mounts_state.size(); ++i) { 67*acea8879SAndroid Build Coastguard Worker if (g_mounts_state[i]->mount_point == mount_point) return g_mounts_state[i]; 68*acea8879SAndroid Build Coastguard Worker } 69*acea8879SAndroid Build Coastguard Worker return nullptr; 70*acea8879SAndroid Build Coastguard Worker } 71*acea8879SAndroid Build Coastguard Worker unmount_mounted_volume(MountedVolume * volume)72*acea8879SAndroid Build Coastguard Workerint unmount_mounted_volume(MountedVolume* volume) { 73*acea8879SAndroid Build Coastguard Worker // Intentionally pass the empty string to umount if the caller tries to unmount a volume they 74*acea8879SAndroid Build Coastguard Worker // already unmounted using this function. 75*acea8879SAndroid Build Coastguard Worker std::string mount_point = volume->mount_point; 76*acea8879SAndroid Build Coastguard Worker volume->mount_point.clear(); 77*acea8879SAndroid Build Coastguard Worker int result = umount(mount_point.c_str()); 78*acea8879SAndroid Build Coastguard Worker if (result == -1) { 79*acea8879SAndroid Build Coastguard Worker PLOG(WARNING) << "Failed to umount " << mount_point; 80*acea8879SAndroid Build Coastguard Worker } 81*acea8879SAndroid Build Coastguard Worker return result; 82*acea8879SAndroid Build Coastguard Worker } 83