• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _VOLUME_H
18 #define _VOLUME_H
19 
20 #include <utils/List.h>
21 
22 class NetlinkEvent;
23 class VolumeManager;
24 
25 class Volume {
26 private:
27     int mState;
28 
29 public:
30     static const int State_Init       = -1;
31     static const int State_NoMedia    = 0;
32     static const int State_Idle       = 1;
33     static const int State_Pending    = 2;
34     static const int State_Checking   = 3;
35     static const int State_Mounted    = 4;
36     static const int State_Unmounting = 5;
37     static const int State_Formatting = 6;
38     static const int State_Shared     = 7;
39     static const int State_SharedMnt  = 8;
40 
41     static const char *SECDIR;
42     static const char *SEC_STGDIR;
43     static const char *SEC_STG_SECIMGDIR;
44     static const char *SEC_ASECDIR_EXT;
45     static const char *SEC_ASECDIR_INT;
46     static const char *ASECDIR;
47 
48     static const char *LOOPDIR;
49 
50 protected:
51     char *mLabel;
52     char *mMountpoint;
53     VolumeManager *mVm;
54     bool mDebug;
55     int mPartIdx;
56     int mOrigPartIdx;
57     bool mRetryMount;
58 
59     /*
60      * The major/minor tuple of the currently mounted filesystem.
61      */
62     dev_t mCurrentlyMountedKdev;
63 
64 public:
65     Volume(VolumeManager *vm, const char *label, const char *mount_point);
66     virtual ~Volume();
67 
68     int mountVol();
69     int unmountVol(bool force, bool revert);
70     int formatVol();
71 
getLabel()72     const char *getLabel() { return mLabel; }
getMountpoint()73     const char *getMountpoint() { return mMountpoint; }
getState()74     int getState() { return mState; }
75 
76     virtual int handleBlockEvent(NetlinkEvent *evt);
77     virtual dev_t getDiskDevice();
78     virtual dev_t getShareDevice();
79     virtual void handleVolumeShared();
80     virtual void handleVolumeUnshared();
81 
82     void setDebug(bool enable);
83     virtual int getVolInfo(struct volume_info *v) = 0;
84 
85 protected:
86     void setState(int state);
87 
88     virtual int getDeviceNodes(dev_t *devs, int max) = 0;
89     virtual int updateDeviceInfo(char *new_path, int new_major, int new_minor) = 0;
90     virtual void revertDeviceInfo(void) = 0;
91     virtual int isDecrypted(void) = 0;
92     virtual int getFlags(void) = 0;
93 
94     int createDeviceNode(const char *path, int major, int minor);
95 
96 private:
97     int initializeMbr(const char *deviceNode);
98     bool isMountpointMounted(const char *path);
99     int createBindMounts();
100     int doUnmount(const char *path, bool force);
101     int doMoveMount(const char *src, const char *dst, bool force);
102     void protectFromAutorunStupidity();
103 };
104 
105 typedef android::List<Volume *> VolumeCollection;
106 
107 #endif
108