DirectVolume.cpp 3.62 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * 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>
18
#include <stdlib.h>
19
#include <string.h>
20
#include <errno.h>
21 22 23 24

#define LOG_TAG "Vold"

#include <cutils/log.h>
25
#include <sysutils/NetlinkEvent.h>
26

27
#include "DirectVolume.h"
28

29
DirectVolume::DirectVolume(const char *label, const char *mount_point, int partIdx) :
30 31 32 33 34 35
              Volume(label, mount_point) {
    mPartIdx = partIdx;
  
    mPaths = new PathCollection();
}

36
DirectVolume::~DirectVolume() {
37 38 39 40 41 42 43
    PathCollection::iterator it;

    for (it = mPaths->begin(); it != mPaths->end(); ++it)
        free(*it);
    delete mPaths;
}

44
int DirectVolume::addPath(const char *path) {
45 46 47 48
    mPaths->push_back(strdup(path));
    return 0;
}

49
int DirectVolume::handleBlockEvent(NetlinkEvent *evt) {
50
    const char *dp = evt->findParam("DEVPATH");
51

52
    PathCollection::iterator  it;
53 54
    for (it = mPaths->begin(); it != mPaths->end(); ++it) {
        if (!strncmp(dp, *it, strlen(*it))) {
55 56 57 58 59 60 61 62 63 64 65
            /* 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");
66
            } else {
67 68 69 70 71 72
                if (action == NetlinkEvent::NlActionAdd)
                    handlePartitionAdded(dp, evt);
                else if (action == NetlinkEvent::NlActionRemove)
                    handlePartitionRemoved(dp, evt);
                else
                    LOGD("Ignoring non add/remove event");
73
            }
74

75 76 77 78 79 80
            return 0;
        }
    }
    errno = ENODEV;
    return -1;
}
81

82
void DirectVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) {
83 84 85 86 87
    mDiskMaj = atoi(evt->findParam("MAJOR"));
    mDiskNumParts = atoi(evt->findParam("NPARTS"));

    int partmask = 0;
    int i;
88
    for (i = 1; i <= mDiskNumParts; i++) {
89 90 91 92 93 94 95 96 97 98 99 100 101 102
        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);
    }
}

103
void DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt) {
104 105 106
    int major = atoi(evt->findParam("MAJOR"));
    int minor = atoi(evt->findParam("MINOR"));
    int part_num = atoi(evt->findParam("PARTN"));
107 108 109 110 111 112 113 114

    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);
    }
115 116
}

117
void DirectVolume::handleDiskRemoved(const char *devpath, NetlinkEvent *evt) {
118 119
}

120
void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt) {
121
}