xref: /haiku/src/add-ons/kernel/file_systems/userlandfs/private/AreaSupport.cpp (revision 83812f67529c88d4fb4b942162a9f21142e683fa)
1*83812f67SIngo Weinhold // AreaSupport.cpp
2*83812f67SIngo Weinhold 
3*83812f67SIngo Weinhold #include "AreaSupport.h"
4*83812f67SIngo Weinhold 
5*83812f67SIngo Weinhold // get_area_for_address
6*83812f67SIngo Weinhold status_t
get_area_for_address(void * address,int32 size,area_id * area,int32 * offset,void ** areaBaseAddress)7*83812f67SIngo Weinhold UserlandFSUtil::get_area_for_address(void* address, int32 size, area_id* area,
8*83812f67SIngo Weinhold 	int32* offset, void** areaBaseAddress)
9*83812f67SIngo Weinhold {
10*83812f67SIngo Weinhold 	// check parameters
11*83812f67SIngo Weinhold 	if (!area || !offset || size < 0)
12*83812f67SIngo Weinhold 		return B_BAD_VALUE;
13*83812f67SIngo Weinhold 	// catch NULL address case
14*83812f67SIngo Weinhold 	if (!address) {
15*83812f67SIngo Weinhold 		*area = -1;
16*83812f67SIngo Weinhold 		*offset = 0;
17*83812f67SIngo Weinhold 		return B_OK;
18*83812f67SIngo Weinhold 	}
19*83812f67SIngo Weinhold 	// get area and in-area offset
20*83812f67SIngo Weinhold 	*area = area_for(address);
21*83812f67SIngo Weinhold 	if (*area < 0)
22*83812f67SIngo Weinhold 		return *area;
23*83812f67SIngo Weinhold 	area_info areaInfo;
24*83812f67SIngo Weinhold 	status_t error = get_area_info(*area, &areaInfo);
25*83812f67SIngo Weinhold 	if (error != B_OK)
26*83812f67SIngo Weinhold 		return error;
27*83812f67SIngo Weinhold 	// check the size
28*83812f67SIngo Weinhold 	*offset = (uint8*)address - (uint8*)areaInfo.address;
29*83812f67SIngo Weinhold 	if (*offset + size > (int32)areaInfo.size)
30*83812f67SIngo Weinhold 		return B_BAD_VALUE;
31*83812f67SIngo Weinhold 	if (areaBaseAddress)
32*83812f67SIngo Weinhold 		*areaBaseAddress = areaInfo.address;
33*83812f67SIngo Weinhold 	return B_OK;
34*83812f67SIngo Weinhold }
35