root/src/add-ons/kernel/file_systems/userlandfs/private/AreaSupport.cpp
// AreaSupport.cpp

#include "AreaSupport.h"

// get_area_for_address
status_t
UserlandFSUtil::get_area_for_address(void* address, int32 size, area_id* area,
        int32* offset, void** areaBaseAddress)
{
        // check parameters
        if (!area || !offset || size < 0)
                return B_BAD_VALUE;
        // catch NULL address case
        if (!address) {
                *area = -1;
                *offset = 0;
                return B_OK;
        }
        // get area and in-area offset
        *area = area_for(address);
        if (*area < 0)
                return *area;
        area_info areaInfo;
        status_t error = get_area_info(*area, &areaInfo);
        if (error != B_OK)
                return error;
        // check the size
        *offset = (uint8*)address - (uint8*)areaInfo.address;
        if (*offset + size > (int32)areaInfo.size)
                return B_BAD_VALUE;
        if (areaBaseAddress)
                *areaBaseAddress = areaInfo.address;
        return B_OK;
}