1*f40fafd4SAndroid Build Coastguard Worker /* 2*f40fafd4SAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project 3*f40fafd4SAndroid Build Coastguard Worker * 4*f40fafd4SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*f40fafd4SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*f40fafd4SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*f40fafd4SAndroid Build Coastguard Worker * 8*f40fafd4SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*f40fafd4SAndroid Build Coastguard Worker * 10*f40fafd4SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*f40fafd4SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*f40fafd4SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f40fafd4SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*f40fafd4SAndroid Build Coastguard Worker * limitations under the License. 15*f40fafd4SAndroid Build Coastguard Worker */ 16*f40fafd4SAndroid Build Coastguard Worker 17*f40fafd4SAndroid Build Coastguard Worker #ifndef ANDROID_VOLD_VOLUME_BASE_H 18*f40fafd4SAndroid Build Coastguard Worker #define ANDROID_VOLD_VOLUME_BASE_H 19*f40fafd4SAndroid Build Coastguard Worker 20*f40fafd4SAndroid Build Coastguard Worker #include "Utils.h" 21*f40fafd4SAndroid Build Coastguard Worker #include "android/os/IVoldListener.h" 22*f40fafd4SAndroid Build Coastguard Worker #include "android/os/IVoldMountCallback.h" 23*f40fafd4SAndroid Build Coastguard Worker 24*f40fafd4SAndroid Build Coastguard Worker #include <cutils/multiuser.h> 25*f40fafd4SAndroid Build Coastguard Worker #include <utils/Errors.h> 26*f40fafd4SAndroid Build Coastguard Worker 27*f40fafd4SAndroid Build Coastguard Worker #include <sys/types.h> 28*f40fafd4SAndroid Build Coastguard Worker #include <list> 29*f40fafd4SAndroid Build Coastguard Worker #include <string> 30*f40fafd4SAndroid Build Coastguard Worker 31*f40fafd4SAndroid Build Coastguard Worker static constexpr userid_t USER_UNKNOWN = ((userid_t)-1); 32*f40fafd4SAndroid Build Coastguard Worker 33*f40fafd4SAndroid Build Coastguard Worker namespace android { 34*f40fafd4SAndroid Build Coastguard Worker namespace vold { 35*f40fafd4SAndroid Build Coastguard Worker 36*f40fafd4SAndroid Build Coastguard Worker /* 37*f40fafd4SAndroid Build Coastguard Worker * Representation of a mounted volume ready for presentation. 38*f40fafd4SAndroid Build Coastguard Worker * 39*f40fafd4SAndroid Build Coastguard Worker * Various subclasses handle the different mounting prerequisites, such as 40*f40fafd4SAndroid Build Coastguard Worker * encryption details, etc. Volumes can also be "stacked" above other 41*f40fafd4SAndroid Build Coastguard Worker * volumes to help communicate dependencies. For example, an ASEC volume 42*f40fafd4SAndroid Build Coastguard Worker * can be stacked on a vfat volume. 43*f40fafd4SAndroid Build Coastguard Worker * 44*f40fafd4SAndroid Build Coastguard Worker * Mounted volumes can be asked to manage bind mounts to present themselves 45*f40fafd4SAndroid Build Coastguard Worker * to specific users on the device. 46*f40fafd4SAndroid Build Coastguard Worker * 47*f40fafd4SAndroid Build Coastguard Worker * When an unmount is requested, the volume recursively unmounts any stacked 48*f40fafd4SAndroid Build Coastguard Worker * volumes and removes any bind mounts before finally unmounting itself. 49*f40fafd4SAndroid Build Coastguard Worker */ 50*f40fafd4SAndroid Build Coastguard Worker class VolumeBase { 51*f40fafd4SAndroid Build Coastguard Worker public: 52*f40fafd4SAndroid Build Coastguard Worker virtual ~VolumeBase(); 53*f40fafd4SAndroid Build Coastguard Worker 54*f40fafd4SAndroid Build Coastguard Worker enum class Type { 55*f40fafd4SAndroid Build Coastguard Worker kPublic = 0, 56*f40fafd4SAndroid Build Coastguard Worker kPrivate, 57*f40fafd4SAndroid Build Coastguard Worker kEmulated, 58*f40fafd4SAndroid Build Coastguard Worker kAsec, 59*f40fafd4SAndroid Build Coastguard Worker kObb, 60*f40fafd4SAndroid Build Coastguard Worker kStub, 61*f40fafd4SAndroid Build Coastguard Worker }; 62*f40fafd4SAndroid Build Coastguard Worker 63*f40fafd4SAndroid Build Coastguard Worker enum MountFlags { 64*f40fafd4SAndroid Build Coastguard Worker /* Flag that volume is primary external storage */ 65*f40fafd4SAndroid Build Coastguard Worker kPrimary = 1 << 0, 66*f40fafd4SAndroid Build Coastguard Worker /* 67*f40fafd4SAndroid Build Coastguard Worker * Flags indicating that volume is visible to normal apps. 68*f40fafd4SAndroid Build Coastguard Worker * kVisibleForRead and kVisibleForWrite correspond to 69*f40fafd4SAndroid Build Coastguard Worker * VolumeInfo.MOUNT_FLAG_VISIBLE_FOR_READ and 70*f40fafd4SAndroid Build Coastguard Worker * VolumeInfo.MOUNT_FLAG_VISIBLE_FOR_WRITE, respectively. 71*f40fafd4SAndroid Build Coastguard Worker */ 72*f40fafd4SAndroid Build Coastguard Worker kVisibleForRead = 1 << 1, 73*f40fafd4SAndroid Build Coastguard Worker kVisibleForWrite = 1 << 2, 74*f40fafd4SAndroid Build Coastguard Worker }; 75*f40fafd4SAndroid Build Coastguard Worker 76*f40fafd4SAndroid Build Coastguard Worker enum class State { 77*f40fafd4SAndroid Build Coastguard Worker kUnmounted = 0, 78*f40fafd4SAndroid Build Coastguard Worker kChecking, 79*f40fafd4SAndroid Build Coastguard Worker kMounted, 80*f40fafd4SAndroid Build Coastguard Worker kMountedReadOnly, 81*f40fafd4SAndroid Build Coastguard Worker kFormatting, 82*f40fafd4SAndroid Build Coastguard Worker kEjecting, 83*f40fafd4SAndroid Build Coastguard Worker kUnmountable, 84*f40fafd4SAndroid Build Coastguard Worker kRemoved, 85*f40fafd4SAndroid Build Coastguard Worker kBadRemoval, 86*f40fafd4SAndroid Build Coastguard Worker }; 87*f40fafd4SAndroid Build Coastguard Worker getId()88*f40fafd4SAndroid Build Coastguard Worker const std::string& getId() const { return mId; } getDiskId()89*f40fafd4SAndroid Build Coastguard Worker const std::string& getDiskId() const { return mDiskId; } getPartGuid()90*f40fafd4SAndroid Build Coastguard Worker const std::string& getPartGuid() const { return mPartGuid; } getType()91*f40fafd4SAndroid Build Coastguard Worker Type getType() const { return mType; } getMountFlags()92*f40fafd4SAndroid Build Coastguard Worker int getMountFlags() const { return mMountFlags; } getMountUserId()93*f40fafd4SAndroid Build Coastguard Worker userid_t getMountUserId() const { return mMountUserId; } getState()94*f40fafd4SAndroid Build Coastguard Worker State getState() const { return mState; } getPath()95*f40fafd4SAndroid Build Coastguard Worker const std::string& getPath() const { return mPath; } getInternalPath()96*f40fafd4SAndroid Build Coastguard Worker const std::string& getInternalPath() const { return mInternalPath; } getVolumes()97*f40fafd4SAndroid Build Coastguard Worker const std::list<std::shared_ptr<VolumeBase>>& getVolumes() const { return mVolumes; } 98*f40fafd4SAndroid Build Coastguard Worker 99*f40fafd4SAndroid Build Coastguard Worker status_t setDiskId(const std::string& diskId); 100*f40fafd4SAndroid Build Coastguard Worker status_t setPartGuid(const std::string& partGuid); 101*f40fafd4SAndroid Build Coastguard Worker status_t setMountFlags(int mountFlags); 102*f40fafd4SAndroid Build Coastguard Worker status_t setMountUserId(userid_t mountUserId); 103*f40fafd4SAndroid Build Coastguard Worker status_t setMountCallback(const android::sp<android::os::IVoldMountCallback>& callback); 104*f40fafd4SAndroid Build Coastguard Worker status_t setSilent(bool silent); 105*f40fafd4SAndroid Build Coastguard Worker 106*f40fafd4SAndroid Build Coastguard Worker void addVolume(const std::shared_ptr<VolumeBase>& volume); 107*f40fafd4SAndroid Build Coastguard Worker void removeVolume(const std::shared_ptr<VolumeBase>& volume); 108*f40fafd4SAndroid Build Coastguard Worker 109*f40fafd4SAndroid Build Coastguard Worker std::shared_ptr<VolumeBase> findVolume(const std::string& id); 110*f40fafd4SAndroid Build Coastguard Worker isEmulated()111*f40fafd4SAndroid Build Coastguard Worker bool isEmulated() { return mType == Type::kEmulated; } isVisibleForRead()112*f40fafd4SAndroid Build Coastguard Worker bool isVisibleForRead() const { return (mMountFlags & MountFlags::kVisibleForRead) != 0; } isVisibleForWrite()113*f40fafd4SAndroid Build Coastguard Worker bool isVisibleForWrite() const { return (mMountFlags & MountFlags::kVisibleForWrite) != 0; } isVisible()114*f40fafd4SAndroid Build Coastguard Worker bool isVisible() const { return isVisibleForRead() || isVisibleForWrite(); } 115*f40fafd4SAndroid Build Coastguard Worker 116*f40fafd4SAndroid Build Coastguard Worker status_t create(); 117*f40fafd4SAndroid Build Coastguard Worker status_t destroy(); 118*f40fafd4SAndroid Build Coastguard Worker status_t mount(); 119*f40fafd4SAndroid Build Coastguard Worker status_t unmount(); 120*f40fafd4SAndroid Build Coastguard Worker status_t format(const std::string& fsType); 121*f40fafd4SAndroid Build Coastguard Worker 122*f40fafd4SAndroid Build Coastguard Worker virtual std::string getRootPath() const; 123*f40fafd4SAndroid Build Coastguard Worker 124*f40fafd4SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& stream) const; 125*f40fafd4SAndroid Build Coastguard Worker 126*f40fafd4SAndroid Build Coastguard Worker protected: 127*f40fafd4SAndroid Build Coastguard Worker explicit VolumeBase(Type type); 128*f40fafd4SAndroid Build Coastguard Worker 129*f40fafd4SAndroid Build Coastguard Worker virtual status_t doCreate(); 130*f40fafd4SAndroid Build Coastguard Worker virtual status_t doDestroy(); 131*f40fafd4SAndroid Build Coastguard Worker virtual status_t doMount() = 0; 132*f40fafd4SAndroid Build Coastguard Worker virtual void doPostMount(); 133*f40fafd4SAndroid Build Coastguard Worker virtual status_t doUnmount() = 0; 134*f40fafd4SAndroid Build Coastguard Worker virtual status_t doFormat(const std::string& fsType); 135*f40fafd4SAndroid Build Coastguard Worker 136*f40fafd4SAndroid Build Coastguard Worker status_t setId(const std::string& id); 137*f40fafd4SAndroid Build Coastguard Worker status_t setPath(const std::string& path); 138*f40fafd4SAndroid Build Coastguard Worker status_t setInternalPath(const std::string& internalPath); 139*f40fafd4SAndroid Build Coastguard Worker 140*f40fafd4SAndroid Build Coastguard Worker android::sp<android::os::IVoldListener> getListener() const; 141*f40fafd4SAndroid Build Coastguard Worker android::sp<android::os::IVoldMountCallback> getMountCallback() const; 142*f40fafd4SAndroid Build Coastguard Worker 143*f40fafd4SAndroid Build Coastguard Worker private: 144*f40fafd4SAndroid Build Coastguard Worker /* ID that uniquely references volume while alive */ 145*f40fafd4SAndroid Build Coastguard Worker std::string mId; 146*f40fafd4SAndroid Build Coastguard Worker /* ID that uniquely references parent disk while alive */ 147*f40fafd4SAndroid Build Coastguard Worker std::string mDiskId; 148*f40fafd4SAndroid Build Coastguard Worker /* Partition GUID of this volume */ 149*f40fafd4SAndroid Build Coastguard Worker std::string mPartGuid; 150*f40fafd4SAndroid Build Coastguard Worker /* Volume type */ 151*f40fafd4SAndroid Build Coastguard Worker Type mType; 152*f40fafd4SAndroid Build Coastguard Worker /* Flags used when mounting this volume */ 153*f40fafd4SAndroid Build Coastguard Worker int mMountFlags; 154*f40fafd4SAndroid Build Coastguard Worker /* User that owns this volume, otherwise -1 */ 155*f40fafd4SAndroid Build Coastguard Worker userid_t mMountUserId; 156*f40fafd4SAndroid Build Coastguard Worker /* Flag indicating object is created */ 157*f40fafd4SAndroid Build Coastguard Worker bool mCreated; 158*f40fafd4SAndroid Build Coastguard Worker /* Current state of volume */ 159*f40fafd4SAndroid Build Coastguard Worker State mState; 160*f40fafd4SAndroid Build Coastguard Worker /* Path to mounted volume */ 161*f40fafd4SAndroid Build Coastguard Worker std::string mPath; 162*f40fafd4SAndroid Build Coastguard Worker /* Path to internal backing storage */ 163*f40fafd4SAndroid Build Coastguard Worker std::string mInternalPath; 164*f40fafd4SAndroid Build Coastguard Worker /* Flag indicating that volume should emit no events */ 165*f40fafd4SAndroid Build Coastguard Worker bool mSilent; 166*f40fafd4SAndroid Build Coastguard Worker android::sp<android::os::IVoldMountCallback> mMountCallback; 167*f40fafd4SAndroid Build Coastguard Worker 168*f40fafd4SAndroid Build Coastguard Worker /* Volumes stacked on top of this volume */ 169*f40fafd4SAndroid Build Coastguard Worker std::list<std::shared_ptr<VolumeBase>> mVolumes; 170*f40fafd4SAndroid Build Coastguard Worker 171*f40fafd4SAndroid Build Coastguard Worker void setState(State state); 172*f40fafd4SAndroid Build Coastguard Worker 173*f40fafd4SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(VolumeBase); 174*f40fafd4SAndroid Build Coastguard Worker }; 175*f40fafd4SAndroid Build Coastguard Worker 176*f40fafd4SAndroid Build Coastguard Worker } // namespace vold 177*f40fafd4SAndroid Build Coastguard Worker } // namespace android 178*f40fafd4SAndroid Build Coastguard Worker 179*f40fafd4SAndroid Build Coastguard Worker #endif 180