diff options
author | San Mehat <san@android.com> | 2009-10-12 14:57:05 -0700 |
---|---|---|
committer | San Mehat <san@android.com> | 2009-10-12 15:03:15 -0700 |
commit | ae10b91044bf76b40b77d81c169e48e0bbdf6d75 (patch) | |
tree | d89d84f24b0ae649b0a1b4c61b4f6b87cc3b7983 /DirectVolume.cpp | |
parent | 3578c41ef138cb3edf38bb488cb9864921f55c79 (diff) | |
download | system_vold-ae10b91044bf76b40b77d81c169e48e0bbdf6d75.tar.gz system_vold-ae10b91044bf76b40b77d81c169e48e0bbdf6d75.tar.bz2 system_vold-ae10b91044bf76b40b77d81c169e48e0bbdf6d75.zip |
vold2: Rename DeviceVolume -> DirectVolume
Signed-off-by: San Mehat <san@android.com>
Diffstat (limited to 'DirectVolume.cpp')
-rw-r--r-- | DirectVolume.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/DirectVolume.cpp b/DirectVolume.cpp new file mode 100644 index 0000000..0817624 --- /dev/null +++ b/DirectVolume.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#define LOG_TAG "Vold" + +#include <cutils/log.h> +#include <sysutils/NetlinkEvent.h> + +#include "DirectVolume.h" + +DirectVolume::DirectVolume(const char *label, const char *mount_point, int partIdx) : + Volume(label, mount_point) { + mPartIdx = partIdx; + + mPaths = new PathCollection(); +} + +DirectVolume::~DirectVolume() { + PathCollection::iterator it; + + for (it = mPaths->begin(); it != mPaths->end(); ++it) + free(*it); + delete mPaths; +} + +int DirectVolume::addPath(const char *path) { + mPaths->push_back(strdup(path)); + return 0; +} + +int DirectVolume::handleBlockEvent(NetlinkEvent *evt) { + const char *dp = evt->findParam("DEVPATH"); + + PathCollection::iterator it; + for (it = mPaths->begin(); it != mPaths->end(); ++it) { + if (!strncmp(dp, *it, strlen(*it))) { + /* We can handle this disk */ + int action = evt->getAction(); + const char *devtype = evt->findParam("DEVTYPE"); + + if (!strcmp(devtype, "disk")) { + if (action == NetlinkEvent::NlActionAdd) + handleDiskAdded(dp, evt); + else if (action == NetlinkEvent::NlActionRemove) + handleDiskRemoved(dp, evt); + else + LOGD("Ignoring non add/remove event"); + } else { + if (action == NetlinkEvent::NlActionAdd) + handlePartitionAdded(dp, evt); + else if (action == NetlinkEvent::NlActionRemove) + handlePartitionRemoved(dp, evt); + else + LOGD("Ignoring non add/remove event"); + } + + return 0; + } + } + errno = ENODEV; + return -1; +} + +void DirectVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) { + mDiskMaj = atoi(evt->findParam("MAJOR")); + mDiskNumParts = atoi(evt->findParam("NPARTS")); + + int partmask = 0; + int i; + for (i = 1; i <= mDiskNumParts; i++) { + partmask |= (1 << i); + } + mPendingPartMap = partmask; + + if (mDiskNumParts == 0) { + LOGD("Dv::diskIns - No partitions - good to go son!"); + setState(Volume::State_Idle); + } else { + LOGD("Dv::diskIns - waiting for %d partitions (mask 0x%x)", + mDiskNumParts, mPendingPartMap); + setState(Volume::State_Pending); + } +} + +void DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt) { + int major = atoi(evt->findParam("MAJOR")); + int minor = atoi(evt->findParam("MINOR")); + int part_num = atoi(evt->findParam("PARTN")); + + mPendingPartMap &= ~(1 << part_num); + if (!mPendingPartMap) { + LOGD("Dv:partAdd: Got all partitions - ready to rock!"); + setState(Volume::State_Idle); + } else { + LOGD("Dv:partAdd: pending mask now = 0x%x", mPendingPartMap); + } +} + +void DirectVolume::handleDiskRemoved(const char *devpath, NetlinkEvent *evt) { +} + +void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt) { +} |