本文整理汇总了C++中IS_USER_ADDRESS函数的典型用法代码示例。如果您正苦于以下问题:C++ IS_USER_ADDRESS函数的具体用法?C++ IS_USER_ADDRESS怎么用?C++ IS_USER_ADDRESS使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IS_USER_ADDRESS函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: _user_get_next_image_info
status_t
_user_get_next_image_info(team_id team, int32 *_cookie, image_info *userInfo,
size_t size)
{
image_info info;
status_t status;
int32 cookie;
if (size > sizeof(image_info))
return B_BAD_VALUE;
if (!IS_USER_ADDRESS(userInfo) || !IS_USER_ADDRESS(_cookie)
|| user_memcpy(&cookie, _cookie, sizeof(int32)) < B_OK) {
return B_BAD_ADDRESS;
}
status = _get_next_image_info(team, &cookie, &info, sizeof(image_info));
if (user_memcpy(userInfo, &info, size) < B_OK
|| user_memcpy(_cookie, &cookie, sizeof(int32)) < B_OK) {
return B_BAD_ADDRESS;
}
return status;
}
示例2: _user_sendto
ssize_t
_user_sendto(int socket, const void *data, size_t length, int flags,
const struct sockaddr *userAddress, socklen_t addressLength)
{
if (data == NULL || !IS_USER_ADDRESS(data))
return B_BAD_ADDRESS;
// TODO: If this is a connection-mode socket, the address parameter is
// supposed to be ignored.
if (userAddress == NULL || addressLength <= 0
|| addressLength > MAX_SOCKET_ADDRESS_LENGTH) {
return B_BAD_VALUE;
}
// copy address from userland
char address[MAX_SOCKET_ADDRESS_LENGTH];
if (!IS_USER_ADDRESS(userAddress)
|| user_memcpy(address, userAddress, addressLength) != B_OK) {
return B_BAD_ADDRESS;
}
// sendto()
SyscallRestartWrapper<ssize_t> result;
return result = common_sendto(socket, data, length, flags,
(sockaddr*)address, addressLength, false);
}
示例3: prepare_userland_address_result
static status_t
prepare_userland_address_result(struct sockaddr* userAddress,
socklen_t* _addressLength, socklen_t& addressLength, bool addressRequired)
{
// check parameters
if (_addressLength == NULL)
return B_BAD_VALUE;
if (userAddress == NULL) {
if (addressRequired)
return B_BAD_VALUE;
} else if (!IS_USER_ADDRESS(userAddress)
|| !IS_USER_ADDRESS(_addressLength)) {
return B_BAD_ADDRESS;
}
// copy the buffer size from userland
addressLength = 0;
if (userAddress != NULL
&& user_memcpy(&addressLength, _addressLength, sizeof(socklen_t))
!= B_OK) {
return B_BAD_ADDRESS;
}
if (addressLength > MAX_SOCKET_ADDRESS_LENGTH)
addressLength = MAX_SOCKET_ADDRESS_LENGTH;
return B_OK;
}
示例4: _user_get_next_socket_stat
status_t
_user_get_next_socket_stat(int family, uint32 *_cookie, struct net_stat *_stat)
{
// check parameters and copy cookie from userland
if (_cookie == NULL || _stat == NULL)
return B_BAD_VALUE;
uint32 cookie;
if (!IS_USER_ADDRESS(_stat) || !IS_USER_ADDRESS(_cookie)
|| user_memcpy(&cookie, _cookie, sizeof(cookie)) != B_OK) {
return B_BAD_ADDRESS;
}
net_stat stat;
SyscallRestartWrapper<status_t> error;
error = common_get_next_socket_stat(family, &cookie, &stat);
if (error != B_OK)
return error;
// copy cookie and data back to userland
if (user_memcpy(_cookie, &cookie, sizeof(cookie)) != B_OK
|| user_memcpy(_stat, &stat, sizeof(net_stat)) != B_OK) {
return B_BAD_ADDRESS;
}
return B_OK;
}
示例5: _user_getsockopt
status_t
_user_getsockopt(int socket, int level, int option, void *userValue,
socklen_t *_length)
{
// check params
if (userValue == NULL || _length == NULL)
return B_BAD_VALUE;
if (!IS_USER_ADDRESS(userValue) || !IS_USER_ADDRESS(_length))
return B_BAD_ADDRESS;
// copy length from userland
socklen_t length;
if (user_memcpy(&length, _length, sizeof(socklen_t)) != B_OK)
return B_BAD_ADDRESS;
if (length > MAX_SOCKET_OPTION_LENGTH)
return B_BAD_VALUE;
// getsockopt()
char value[MAX_SOCKET_OPTION_LENGTH];
SyscallRestartWrapper<status_t> error;
error = common_getsockopt(socket, level, option, value, &length,
false);
if (error != B_OK)
return error;
// copy value back to userland
if (user_memcpy(userValue, value, length) != B_OK)
return B_BAD_ADDRESS;
return B_OK;
}
示例6: prepare_userland_msghdr
static status_t
prepare_userland_msghdr(const msghdr* userMessage, msghdr& message,
iovec*& userVecs, MemoryDeleter& vecsDeleter, void*& userAddress,
char* address)
{
if (userMessage == NULL)
return B_BAD_VALUE;
// copy message from userland
if (!IS_USER_ADDRESS(userMessage)
|| user_memcpy(&message, userMessage, sizeof(msghdr)) != B_OK) {
return B_BAD_ADDRESS;
}
userVecs = message.msg_iov;
userAddress = message.msg_name;
// copy iovecs from userland
if (message.msg_iovlen < 0 || message.msg_iovlen > IOV_MAX)
return EMSGSIZE;
if (userVecs != NULL && message.msg_iovlen > 0) {
iovec* vecs = (iovec*)malloc(sizeof(iovec) * message.msg_iovlen);
if (vecs == NULL)
return B_NO_MEMORY;
vecsDeleter.SetTo(vecs);
if (!IS_USER_ADDRESS(message.msg_iov)
|| user_memcpy(vecs, message.msg_iov,
message.msg_iovlen * sizeof(iovec)) != B_OK) {
return B_BAD_ADDRESS;
}
for (int i = 0; i < message.msg_iovlen; i++) {
if (!IS_USER_ADDRESS(vecs[i].iov_base))
return B_BAD_ADDRESS;
}
message.msg_iov = vecs;
} else {
message.msg_iov = NULL;
message.msg_iovlen = 0;
}
// prepare the address field
userAddress = message.msg_name;
if (userAddress != NULL) {
if (!IS_USER_ADDRESS(message.msg_name))
return B_BAD_ADDRESS;
if (message.msg_namelen > MAX_SOCKET_ADDRESS_LENGTH)
message.msg_namelen = MAX_SOCKET_ADDRESS_LENGTH;
message.msg_name = address;
}
return B_OK;
}
示例7: socket_control
status_t
socket_control(net_socket* socket, int32 op, void* data, size_t length)
{
switch (op) {
case FIONBIO:
{
if (data == NULL)
return B_BAD_VALUE;
int value;
if (is_syscall()) {
if (!IS_USER_ADDRESS(data)
|| user_memcpy(&value, data, sizeof(int)) != B_OK) {
return B_BAD_ADDRESS;
}
} else
value = *(int*)data;
return socket_setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &value,
sizeof(int));
}
case FIONREAD:
{
if (data == NULL)
return B_BAD_VALUE;
ssize_t available = socket_read_avail(socket);
if (available < B_OK)
return available;
if (is_syscall()) {
if (!IS_USER_ADDRESS(data)
|| user_memcpy(data, &available, sizeof(ssize_t)) != B_OK) {
return B_BAD_ADDRESS;
}
} else
*(ssize_t *)data = available;
return B_OK;
}
case B_SET_BLOCKING_IO:
case B_SET_NONBLOCKING_IO:
{
int value = op == B_SET_NONBLOCKING_IO;
return socket_setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &value,
sizeof(int));
}
}
return socket->first_info->control(socket->first_protocol,
LEVEL_DRIVER_IOCTL, op, data, &length);
}
示例8: _user_mutex_switch_lock
status_t
_user_mutex_switch_lock(int32* fromMutex, int32* toMutex, const char* name,
uint32 flags, bigtime_t timeout)
{
if (fromMutex == NULL || !IS_USER_ADDRESS(fromMutex)
|| (addr_t)fromMutex % 4 != 0 || toMutex == NULL
|| !IS_USER_ADDRESS(toMutex) || (addr_t)toMutex % 4 != 0) {
return B_BAD_ADDRESS;
}
return user_mutex_switch_lock(fromMutex, toMutex, name,
flags | B_CAN_INTERRUPT, timeout);
}
示例9: _user_get_timezone
status_t
_user_get_timezone(time_t *_timezoneOffset, bool *_daylightSavingTime)
{
time_t offset = (time_t)(sTimezoneOffset / 1000000LL);
if (!IS_USER_ADDRESS(_timezoneOffset)
|| !IS_USER_ADDRESS(_daylightSavingTime)
|| user_memcpy(_timezoneOffset, &offset, sizeof(time_t)) < B_OK
|| user_memcpy(_daylightSavingTime, &sDaylightSavingTime,
sizeof(bool)) < B_OK)
return B_BAD_ADDRESS;
return B_OK;
}
示例10: _user_recvfrom
ssize_t
_user_recvfrom(int socket, void *data, size_t length, int flags,
struct sockaddr *userAddress, socklen_t *_addressLength)
{
if (data == NULL || !IS_USER_ADDRESS(data))
return B_BAD_ADDRESS;
// check parameters
socklen_t addressLength = 0;
status_t error = prepare_userland_address_result(userAddress,
_addressLength, addressLength, false);
if (error != B_OK)
return error;
// recvfrom()
SyscallRestartWrapper<ssize_t> result;
char address[MAX_SOCKET_ADDRESS_LENGTH];
socklen_t userAddressBufferSize = addressLength;
result = common_recvfrom(socket, data, length, flags,
userAddress != NULL ? (sockaddr*)address : NULL, &addressLength, false);
if (result < 0)
return result;
// copy address size and address back to userland
if (copy_address_to_userland(address, addressLength, userAddress,
userAddressBufferSize, _addressLength) != B_OK) {
return B_BAD_ADDRESS;
}
return result;
}
示例11: _user_system_profiler_next_buffer
status_t
_user_system_profiler_next_buffer(size_t bytesRead, uint64* _droppedEvents)
{
if (_droppedEvents != NULL && !IS_USER_ADDRESS(_droppedEvents))
return B_BAD_ADDRESS;
team_id team = thread_get_current_thread()->team->id;
InterruptsSpinLocker locker(sProfilerLock);
if (sProfiler == NULL || sProfiler->TeamID() != team)
return B_BAD_VALUE;
// get a reference to the profiler
SystemProfiler* profiler = sProfiler;
BReference<SystemProfiler> reference(profiler);
locker.Unlock();
uint64 droppedEvents;
status_t error = profiler->NextBuffer(bytesRead,
_droppedEvents != NULL ? &droppedEvents : NULL);
if (error == B_OK && _droppedEvents != NULL)
user_memcpy(_droppedEvents, &droppedEvents, sizeof(droppedEvents));
return error;
}
示例12: _user_get_timer
status_t
_user_get_timer(int32 timerID, thread_id threadID,
struct user_timer_info* userInfo)
{
// get the timer
TimerLocker timerLocker;
UserTimer* timer;
status_t error = timerLocker.LockAndGetTimer(threadID, timerID, timer);
if (error != B_OK)
return error;
// get the info
user_timer_info info;
timer->GetInfo(info.remaining_time, info.interval, info.overrun_count);
// Sanitize remaining_time. If it's <= 0, we set it to 1, the least valid
// value.
if (info.remaining_time <= 0)
info.remaining_time = 1;
timerLocker.Unlock();
// copy it back to userland
if (userInfo != NULL
&& (!IS_USER_ADDRESS(userInfo)
|| user_memcpy(userInfo, &info, sizeof(info)) != B_OK)) {
return B_BAD_ADDRESS;
}
return B_OK;
}
示例13: _user_socketpair
status_t
_user_socketpair(int family, int type, int protocol, int *userSocketVector)
{
// check parameters
if (userSocketVector == NULL)
return B_BAD_VALUE;
if (!IS_USER_ADDRESS(userSocketVector))
return B_BAD_ADDRESS;
// socketpair()
int socketVector[2];
SyscallRestartWrapper<status_t> error;
error = common_socketpair(family, type, protocol, socketVector, false);
if (error != B_OK)
return error;
// copy FDs back to userland
if (user_memcpy(userSocketVector, socketVector,
sizeof(socketVector)) != B_OK) {
_user_close(socketVector[0]);
_user_close(socketVector[1]);
return B_BAD_ADDRESS;
}
return B_OK;
}
示例14: _user_writev_port_etc
status_t
_user_writev_port_etc(port_id port, int32 messageCode, const iovec *userVecs,
size_t vecCount, size_t bufferSize, uint32 flags, bigtime_t timeout)
{
syscall_restart_handle_timeout_pre(flags, timeout);
if (userVecs == NULL && bufferSize != 0)
return B_BAD_VALUE;
if (userVecs != NULL && !IS_USER_ADDRESS(userVecs))
return B_BAD_ADDRESS;
iovec *vecs = NULL;
if (userVecs && vecCount != 0) {
vecs = (iovec*)malloc(sizeof(iovec) * vecCount);
if (vecs == NULL)
return B_NO_MEMORY;
if (user_memcpy(vecs, userVecs, sizeof(iovec) * vecCount) < B_OK) {
free(vecs);
return B_BAD_ADDRESS;
}
}
status_t status = writev_port_etc(port, messageCode, vecs, vecCount,
bufferSize, flags | PORT_FLAG_USE_USER_MEMCPY | B_CAN_INTERRUPT,
timeout);
free(vecs);
return syscall_restart_handle_timeout_post(status, timeout);
}
示例15: _user_system_profiler_recorded
status_t
_user_system_profiler_recorded(struct system_profiler_parameters* userParameters)
{
if (userParameters == NULL || !IS_USER_ADDRESS(userParameters))
return B_BAD_ADDRESS;
if (sRecordedParameters == NULL)
return B_ERROR;
// Transfer the area to the userland process
void* address;
area_id newArea = transfer_area(sRecordedParameters->buffer_area, &address,
B_ANY_ADDRESS, team_get_current_team_id(), true);
if (newArea < 0)
return newArea;
status_t status = set_area_protection(newArea, B_READ_AREA);
if (status == B_OK) {
sRecordedParameters->buffer_area = newArea;
status = user_memcpy(userParameters, sRecordedParameters,
sizeof(system_profiler_parameters));
}
if (status != B_OK)
delete_area(newArea);
delete sRecordedParameters;
sRecordedParameters = NULL;
return status;
}