VolumeManager.cpp revision ae10b91044bf76b40b77d81c169e48e0bbdf6d75
1f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat/* 2f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Copyright (C) 2008 The Android Open Source Project 3f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 4f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * you may not use this file except in compliance with the License. 6f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * You may obtain a copy of the License at 7f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 8f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 10f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Unless required by applicable law or agreed to in writing, software 11f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * See the License for the specific language governing permissions and 14f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * limitations under the License. 15f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat */ 16f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 17f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <stdio.h> 18fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat#include <stdlib.h> 19fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat#include <string.h> 20f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <errno.h> 21f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 22f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#define LOG_TAG "Vold" 23f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 24f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h> 25f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 26fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat#include <sysutils/NetlinkEvent.h> 27fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "VolumeManager.h" 29ae10b91044bf76b40b77d81c169e48e0bbdf6d75San Mehat#include "DirectVolume.h" 30f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "ErrorCode.h" 31f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 32f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatVolumeManager *VolumeManager::sInstance = NULL; 33f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 34f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatVolumeManager *VolumeManager::Instance() { 35f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat if (!sInstance) 36f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat sInstance = new VolumeManager(); 37f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return sInstance; 38f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 39f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 40f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatVolumeManager::VolumeManager() { 41f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mBlockDevices = new BlockDeviceCollection(); 42f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mVolumes = new VolumeCollection(); 43f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mBroadcaster = NULL; 44f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 45f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 46f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatVolumeManager::~VolumeManager() { 47f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat delete mBlockDevices; 48f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 49f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 50f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint VolumeManager::start() { 51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 52f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 53f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 54f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint VolumeManager::stop() { 55f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 56f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 57f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 58f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint VolumeManager::addVolume(Volume *v) { 59f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mVolumes->push_back(v); 60f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 61f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 62f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 63fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehatvoid VolumeManager::handleBlockEvent(NetlinkEvent *evt) { 64fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat const char *devpath = evt->findParam("DEVPATH"); 65f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 66fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat /* Lookup a volume to handle this device */ 67f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat VolumeCollection::iterator it; 68f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat bool hit = false; 69f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat for (it = mVolumes->begin(); it != mVolumes->end(); ++it) { 70fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat if (!(*it)->handleBlockEvent(evt)) { 71f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat hit = true; 72f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat break; 73f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 74f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 75f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 76f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat if (!hit) { 77fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat LOGW("No volumes handled block event for '%s'", devpath); 78f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 79f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 80f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 81f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint VolumeManager::listVolumes(SocketClient *cli) { 82f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat VolumeCollection::iterator i; 83f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 84f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat for (i = mVolumes->begin(); i != mVolumes->end(); ++i) { 85f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat char *buffer; 86f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat asprintf(&buffer, "%s %s %d", 87f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat (*i)->getLabel(), (*i)->getMountpoint(), 88f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat (*i)->getState()); 89f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat cli->sendMsg(ErrorCode::VolumeListResult, buffer, false); 90f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat free(buffer); 91f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 92f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat cli->sendMsg(ErrorCode::CommandOkay, "Volumes Listed", false); 93f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 94f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 95