2009-10-11 02:22:08 +02:00
|
|
|
/*
|
|
|
|
* 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>
|
2009-10-12 20:32:47 +02:00
|
|
|
#include <stdlib.h>
|
2009-10-11 02:22:08 +02:00
|
|
|
#include <string.h>
|
2009-10-12 20:32:47 +02:00
|
|
|
#include <errno.h>
|
2009-10-11 02:22:08 +02:00
|
|
|
|
|
|
|
#define LOG_TAG "Vold"
|
|
|
|
|
|
|
|
#include <cutils/log.h>
|
2009-10-12 20:32:47 +02:00
|
|
|
#include <sysutils/NetlinkEvent.h>
|
2009-10-11 02:22:08 +02:00
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
#include "DirectVolume.h"
|
2009-10-11 02:22:08 +02:00
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
DirectVolume::DirectVolume(const char *label, const char *mount_point, int partIdx) :
|
2009-10-11 02:22:08 +02:00
|
|
|
Volume(label, mount_point) {
|
|
|
|
mPartIdx = partIdx;
|
|
|
|
|
|
|
|
mPaths = new PathCollection();
|
|
|
|
}
|
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
DirectVolume::~DirectVolume() {
|
2009-10-11 02:22:08 +02:00
|
|
|
PathCollection::iterator it;
|
|
|
|
|
|
|
|
for (it = mPaths->begin(); it != mPaths->end(); ++it)
|
|
|
|
free(*it);
|
|
|
|
delete mPaths;
|
|
|
|
}
|
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
int DirectVolume::addPath(const char *path) {
|
2009-10-11 02:22:08 +02:00
|
|
|
mPaths->push_back(strdup(path));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
int DirectVolume::handleBlockEvent(NetlinkEvent *evt) {
|
2009-10-12 20:32:47 +02:00
|
|
|
const char *dp = evt->findParam("DEVPATH");
|
2009-10-11 02:22:08 +02:00
|
|
|
|
2009-10-12 20:32:47 +02:00
|
|
|
PathCollection::iterator it;
|
2009-10-11 02:22:08 +02:00
|
|
|
for (it = mPaths->begin(); it != mPaths->end(); ++it) {
|
|
|
|
if (!strncmp(dp, *it, strlen(*it))) {
|
2009-10-12 20:32:47 +02:00
|
|
|
/* 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");
|
2009-10-11 02:22:08 +02:00
|
|
|
} else {
|
2009-10-12 20:32:47 +02:00
|
|
|
if (action == NetlinkEvent::NlActionAdd)
|
|
|
|
handlePartitionAdded(dp, evt);
|
|
|
|
else if (action == NetlinkEvent::NlActionRemove)
|
|
|
|
handlePartitionRemoved(dp, evt);
|
|
|
|
else
|
|
|
|
LOGD("Ignoring non add/remove event");
|
2009-10-11 02:22:08 +02:00
|
|
|
}
|
2009-10-12 20:32:47 +02:00
|
|
|
|
2009-10-11 02:22:08 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
errno = ENODEV;
|
|
|
|
return -1;
|
|
|
|
}
|
2009-10-12 20:32:47 +02:00
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
void DirectVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) {
|
2009-10-12 20:32:47 +02:00
|
|
|
mDiskMaj = atoi(evt->findParam("MAJOR"));
|
|
|
|
mDiskNumParts = atoi(evt->findParam("NPARTS"));
|
|
|
|
|
|
|
|
int partmask = 0;
|
|
|
|
int i;
|
2009-10-12 23:48:47 +02:00
|
|
|
for (i = 1; i <= mDiskNumParts; i++) {
|
2009-10-12 20:32:47 +02:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
void DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt) {
|
2009-10-12 20:32:47 +02:00
|
|
|
int major = atoi(evt->findParam("MAJOR"));
|
|
|
|
int minor = atoi(evt->findParam("MINOR"));
|
|
|
|
int part_num = atoi(evt->findParam("PARTN"));
|
2009-10-12 23:48:47 +02:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
2009-10-12 20:32:47 +02:00
|
|
|
}
|
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
void DirectVolume::handleDiskRemoved(const char *devpath, NetlinkEvent *evt) {
|
2009-10-12 20:32:47 +02:00
|
|
|
}
|
|
|
|
|
2009-10-12 23:57:05 +02:00
|
|
|
void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt) {
|
2009-10-12 20:32:47 +02:00
|
|
|
}
|
2009-10-13 01:29:01 +02:00
|
|
|
|
|
|
|
int DirectVolume::prepareToMount(int *major, int *minor) {
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
}
|