* Renamed THREAD_FLAGS_IOCTL_SYSCALL to THREAD_FLAGS_SYSCALL,
syscall_restart_ioctl_is_restarted() to syscall_restart_is_restarted, IoctlSyscallFlagUnsetter to SyscallFlagUnsetter, and IoctlSyscallRestartWrapper to SyscallRestartWrapper, as they are no longer only used for ioctl(). * Removed unused syscall_restart_ioctl_handle_post(). * Made SyscallRestartWrapper a lot fancier. Instead of storing a reference to the result value, it stores the value itself, and it features all the interesting operators that make it appear like that value. This simplifies the use of the class quite a bit. * THREAD_FLAGS_SYSCALL is now set for all socket function and the read[v](), write[v]() syscalls. * Added is_syscall() function and net_stack hook to the net stack. * Removed "kernel" parameter from all net_stack_interface and net_socket module hooks. They aren't need any longer, since is_syscall() can be used instead. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24914 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -90,69 +90,73 @@ syscall_restart_handle_post(status_t error)
|
|||||||
|
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
syscall_restart_ioctl_is_restarted()
|
syscall_restart_is_restarted()
|
||||||
{
|
{
|
||||||
struct thread* thread = thread_get_current_thread();
|
struct thread* thread = thread_get_current_thread();
|
||||||
|
|
||||||
return (thread->flags & THREAD_FLAGS_IOCTL_SYSCALL) != 0
|
return (thread->flags & THREAD_FLAGS_SYSCALL) != 0
|
||||||
&& (thread->flags & THREAD_FLAGS_SYSCALL_RESTARTED) != 0;
|
&& (thread->flags & THREAD_FLAGS_SYSCALL_RESTARTED) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline status_t
|
struct SyscallFlagUnsetter {
|
||||||
syscall_restart_ioctl_handle_post(status_t error)
|
SyscallFlagUnsetter()
|
||||||
{
|
{
|
||||||
if (error == B_INTERRUPTED) {
|
fThread = thread_get_current_thread();
|
||||||
// interrupted -- set flag for syscall restart
|
fWasSyscall = (atomic_and(&fThread->flags, ~THREAD_FLAGS_SYSCALL)
|
||||||
struct thread* thread = thread_get_current_thread();
|
& THREAD_FLAGS_SYSCALL) != 0;
|
||||||
if ((thread->flags & THREAD_FLAGS_IOCTL_SYSCALL) != 0)
|
|
||||||
atomic_or(&thread->flags, THREAD_FLAGS_RESTART_SYSCALL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
~SyscallFlagUnsetter()
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct IoctlSyscallFlagUnsetter {
|
|
||||||
IoctlSyscallFlagUnsetter()
|
|
||||||
{
|
{
|
||||||
struct thread *thread = thread_get_current_thread();
|
|
||||||
fWasSyscall = (atomic_and(&thread->flags, ~THREAD_FLAGS_IOCTL_SYSCALL)
|
|
||||||
& THREAD_FLAGS_IOCTL_SYSCALL) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
~IoctlSyscallFlagUnsetter()
|
|
||||||
{
|
|
||||||
struct thread *thread = thread_get_current_thread();
|
|
||||||
if (fWasSyscall)
|
if (fWasSyscall)
|
||||||
atomic_or(&thread->flags, THREAD_FLAGS_IOCTL_SYSCALL);
|
atomic_or(&fThread->flags, THREAD_FLAGS_SYSCALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool fWasSyscall;
|
struct thread* fThread;
|
||||||
|
bool fWasSyscall;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
struct IoctlSyscallRestartWrapper {
|
struct SyscallRestartWrapper {
|
||||||
IoctlSyscallRestartWrapper(const Type& result)
|
SyscallRestartWrapper(Type initialValue = 0)
|
||||||
: fResult(result)
|
: fResult(initialValue)
|
||||||
{
|
{
|
||||||
struct thread *thread = thread_get_current_thread();
|
fThread = thread_get_current_thread();
|
||||||
atomic_or(&thread->flags, THREAD_FLAGS_IOCTL_SYSCALL);
|
atomic_or(&fThread->flags, THREAD_FLAGS_SYSCALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
~IoctlSyscallRestartWrapper()
|
~SyscallRestartWrapper()
|
||||||
{
|
{
|
||||||
struct thread *thread = thread_get_current_thread();
|
atomic_and(&fThread->flags, ~THREAD_FLAGS_SYSCALL);
|
||||||
atomic_and(&thread->flags, ~THREAD_FLAGS_IOCTL_SYSCALL);
|
|
||||||
|
|
||||||
if (fResult < 0)
|
if (fResult == B_INTERRUPTED) {
|
||||||
syscall_restart_ioctl_handle_post(fResult);
|
// interrupted -- set flag for syscall restart
|
||||||
|
if ((fThread->flags & THREAD_FLAGS_SYSCALL) != 0)
|
||||||
|
atomic_or(&fThread->flags, THREAD_FLAGS_RESTART_SYSCALL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyscallRestartWrapper<Type>& operator=(const Type& other)
|
||||||
|
{
|
||||||
|
fResult = other;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const Type& other) const { return fResult == other; }
|
||||||
|
bool operator!=(const Type& other) const { return fResult != other; }
|
||||||
|
bool operator<=(const Type& other) const { return fResult <= other; }
|
||||||
|
bool operator>=(const Type& other) const { return fResult >= other; }
|
||||||
|
bool operator<(const Type& other) const { return fResult < other; }
|
||||||
|
bool operator>(const Type& other) const { return fResult > other; }
|
||||||
|
|
||||||
|
operator Type() const { return fResult; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Type& fResult;
|
Type fResult;
|
||||||
|
struct thread* fThread;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -311,7 +311,8 @@ struct thread_queue {
|
|||||||
#define THREAD_FLAGS_RESTART_SYSCALL 0x0040
|
#define THREAD_FLAGS_RESTART_SYSCALL 0x0040
|
||||||
#define THREAD_FLAGS_DONT_RESTART_SYSCALL 0x0080
|
#define THREAD_FLAGS_DONT_RESTART_SYSCALL 0x0080
|
||||||
#define THREAD_FLAGS_SYSCALL_RESTARTED 0x0100
|
#define THREAD_FLAGS_SYSCALL_RESTARTED 0x0100
|
||||||
#define THREAD_FLAGS_IOCTL_SYSCALL 0x0200
|
#define THREAD_FLAGS_SYSCALL 0x0200
|
||||||
|
// Note: Set only for certain syscalls.
|
||||||
|
|
||||||
|
|
||||||
#endif /* _KERNEL_THREAD_TYPES_H */
|
#endif /* _KERNEL_THREAD_TYPES_H */
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ struct net_socket_module_info {
|
|||||||
status_t (*writev)(net_socket *socket, const iovec *vecs,
|
status_t (*writev)(net_socket *socket, const iovec *vecs,
|
||||||
size_t vecCount, size_t *_length);
|
size_t vecCount, size_t *_length);
|
||||||
status_t (*control)(net_socket *socket, int32 op, void *data,
|
status_t (*control)(net_socket *socket, int32 op, void *data,
|
||||||
size_t length, bool kernel);
|
size_t length);
|
||||||
|
|
||||||
ssize_t (*read_avail)(net_socket *socket);
|
ssize_t (*read_avail)(net_socket *socket);
|
||||||
ssize_t (*send_avail)(net_socket *socket);
|
ssize_t (*send_avail)(net_socket *socket);
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ struct net_stack_module_info {
|
|||||||
bool (*is_timer_active)(struct net_timer *timer);
|
bool (*is_timer_active)(struct net_timer *timer);
|
||||||
|
|
||||||
// syscall restart
|
// syscall restart
|
||||||
|
bool (*is_syscall)(void);
|
||||||
bool (*is_restarted_syscall)(void);
|
bool (*is_restarted_syscall)(void);
|
||||||
void (*store_syscall_restart_timeout)(bigtime_t timeout);
|
void (*store_syscall_restart_timeout)(bigtime_t timeout);
|
||||||
bigtime_t (*restore_syscall_restart_timeout)(void);
|
bigtime_t (*restore_syscall_restart_timeout)(void);
|
||||||
|
|||||||
@@ -29,29 +29,27 @@ struct net_stack_interface_module_info {
|
|||||||
status_t (*free)(net_socket* socket);
|
status_t (*free)(net_socket* socket);
|
||||||
|
|
||||||
status_t (*bind)(net_socket* socket, const struct sockaddr* address,
|
status_t (*bind)(net_socket* socket, const struct sockaddr* address,
|
||||||
socklen_t addressLength, bool kernel);
|
socklen_t addressLength);
|
||||||
status_t (*shutdown)(net_socket* socket, int how);
|
status_t (*shutdown)(net_socket* socket, int how);
|
||||||
status_t (*connect)(net_socket* socket, const struct sockaddr* address,
|
status_t (*connect)(net_socket* socket, const struct sockaddr* address,
|
||||||
socklen_t addressLength, bool kernel);
|
socklen_t addressLength);
|
||||||
status_t (*listen)(net_socket* socket, int backlog);
|
status_t (*listen)(net_socket* socket, int backlog);
|
||||||
status_t (*accept)(net_socket* socket, struct sockaddr* address,
|
status_t (*accept)(net_socket* socket, struct sockaddr* address,
|
||||||
socklen_t* _addressLength, net_socket** _acceptedSocket);
|
socklen_t* _addressLength, net_socket** _acceptedSocket);
|
||||||
|
|
||||||
ssize_t (*recv)(net_socket* socket, void* data, size_t length, int flags,
|
ssize_t (*recv)(net_socket* socket, void* data, size_t length, int flags);
|
||||||
bool kernel);
|
|
||||||
ssize_t (*recvfrom)(net_socket* socket, void* data, size_t length,
|
ssize_t (*recvfrom)(net_socket* socket, void* data, size_t length,
|
||||||
int flags, struct sockaddr* address,
|
int flags, struct sockaddr* address,
|
||||||
socklen_t* _addressLength, bool kernel);
|
socklen_t* _addressLength);
|
||||||
ssize_t (*recvmsg)(net_socket* socket, struct msghdr* message, int flags,
|
ssize_t (*recvmsg)(net_socket* socket, struct msghdr* message, int flags);
|
||||||
bool kernel);
|
|
||||||
|
|
||||||
ssize_t (*send)(net_socket* socket, const void* data, size_t length,
|
ssize_t (*send)(net_socket* socket, const void* data, size_t length,
|
||||||
int flags, bool kernel);
|
int flags);
|
||||||
ssize_t (*sendto)(net_socket* socket, const void* data, size_t length,
|
ssize_t (*sendto)(net_socket* socket, const void* data, size_t length,
|
||||||
int flags, const struct sockaddr* address,
|
int flags, const struct sockaddr* address,
|
||||||
socklen_t addressLength, bool kernel);
|
socklen_t addressLength);
|
||||||
ssize_t (*sendmsg)(net_socket* socket, const struct msghdr* message,
|
ssize_t (*sendmsg)(net_socket* socket, const struct msghdr* message,
|
||||||
int flags, bool kernel);
|
int flags);
|
||||||
|
|
||||||
status_t (*getsockopt)(net_socket* socket, int level, int option,
|
status_t (*getsockopt)(net_socket* socket, int level, int option,
|
||||||
void* value, socklen_t* _length);
|
void* value, socklen_t* _length);
|
||||||
@@ -69,7 +67,7 @@ struct net_stack_interface_module_info {
|
|||||||
net_socket* _sockets[2]);
|
net_socket* _sockets[2]);
|
||||||
|
|
||||||
status_t (*ioctl)(net_socket* socket, uint32 op, void *buffer,
|
status_t (*ioctl)(net_socket* socket, uint32 op, void *buffer,
|
||||||
size_t length, bool kernel);
|
size_t length);
|
||||||
status_t (*select)(net_socket* socket, uint8 event,
|
status_t (*select)(net_socket* socket, uint8 event,
|
||||||
struct selectsync *sync);
|
struct selectsync *sync);
|
||||||
status_t (*deselect)(net_socket* socket, uint8 event,
|
status_t (*deselect)(net_socket* socket, uint8 event,
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
#include <net_stack.h>
|
#include <net_stack.h>
|
||||||
#include <net_stat.h>
|
#include <net_stat.h>
|
||||||
|
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
|
|
||||||
struct net_socket_private : net_socket {
|
struct net_socket_private : net_socket {
|
||||||
struct list_link link;
|
struct list_link link;
|
||||||
@@ -243,8 +245,7 @@ socket_writev(net_socket *socket, const iovec *vecs, size_t vecCount,
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
socket_control(net_socket *socket, int32 op, void *data, size_t length,
|
socket_control(net_socket *socket, int32 op, void *data, size_t length)
|
||||||
bool kernel)
|
|
||||||
{
|
{
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case FIONBIO:
|
case FIONBIO:
|
||||||
@@ -253,14 +254,14 @@ socket_control(net_socket *socket, int32 op, void *data, size_t length,
|
|||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
int value;
|
int value;
|
||||||
if (kernel) {
|
if (is_syscall()) {
|
||||||
value = *(int*)data;
|
|
||||||
} else {
|
|
||||||
if (!IS_USER_ADDRESS(data)
|
if (!IS_USER_ADDRESS(data)
|
||||||
|| user_memcpy(&value, data, sizeof(int)) != B_OK) {
|
|| user_memcpy(&value, data, sizeof(int)) != B_OK) {
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
|
value = *(int*)data;
|
||||||
|
|
||||||
return socket_setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &value,
|
return socket_setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &value,
|
||||||
sizeof(int));
|
sizeof(int));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -918,6 +918,7 @@ net_stack_module_info gNetStackModule = {
|
|||||||
cancel_timer,
|
cancel_timer,
|
||||||
is_timer_active,
|
is_timer_active,
|
||||||
|
|
||||||
|
is_syscall,
|
||||||
is_restarted_syscall,
|
is_restarted_syscall,
|
||||||
store_syscall_restart_timeout,
|
store_syscall_restart_timeout,
|
||||||
restore_syscall_restart_timeout,
|
restore_syscall_restart_timeout,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "stack_private.h"
|
#include "stack_private.h"
|
||||||
|
|
||||||
@@ -31,9 +33,8 @@ stack_interface_free(net_socket* socket)
|
|||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
stack_interface_bind(net_socket* socket, const struct sockaddr* address,
|
stack_interface_bind(net_socket* socket, const struct sockaddr* address,
|
||||||
socklen_t addressLength, bool kernel)
|
socklen_t addressLength)
|
||||||
{
|
{
|
||||||
// TODO: Pass kernel flag!
|
|
||||||
return gNetSocketModule.bind(socket, address, addressLength);
|
return gNetSocketModule.bind(socket, address, addressLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,9 +48,8 @@ stack_interface_shutdown(net_socket* socket, int how)
|
|||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
stack_interface_connect(net_socket* socket, const struct sockaddr* address,
|
stack_interface_connect(net_socket* socket, const struct sockaddr* address,
|
||||||
socklen_t addressLength, bool kernel)
|
socklen_t addressLength)
|
||||||
{
|
{
|
||||||
// TODO: Pass kernel flag!
|
|
||||||
return gNetSocketModule.connect(socket, address, addressLength);
|
return gNetSocketModule.connect(socket, address, addressLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,17 +71,15 @@ stack_interface_accept(net_socket* socket, struct sockaddr* address,
|
|||||||
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
stack_interface_recv(net_socket* socket, void* data, size_t length, int flags,
|
stack_interface_recv(net_socket* socket, void* data, size_t length, int flags)
|
||||||
bool kernel)
|
|
||||||
{
|
{
|
||||||
// TODO: Pass kernel flag!
|
|
||||||
return gNetSocketModule.receive(socket, NULL, data, length, flags);
|
return gNetSocketModule.receive(socket, NULL, data, length, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
stack_interface_recvfrom(net_socket* socket, void* data, size_t length,
|
stack_interface_recvfrom(net_socket* socket, void* data, size_t length,
|
||||||
int flags, struct sockaddr* address, socklen_t* _addressLength, bool kernel)
|
int flags, struct sockaddr* address, socklen_t* _addressLength)
|
||||||
{
|
{
|
||||||
msghdr message;
|
msghdr message;
|
||||||
iovec vecs[1] = { { data, length } };
|
iovec vecs[1] = { { data, length } };
|
||||||
@@ -93,7 +91,6 @@ stack_interface_recvfrom(net_socket* socket, void* data, size_t length,
|
|||||||
message.msg_controllen = 0;
|
message.msg_controllen = 0;
|
||||||
message.msg_flags = 0;
|
message.msg_flags = 0;
|
||||||
|
|
||||||
// TODO: Pass kernel flag!
|
|
||||||
status_t error = gNetSocketModule.receive(socket, &message, data, length,
|
status_t error = gNetSocketModule.receive(socket, &message, data, length,
|
||||||
flags);
|
flags);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
@@ -105,8 +102,7 @@ stack_interface_recvfrom(net_socket* socket, void* data, size_t length,
|
|||||||
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
stack_interface_recvmsg(net_socket* socket, struct msghdr* message, int flags,
|
stack_interface_recvmsg(net_socket* socket, struct msghdr* message, int flags)
|
||||||
bool kernel)
|
|
||||||
{
|
{
|
||||||
void* buffer = NULL;
|
void* buffer = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
@@ -115,24 +111,21 @@ stack_interface_recvmsg(net_socket* socket, struct msghdr* message, int flags,
|
|||||||
len = message->msg_iov[0].iov_len;
|
len = message->msg_iov[0].iov_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Pass kernel flag!
|
|
||||||
return gNetSocketModule.receive(socket, message, buffer, len, flags);
|
return gNetSocketModule.receive(socket, message, buffer, len, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
stack_interface_send(net_socket* socket, const void* data, size_t length,
|
stack_interface_send(net_socket* socket, const void* data, size_t length,
|
||||||
int flags, bool kernel)
|
int flags)
|
||||||
{
|
{
|
||||||
// TODO: Pass kernel flag!
|
|
||||||
return gNetSocketModule.send(socket, NULL, data, length, flags);
|
return gNetSocketModule.send(socket, NULL, data, length, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
stack_interface_sendto(net_socket* socket, const void* data, size_t length,
|
stack_interface_sendto(net_socket* socket, const void* data, size_t length,
|
||||||
int flags, const struct sockaddr* address, socklen_t addressLength,
|
int flags, const struct sockaddr* address, socklen_t addressLength)
|
||||||
bool kernel)
|
|
||||||
{
|
{
|
||||||
msghdr message;
|
msghdr message;
|
||||||
iovec vecs[1] = { { (void*)data, length } };
|
iovec vecs[1] = { { (void*)data, length } };
|
||||||
@@ -144,14 +137,13 @@ stack_interface_sendto(net_socket* socket, const void* data, size_t length,
|
|||||||
message.msg_controllen = 0;
|
message.msg_controllen = 0;
|
||||||
message.msg_flags = 0;
|
message.msg_flags = 0;
|
||||||
|
|
||||||
// TODO: Pass kernel flag!
|
|
||||||
return gNetSocketModule.send(socket, &message, data, length, flags);
|
return gNetSocketModule.send(socket, &message, data, length, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
stack_interface_sendmsg(net_socket* socket, const struct msghdr* message,
|
stack_interface_sendmsg(net_socket* socket, const struct msghdr* message,
|
||||||
int flags, bool kernel)
|
int flags)
|
||||||
{
|
{
|
||||||
void* buffer = NULL;
|
void* buffer = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
@@ -160,7 +152,6 @@ stack_interface_sendmsg(net_socket* socket, const struct msghdr* message,
|
|||||||
len = message->msg_iov[0].iov_len;
|
len = message->msg_iov[0].iov_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Pass kernel flag!
|
|
||||||
return gNetSocketModule.send(socket, (msghdr*)message, buffer, len, flags);
|
return gNetSocketModule.send(socket, (msghdr*)message, buffer, len, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,9 +210,9 @@ stack_interface_socketpair(int family, int type, int protocol,
|
|||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
stack_interface_ioctl(net_socket* socket, uint32 op, void *buffer,
|
stack_interface_ioctl(net_socket* socket, uint32 op, void *buffer,
|
||||||
size_t length, bool kernel)
|
size_t length)
|
||||||
{
|
{
|
||||||
return gNetSocketModule.control(socket, op, buffer, length, kernel);
|
return gNetSocketModule.control(socket, op, buffer, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -575,10 +575,18 @@ uninit_timers(void)
|
|||||||
// #pragma mark - Syscall restart
|
// #pragma mark - Syscall restart
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
is_syscall(void)
|
||||||
|
{
|
||||||
|
struct thread* thread = thread_get_current_thread();
|
||||||
|
return (thread->flags & THREAD_FLAGS_SYSCALL) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
is_restarted_syscall(void)
|
is_restarted_syscall(void)
|
||||||
{
|
{
|
||||||
return syscall_restart_ioctl_is_restarted();
|
return syscall_restart_is_restarted();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -586,7 +594,7 @@ void
|
|||||||
store_syscall_restart_timeout(bigtime_t timeout)
|
store_syscall_restart_timeout(bigtime_t timeout)
|
||||||
{
|
{
|
||||||
struct thread* thread = thread_get_current_thread();
|
struct thread* thread = thread_get_current_thread();
|
||||||
if ((thread->flags & THREAD_FLAGS_IOCTL_SYSCALL) != 0)
|
if ((thread->flags & THREAD_FLAGS_SYSCALL) != 0)
|
||||||
*(bigtime_t*)thread->syscall_restart.parameters = timeout;
|
*(bigtime_t*)thread->syscall_restart.parameters = timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ status_t init_timers(void);
|
|||||||
void uninit_timers(void);
|
void uninit_timers(void);
|
||||||
|
|
||||||
// syscall restart
|
// syscall restart
|
||||||
|
bool is_syscall(void);
|
||||||
bool is_restarted_syscall(void);
|
bool is_restarted_syscall(void);
|
||||||
void store_syscall_restart_timeout(bigtime_t timeout);
|
void store_syscall_restart_timeout(bigtime_t timeout);
|
||||||
bigtime_t restore_syscall_restart_timeout(void);
|
bigtime_t restore_syscall_restart_timeout(void);
|
||||||
|
|||||||
+96
-98
@@ -651,14 +651,15 @@ common_user_io(int fd, off_t pos, void *buffer, size_t length, bool write)
|
|||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t status;
|
SyscallRestartWrapper<status_t> status;
|
||||||
|
|
||||||
if (write)
|
if (write)
|
||||||
status = descriptor->ops->fd_write(descriptor, pos, buffer, &length);
|
status = descriptor->ops->fd_write(descriptor, pos, buffer, &length);
|
||||||
else
|
else
|
||||||
status = descriptor->ops->fd_read(descriptor, pos, buffer, &length);
|
status = descriptor->ops->fd_read(descriptor, pos, buffer, &length);
|
||||||
|
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return syscall_restart_handle_post(status);
|
return status;
|
||||||
|
|
||||||
if (movePosition)
|
if (movePosition)
|
||||||
descriptor->pos = pos + length;
|
descriptor->pos = pos + length;
|
||||||
@@ -710,10 +711,11 @@ common_user_vector_io(int fd, off_t pos, const iovec *userVecs, size_t count,
|
|||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyscallRestartWrapper<status_t> status;
|
||||||
|
|
||||||
ssize_t bytesTransferred = 0;
|
ssize_t bytesTransferred = 0;
|
||||||
for (uint32 i = 0; i < count; i++) {
|
for (uint32 i = 0; i < count; i++) {
|
||||||
size_t length = vecs[i].iov_len;
|
size_t length = vecs[i].iov_len;
|
||||||
status_t status;
|
|
||||||
if (write) {
|
if (write) {
|
||||||
status = descriptor->ops->fd_write(descriptor, pos,
|
status = descriptor->ops->fd_write(descriptor, pos,
|
||||||
vecs[i].iov_base, &length);
|
vecs[i].iov_base, &length);
|
||||||
@@ -724,7 +726,8 @@ common_user_vector_io(int fd, off_t pos, const iovec *userVecs, size_t count,
|
|||||||
|
|
||||||
if (status < B_OK) {
|
if (status < B_OK) {
|
||||||
if (bytesTransferred == 0)
|
if (bytesTransferred == 0)
|
||||||
return syscall_restart_handle_post(status);
|
return status;
|
||||||
|
status = B_OK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -819,13 +822,9 @@ _user_ioctl(int fd, ulong op, void *buffer, size_t length)
|
|||||||
|
|
||||||
TRACE(("user_ioctl: fd %d\n", fd));
|
TRACE(("user_ioctl: fd %d\n", fd));
|
||||||
|
|
||||||
struct thread *thread = thread_get_current_thread();
|
SyscallRestartWrapper<status_t> status;
|
||||||
atomic_or(&thread->flags, THREAD_FLAGS_IOCTL_SYSCALL);
|
|
||||||
|
|
||||||
status_t status = fd_ioctl(false, fd, op, buffer, length);
|
return status = fd_ioctl(false, fd, op, buffer, length);
|
||||||
|
|
||||||
atomic_and(&thread->flags, ~THREAD_FLAGS_IOCTL_SYSCALL);
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -908,19 +907,16 @@ _user_dup2(int ofd, int nfd)
|
|||||||
ssize_t
|
ssize_t
|
||||||
_kern_read(int fd, off_t pos, void *buffer, size_t length)
|
_kern_read(int fd, off_t pos, void *buffer, size_t length)
|
||||||
{
|
{
|
||||||
struct file_descriptor *descriptor;
|
|
||||||
ssize_t bytesRead;
|
|
||||||
|
|
||||||
if (pos < -1)
|
if (pos < -1)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
descriptor = get_fd(get_current_io_context(true), fd);
|
FDGetter fdGetter;
|
||||||
|
struct file_descriptor *descriptor = fdGetter.SetTo(fd, true);
|
||||||
|
|
||||||
if (!descriptor)
|
if (!descriptor)
|
||||||
return B_FILE_ERROR;
|
return B_FILE_ERROR;
|
||||||
if ((descriptor->open_mode & O_RWMASK) == O_WRONLY) {
|
if ((descriptor->open_mode & O_RWMASK) == O_WRONLY)
|
||||||
put_fd(descriptor);
|
|
||||||
return B_FILE_ERROR;
|
return B_FILE_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
bool movePosition = false;
|
bool movePosition = false;
|
||||||
if (pos == -1) {
|
if (pos == -1) {
|
||||||
@@ -928,21 +924,23 @@ _kern_read(int fd, off_t pos, void *buffer, size_t length)
|
|||||||
movePosition = true;
|
movePosition = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor->ops->fd_read) {
|
SyscallFlagUnsetter _;
|
||||||
bytesRead = descriptor->ops->fd_read(descriptor, pos, buffer, &length);
|
|
||||||
if (bytesRead >= B_OK) {
|
|
||||||
if (length > SSIZE_MAX)
|
|
||||||
bytesRead = SSIZE_MAX;
|
|
||||||
else
|
|
||||||
bytesRead = (ssize_t)length;
|
|
||||||
|
|
||||||
if (movePosition)
|
if (descriptor->ops->fd_read == NULL)
|
||||||
descriptor->pos = pos + length;
|
return B_BAD_VALUE;
|
||||||
}
|
|
||||||
} else
|
ssize_t bytesRead = descriptor->ops->fd_read(descriptor, pos, buffer,
|
||||||
bytesRead = B_BAD_VALUE;
|
&length);
|
||||||
|
if (bytesRead >= B_OK) {
|
||||||
|
if (length > SSIZE_MAX)
|
||||||
|
bytesRead = SSIZE_MAX;
|
||||||
|
else
|
||||||
|
bytesRead = (ssize_t)length;
|
||||||
|
|
||||||
|
if (movePosition)
|
||||||
|
descriptor->pos = pos + length;
|
||||||
|
}
|
||||||
|
|
||||||
put_fd(descriptor);
|
|
||||||
return bytesRead;
|
return bytesRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -950,52 +948,53 @@ _kern_read(int fd, off_t pos, void *buffer, size_t length)
|
|||||||
ssize_t
|
ssize_t
|
||||||
_kern_readv(int fd, off_t pos, const iovec *vecs, size_t count)
|
_kern_readv(int fd, off_t pos, const iovec *vecs, size_t count)
|
||||||
{
|
{
|
||||||
struct file_descriptor *descriptor;
|
|
||||||
bool movePosition = false;
|
bool movePosition = false;
|
||||||
ssize_t bytesRead = 0;
|
|
||||||
status_t status;
|
status_t status;
|
||||||
uint32 i;
|
uint32 i;
|
||||||
|
|
||||||
if (pos < -1)
|
if (pos < -1)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
descriptor = get_fd(get_current_io_context(true), fd);
|
FDGetter fdGetter;
|
||||||
|
struct file_descriptor *descriptor = fdGetter.SetTo(fd, true);
|
||||||
|
|
||||||
if (!descriptor)
|
if (!descriptor)
|
||||||
return B_FILE_ERROR;
|
return B_FILE_ERROR;
|
||||||
if ((descriptor->open_mode & O_RWMASK) == O_WRONLY) {
|
if ((descriptor->open_mode & O_RWMASK) == O_WRONLY)
|
||||||
put_fd(descriptor);
|
|
||||||
return B_FILE_ERROR;
|
return B_FILE_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
if (pos == -1) {
|
if (pos == -1) {
|
||||||
pos = descriptor->pos;
|
pos = descriptor->pos;
|
||||||
movePosition = true;
|
movePosition = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor->ops->fd_read) {
|
if (descriptor->ops->fd_read == NULL)
|
||||||
for (i = 0; i < count; i++) {
|
return B_BAD_VALUE;
|
||||||
size_t length = vecs[i].iov_len;
|
|
||||||
status = descriptor->ops->fd_read(descriptor, pos, vecs[i].iov_base,
|
|
||||||
&length);
|
|
||||||
if (status < B_OK) {
|
|
||||||
bytesRead = status;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((uint64)bytesRead + length > SSIZE_MAX)
|
SyscallFlagUnsetter _;
|
||||||
bytesRead = SSIZE_MAX;
|
|
||||||
else
|
|
||||||
bytesRead += (ssize_t)length;
|
|
||||||
|
|
||||||
pos += vecs[i].iov_len;
|
ssize_t bytesRead = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
size_t length = vecs[i].iov_len;
|
||||||
|
status = descriptor->ops->fd_read(descriptor, pos, vecs[i].iov_base,
|
||||||
|
&length);
|
||||||
|
if (status < B_OK) {
|
||||||
|
bytesRead = status;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else
|
|
||||||
bytesRead = B_BAD_VALUE;
|
if ((uint64)bytesRead + length > SSIZE_MAX)
|
||||||
|
bytesRead = SSIZE_MAX;
|
||||||
|
else
|
||||||
|
bytesRead += (ssize_t)length;
|
||||||
|
|
||||||
|
pos += vecs[i].iov_len;
|
||||||
|
}
|
||||||
|
|
||||||
if (movePosition)
|
if (movePosition)
|
||||||
descriptor->pos = pos;
|
descriptor->pos = pos;
|
||||||
|
|
||||||
put_fd(descriptor);
|
|
||||||
return bytesRead;
|
return bytesRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1003,19 +1002,16 @@ _kern_readv(int fd, off_t pos, const iovec *vecs, size_t count)
|
|||||||
ssize_t
|
ssize_t
|
||||||
_kern_write(int fd, off_t pos, const void *buffer, size_t length)
|
_kern_write(int fd, off_t pos, const void *buffer, size_t length)
|
||||||
{
|
{
|
||||||
struct file_descriptor *descriptor;
|
|
||||||
ssize_t bytesWritten;
|
|
||||||
|
|
||||||
if (pos < -1)
|
if (pos < -1)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
descriptor = get_fd(get_current_io_context(true), fd);
|
FDGetter fdGetter;
|
||||||
|
struct file_descriptor *descriptor = fdGetter.SetTo(fd, true);
|
||||||
|
|
||||||
if (descriptor == NULL)
|
if (descriptor == NULL)
|
||||||
return B_FILE_ERROR;
|
return B_FILE_ERROR;
|
||||||
if ((descriptor->open_mode & O_RWMASK) == O_RDONLY) {
|
if ((descriptor->open_mode & O_RWMASK) == O_RDONLY)
|
||||||
put_fd(descriptor);
|
|
||||||
return B_FILE_ERROR;
|
return B_FILE_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
bool movePosition = false;
|
bool movePosition = false;
|
||||||
if (pos == -1) {
|
if (pos == -1) {
|
||||||
@@ -1023,22 +1019,23 @@ _kern_write(int fd, off_t pos, const void *buffer, size_t length)
|
|||||||
movePosition = true;
|
movePosition = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor->ops->fd_write) {
|
if (descriptor->ops->fd_write == NULL)
|
||||||
bytesWritten = descriptor->ops->fd_write(descriptor, pos, buffer,
|
return B_BAD_VALUE;
|
||||||
&length);
|
|
||||||
if (bytesWritten >= B_OK) {
|
|
||||||
if (length > SSIZE_MAX)
|
|
||||||
bytesWritten = SSIZE_MAX;
|
|
||||||
else
|
|
||||||
bytesWritten = (ssize_t)length;
|
|
||||||
|
|
||||||
if (movePosition)
|
SyscallFlagUnsetter _;
|
||||||
descriptor->pos = pos + length;
|
|
||||||
}
|
ssize_t bytesWritten = descriptor->ops->fd_write(descriptor, pos, buffer,
|
||||||
} else
|
&length);
|
||||||
bytesWritten = B_BAD_VALUE;
|
if (bytesWritten >= B_OK) {
|
||||||
|
if (length > SSIZE_MAX)
|
||||||
|
bytesWritten = SSIZE_MAX;
|
||||||
|
else
|
||||||
|
bytesWritten = (ssize_t)length;
|
||||||
|
|
||||||
|
if (movePosition)
|
||||||
|
descriptor->pos = pos + length;
|
||||||
|
}
|
||||||
|
|
||||||
put_fd(descriptor);
|
|
||||||
return bytesWritten;
|
return bytesWritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1046,52 +1043,53 @@ _kern_write(int fd, off_t pos, const void *buffer, size_t length)
|
|||||||
ssize_t
|
ssize_t
|
||||||
_kern_writev(int fd, off_t pos, const iovec *vecs, size_t count)
|
_kern_writev(int fd, off_t pos, const iovec *vecs, size_t count)
|
||||||
{
|
{
|
||||||
struct file_descriptor *descriptor;
|
|
||||||
bool movePosition = false;
|
bool movePosition = false;
|
||||||
ssize_t bytesWritten = 0;
|
|
||||||
status_t status;
|
status_t status;
|
||||||
uint32 i;
|
uint32 i;
|
||||||
|
|
||||||
if (pos < -1)
|
if (pos < -1)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
descriptor = get_fd(get_current_io_context(true), fd);
|
FDGetter fdGetter;
|
||||||
|
struct file_descriptor *descriptor = fdGetter.SetTo(fd, true);
|
||||||
|
|
||||||
if (!descriptor)
|
if (!descriptor)
|
||||||
return B_FILE_ERROR;
|
return B_FILE_ERROR;
|
||||||
if ((descriptor->open_mode & O_RWMASK) == O_RDONLY) {
|
if ((descriptor->open_mode & O_RWMASK) == O_RDONLY)
|
||||||
put_fd(descriptor);
|
|
||||||
return B_FILE_ERROR;
|
return B_FILE_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
if (pos == -1) {
|
if (pos == -1) {
|
||||||
pos = descriptor->pos;
|
pos = descriptor->pos;
|
||||||
movePosition = true;
|
movePosition = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor->ops->fd_write) {
|
if (descriptor->ops->fd_write == NULL)
|
||||||
for (i = 0; i < count; i++) {
|
return B_BAD_VALUE;
|
||||||
size_t length = vecs[i].iov_len;
|
|
||||||
status = descriptor->ops->fd_write(descriptor, pos,
|
|
||||||
vecs[i].iov_base, &length);
|
|
||||||
if (status < B_OK) {
|
|
||||||
bytesWritten = status;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((uint64)bytesWritten + length > SSIZE_MAX)
|
SyscallFlagUnsetter _;
|
||||||
bytesWritten = SSIZE_MAX;
|
|
||||||
else
|
|
||||||
bytesWritten += (ssize_t)length;
|
|
||||||
|
|
||||||
pos += vecs[i].iov_len;
|
ssize_t bytesWritten = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
size_t length = vecs[i].iov_len;
|
||||||
|
status = descriptor->ops->fd_write(descriptor, pos,
|
||||||
|
vecs[i].iov_base, &length);
|
||||||
|
if (status < B_OK) {
|
||||||
|
bytesWritten = status;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else
|
|
||||||
bytesWritten = B_BAD_VALUE;
|
if ((uint64)bytesWritten + length > SSIZE_MAX)
|
||||||
|
bytesWritten = SSIZE_MAX;
|
||||||
|
else
|
||||||
|
bytesWritten += (ssize_t)length;
|
||||||
|
|
||||||
|
pos += vecs[i].iov_len;
|
||||||
|
}
|
||||||
|
|
||||||
if (movePosition)
|
if (movePosition)
|
||||||
descriptor->pos = pos;
|
descriptor->pos = pos;
|
||||||
|
|
||||||
put_fd(descriptor);
|
|
||||||
return bytesWritten;
|
return bytesWritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1120,7 +1118,7 @@ _kern_ioctl(int fd, ulong op, void *buffer, size_t length)
|
|||||||
{
|
{
|
||||||
TRACE(("kern_ioctl: fd %d\n", fd));
|
TRACE(("kern_ioctl: fd %d\n", fd));
|
||||||
|
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
|
|
||||||
return fd_ioctl(true, fd, op, buffer, length);
|
return fd_ioctl(true, fd, op, buffer, length);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ socket_read(struct file_descriptor *descriptor, off_t pos, void *buffer,
|
|||||||
size_t *_length)
|
size_t *_length)
|
||||||
{
|
{
|
||||||
ssize_t bytesRead = sStackInterface->recv(descriptor->u.socket, buffer,
|
ssize_t bytesRead = sStackInterface->recv(descriptor->u.socket, buffer,
|
||||||
*_length, 0, !IS_USER_ADDRESS(buffer));
|
*_length, 0);
|
||||||
*_length = bytesRead >= 0 ? bytesRead : 0;
|
*_length = bytesRead >= 0 ? bytesRead : 0;
|
||||||
return bytesRead >= 0 ? B_OK : bytesRead;
|
return bytesRead >= 0 ? B_OK : bytesRead;
|
||||||
}
|
}
|
||||||
@@ -200,7 +200,7 @@ socket_write(struct file_descriptor *descriptor, off_t pos, const void *buffer,
|
|||||||
size_t *_length)
|
size_t *_length)
|
||||||
{
|
{
|
||||||
ssize_t bytesWritten = sStackInterface->send(descriptor->u.socket, buffer,
|
ssize_t bytesWritten = sStackInterface->send(descriptor->u.socket, buffer,
|
||||||
*_length, 0, !IS_USER_ADDRESS(buffer));
|
*_length, 0);
|
||||||
*_length = bytesWritten >= 0 ? bytesWritten : 0;
|
*_length = bytesWritten >= 0 ? bytesWritten : 0;
|
||||||
return bytesWritten >= 0 ? B_OK : bytesWritten;
|
return bytesWritten >= 0 ? B_OK : bytesWritten;
|
||||||
}
|
}
|
||||||
@@ -210,8 +210,7 @@ static status_t
|
|||||||
socket_ioctl(struct file_descriptor *descriptor, ulong op, void *buffer,
|
socket_ioctl(struct file_descriptor *descriptor, ulong op, void *buffer,
|
||||||
size_t length)
|
size_t length)
|
||||||
{
|
{
|
||||||
return sStackInterface->ioctl(descriptor->u.socket, op, buffer,
|
return sStackInterface->ioctl(descriptor->u.socket, op, buffer, length);
|
||||||
length, !IS_USER_ADDRESS(buffer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -341,8 +340,7 @@ common_bind(int fd, const struct sockaddr *address, socklen_t addressLength,
|
|||||||
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
||||||
FDPutter _(descriptor);
|
FDPutter _(descriptor);
|
||||||
|
|
||||||
return sStackInterface->bind(descriptor->u.socket, address, addressLength,
|
return sStackInterface->bind(descriptor->u.socket, address, addressLength);
|
||||||
kernel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -366,7 +364,7 @@ common_connect(int fd, const struct sockaddr *address,
|
|||||||
FDPutter _(descriptor);
|
FDPutter _(descriptor);
|
||||||
|
|
||||||
return sStackInterface->connect(descriptor->u.socket, address,
|
return sStackInterface->connect(descriptor->u.socket, address,
|
||||||
addressLength, kernel);
|
addressLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -413,8 +411,7 @@ common_recv(int fd, void *data, size_t length, int flags, bool kernel)
|
|||||||
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
||||||
FDPutter _(descriptor);
|
FDPutter _(descriptor);
|
||||||
|
|
||||||
return sStackInterface->recv(descriptor->u.socket, data, length, flags,
|
return sStackInterface->recv(descriptor->u.socket, data, length, flags);
|
||||||
kernel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -427,7 +424,7 @@ common_recvfrom(int fd, void *data, size_t length, int flags,
|
|||||||
FDPutter _(descriptor);
|
FDPutter _(descriptor);
|
||||||
|
|
||||||
return sStackInterface->recvfrom(descriptor->u.socket, data, length,
|
return sStackInterface->recvfrom(descriptor->u.socket, data, length,
|
||||||
flags, address, _addressLength, kernel);
|
flags, address, _addressLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -438,8 +435,7 @@ common_recvmsg(int fd, struct msghdr *message, int flags, bool kernel)
|
|||||||
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
||||||
FDPutter _(descriptor);
|
FDPutter _(descriptor);
|
||||||
|
|
||||||
return sStackInterface->recvmsg(descriptor->u.socket, message, flags,
|
return sStackInterface->recvmsg(descriptor->u.socket, message, flags);
|
||||||
kernel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -450,8 +446,7 @@ common_send(int fd, const void *data, size_t length, int flags, bool kernel)
|
|||||||
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
||||||
FDPutter _(descriptor);
|
FDPutter _(descriptor);
|
||||||
|
|
||||||
return sStackInterface->send(descriptor->u.socket, data, length, flags,
|
return sStackInterface->send(descriptor->u.socket, data, length, flags);
|
||||||
kernel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -464,7 +459,7 @@ common_sendto(int fd, const void *data, size_t length, int flags,
|
|||||||
FDPutter _(descriptor);
|
FDPutter _(descriptor);
|
||||||
|
|
||||||
return sStackInterface->sendto(descriptor->u.socket, data, length, flags,
|
return sStackInterface->sendto(descriptor->u.socket, data, length, flags,
|
||||||
address, addressLength, kernel);
|
address, addressLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -475,8 +470,7 @@ common_sendmsg(int fd, const struct msghdr *message, int flags, bool kernel)
|
|||||||
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
GET_SOCKET_FD_OR_RETURN(fd, kernel, descriptor);
|
||||||
FDPutter _(descriptor);
|
FDPutter _(descriptor);
|
||||||
|
|
||||||
return sStackInterface->sendmsg(descriptor->u.socket, message, flags,
|
return sStackInterface->sendmsg(descriptor->u.socket, message, flags);
|
||||||
kernel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -585,6 +579,7 @@ common_get_next_socket_stat(int family, uint32 *cookie, struct net_stat *stat)
|
|||||||
int
|
int
|
||||||
socket(int family, int type, int protocol)
|
socket(int family, int type, int protocol)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_socket(family, type, protocol, true));
|
RETURN_AND_SET_ERRNO(common_socket(family, type, protocol, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -592,6 +587,7 @@ socket(int family, int type, int protocol)
|
|||||||
int
|
int
|
||||||
bind(int socket, const struct sockaddr *address, socklen_t addressLength)
|
bind(int socket, const struct sockaddr *address, socklen_t addressLength)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_bind(socket, address, addressLength, true));
|
RETURN_AND_SET_ERRNO(common_bind(socket, address, addressLength, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -599,6 +595,7 @@ bind(int socket, const struct sockaddr *address, socklen_t addressLength)
|
|||||||
int
|
int
|
||||||
shutdown(int socket, int how)
|
shutdown(int socket, int how)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_shutdown(socket, how, true));
|
RETURN_AND_SET_ERRNO(common_shutdown(socket, how, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -606,7 +603,7 @@ shutdown(int socket, int how)
|
|||||||
int
|
int
|
||||||
connect(int socket, const struct sockaddr *address, socklen_t addressLength)
|
connect(int socket, const struct sockaddr *address, socklen_t addressLength)
|
||||||
{
|
{
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_connect(socket, address, addressLength, true));
|
RETURN_AND_SET_ERRNO(common_connect(socket, address, addressLength, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -614,6 +611,7 @@ connect(int socket, const struct sockaddr *address, socklen_t addressLength)
|
|||||||
int
|
int
|
||||||
listen(int socket, int backlog)
|
listen(int socket, int backlog)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_listen(socket, backlog, true));
|
RETURN_AND_SET_ERRNO(common_listen(socket, backlog, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -621,7 +619,7 @@ listen(int socket, int backlog)
|
|||||||
int
|
int
|
||||||
accept(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
accept(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
||||||
{
|
{
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_accept(socket, address, _addressLength, true));
|
RETURN_AND_SET_ERRNO(common_accept(socket, address, _addressLength, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -629,7 +627,7 @@ accept(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
|||||||
ssize_t
|
ssize_t
|
||||||
recv(int socket, void *data, size_t length, int flags)
|
recv(int socket, void *data, size_t length, int flags)
|
||||||
{
|
{
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_recv(socket, data, length, flags, true));
|
RETURN_AND_SET_ERRNO(common_recv(socket, data, length, flags, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -638,7 +636,7 @@ ssize_t
|
|||||||
recvfrom(int socket, void *data, size_t length, int flags,
|
recvfrom(int socket, void *data, size_t length, int flags,
|
||||||
struct sockaddr *address, socklen_t *_addressLength)
|
struct sockaddr *address, socklen_t *_addressLength)
|
||||||
{
|
{
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_recvfrom(socket, data, length, flags, address,
|
RETURN_AND_SET_ERRNO(common_recvfrom(socket, data, length, flags, address,
|
||||||
_addressLength, true));
|
_addressLength, true));
|
||||||
}
|
}
|
||||||
@@ -647,7 +645,7 @@ recvfrom(int socket, void *data, size_t length, int flags,
|
|||||||
ssize_t
|
ssize_t
|
||||||
recvmsg(int socket, struct msghdr *message, int flags)
|
recvmsg(int socket, struct msghdr *message, int flags)
|
||||||
{
|
{
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_recvmsg(socket, message, flags, true));
|
RETURN_AND_SET_ERRNO(common_recvmsg(socket, message, flags, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -655,7 +653,7 @@ recvmsg(int socket, struct msghdr *message, int flags)
|
|||||||
ssize_t
|
ssize_t
|
||||||
send(int socket, const void *data, size_t length, int flags)
|
send(int socket, const void *data, size_t length, int flags)
|
||||||
{
|
{
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_send(socket, data, length, flags, true));
|
RETURN_AND_SET_ERRNO(common_send(socket, data, length, flags, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -664,7 +662,7 @@ ssize_t
|
|||||||
sendto(int socket, const void *data, size_t length, int flags,
|
sendto(int socket, const void *data, size_t length, int flags,
|
||||||
const struct sockaddr *address, socklen_t addressLength)
|
const struct sockaddr *address, socklen_t addressLength)
|
||||||
{
|
{
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_sendto(socket, data, length, flags, address,
|
RETURN_AND_SET_ERRNO(common_sendto(socket, data, length, flags, address,
|
||||||
addressLength, true));
|
addressLength, true));
|
||||||
}
|
}
|
||||||
@@ -673,7 +671,7 @@ sendto(int socket, const void *data, size_t length, int flags,
|
|||||||
ssize_t
|
ssize_t
|
||||||
sendmsg(int socket, const struct msghdr *message, int flags)
|
sendmsg(int socket, const struct msghdr *message, int flags)
|
||||||
{
|
{
|
||||||
IoctlSyscallFlagUnsetter _;
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_sendmsg(socket, message, flags, true));
|
RETURN_AND_SET_ERRNO(common_sendmsg(socket, message, flags, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -681,6 +679,7 @@ sendmsg(int socket, const struct msghdr *message, int flags)
|
|||||||
int
|
int
|
||||||
getsockopt(int socket, int level, int option, void *value, socklen_t *_length)
|
getsockopt(int socket, int level, int option, void *value, socklen_t *_length)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_getsockopt(socket, level, option, value,
|
RETURN_AND_SET_ERRNO(common_getsockopt(socket, level, option, value,
|
||||||
_length, true));
|
_length, true));
|
||||||
}
|
}
|
||||||
@@ -690,6 +689,7 @@ int
|
|||||||
setsockopt(int socket, int level, int option, const void *value,
|
setsockopt(int socket, int level, int option, const void *value,
|
||||||
socklen_t length)
|
socklen_t length)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_setsockopt(socket, level, option, value,
|
RETURN_AND_SET_ERRNO(common_setsockopt(socket, level, option, value,
|
||||||
length, true));
|
length, true));
|
||||||
}
|
}
|
||||||
@@ -698,6 +698,7 @@ setsockopt(int socket, int level, int option, const void *value,
|
|||||||
int
|
int
|
||||||
getpeername(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
getpeername(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_getpeername(socket, address, _addressLength,
|
RETURN_AND_SET_ERRNO(common_getpeername(socket, address, _addressLength,
|
||||||
true));
|
true));
|
||||||
}
|
}
|
||||||
@@ -706,6 +707,7 @@ getpeername(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
|||||||
int
|
int
|
||||||
getsockname(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
getsockname(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_getsockname(socket, address, _addressLength,
|
RETURN_AND_SET_ERRNO(common_getsockname(socket, address, _addressLength,
|
||||||
true));
|
true));
|
||||||
}
|
}
|
||||||
@@ -714,6 +716,7 @@ getsockname(int socket, struct sockaddr *address, socklen_t *_addressLength)
|
|||||||
int
|
int
|
||||||
sockatmark(int socket)
|
sockatmark(int socket)
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_sockatmark(socket, true));
|
RETURN_AND_SET_ERRNO(common_sockatmark(socket, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -721,6 +724,7 @@ sockatmark(int socket)
|
|||||||
int
|
int
|
||||||
socketpair(int family, int type, int protocol, int socketVector[2])
|
socketpair(int family, int type, int protocol, int socketVector[2])
|
||||||
{
|
{
|
||||||
|
SyscallFlagUnsetter _;
|
||||||
RETURN_AND_SET_ERRNO(common_socketpair(family, type, protocol,
|
RETURN_AND_SET_ERRNO(common_socketpair(family, type, protocol,
|
||||||
socketVector, true));
|
socketVector, true));
|
||||||
}
|
}
|
||||||
@@ -732,7 +736,8 @@ socketpair(int family, int type, int protocol, int socketVector[2])
|
|||||||
int
|
int
|
||||||
_user_socket(int family, int type, int protocol)
|
_user_socket(int family, int type, int protocol)
|
||||||
{
|
{
|
||||||
return common_socket(family, type, protocol, false);
|
SyscallRestartWrapper<int> result;
|
||||||
|
return result = common_socket(family, type, protocol, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -750,14 +755,17 @@ _user_bind(int socket, const struct sockaddr *userAddress,
|
|||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return common_bind(socket, (sockaddr*)address, addressLength, false);
|
SyscallRestartWrapper<status_t> error;
|
||||||
|
return error = common_bind(socket, (sockaddr*)address, addressLength,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
_user_shutdown_socket(int socket, int how)
|
_user_shutdown_socket(int socket, int how)
|
||||||
{
|
{
|
||||||
return common_shutdown(socket, how, false);
|
SyscallRestartWrapper<status_t> error;
|
||||||
|
return error = common_shutdown(socket, how, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -775,19 +783,18 @@ _user_connect(int socket, const struct sockaddr *userAddress,
|
|||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t error;
|
SyscallRestartWrapper<status_t> error;
|
||||||
IoctlSyscallRestartWrapper<status_t> restartWrapper(error);
|
|
||||||
|
|
||||||
error = common_connect(socket, (sockaddr*)address, addressLength, false);
|
return error = common_connect(socket, (sockaddr*)address, addressLength,
|
||||||
|
false);
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
_user_listen(int socket, int backlog)
|
_user_listen(int socket, int backlog)
|
||||||
{
|
{
|
||||||
return common_listen(socket, backlog, false);
|
SyscallRestartWrapper<status_t> error;
|
||||||
|
return error = common_listen(socket, backlog, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -803,8 +810,7 @@ _user_accept(int socket, struct sockaddr *userAddress,
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
// accept()
|
// accept()
|
||||||
int result;
|
SyscallRestartWrapper<int> result;
|
||||||
IoctlSyscallRestartWrapper<int> restartWrapper(result);
|
|
||||||
|
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LEN];
|
||||||
result = common_accept(socket,
|
result = common_accept(socket,
|
||||||
@@ -826,12 +832,8 @@ _user_accept(int socket, struct sockaddr *userAddress,
|
|||||||
ssize_t
|
ssize_t
|
||||||
_user_recv(int socket, void *data, size_t length, int flags)
|
_user_recv(int socket, void *data, size_t length, int flags)
|
||||||
{
|
{
|
||||||
ssize_t result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
IoctlSyscallRestartWrapper<ssize_t> restartWrapper(result);
|
return result = common_recv(socket, data, length, flags, false);
|
||||||
|
|
||||||
result = common_recv(socket, data, length, flags, false);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -847,8 +849,7 @@ _user_recvfrom(int socket, void *data, size_t length, int flags,
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
// recvfrom()
|
// recvfrom()
|
||||||
ssize_t result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
IoctlSyscallRestartWrapper<ssize_t> restartWrapper(result);
|
|
||||||
|
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LEN];
|
||||||
result = common_recvfrom(socket, data, length, flags,
|
result = common_recvfrom(socket, data, length, flags,
|
||||||
@@ -884,8 +885,7 @@ _user_recvmsg(int socket, struct msghdr *userMessage, int flags)
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
// recvmsg()
|
// recvmsg()
|
||||||
ssize_t result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
IoctlSyscallRestartWrapper<ssize_t> restartWrapper(result);
|
|
||||||
|
|
||||||
result = common_recvmsg(socket, &message, flags, false);
|
result = common_recvmsg(socket, &message, flags, false);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
@@ -906,12 +906,8 @@ _user_recvmsg(int socket, struct msghdr *userMessage, int flags)
|
|||||||
ssize_t
|
ssize_t
|
||||||
_user_send(int socket, const void *data, size_t length, int flags)
|
_user_send(int socket, const void *data, size_t length, int flags)
|
||||||
{
|
{
|
||||||
ssize_t result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
IoctlSyscallRestartWrapper<ssize_t> restartWrapper(result);
|
return result = common_send(socket, data, length, flags, false);
|
||||||
|
|
||||||
result = common_send(socket, data, length, flags, false);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -934,12 +930,10 @@ _user_sendto(int socket, const void *data, size_t length, int flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sendto()
|
// sendto()
|
||||||
ssize_t result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
IoctlSyscallRestartWrapper<ssize_t> restartWrapper(result);
|
|
||||||
|
|
||||||
result = common_sendto(socket, data, length, flags, (sockaddr*)address,
|
return result = common_sendto(socket, data, length, flags,
|
||||||
addressLength, false);
|
(sockaddr*)address, addressLength, false);
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -965,11 +959,9 @@ _user_sendmsg(int socket, const struct msghdr *userMessage, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sendmsg()
|
// sendmsg()
|
||||||
ssize_t result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
IoctlSyscallRestartWrapper<ssize_t> restartWrapper(result);
|
|
||||||
|
|
||||||
result = common_sendmsg(socket, &message, flags, false);
|
return result = common_sendmsg(socket, &message, flags, false);
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -993,7 +985,8 @@ _user_getsockopt(int socket, int level, int option, void *userValue,
|
|||||||
|
|
||||||
// getsockopt()
|
// getsockopt()
|
||||||
char value[MAX_SOCKET_OPTION_LEN];
|
char value[MAX_SOCKET_OPTION_LEN];
|
||||||
status_t error = common_getsockopt(socket, level, option, value, &length,
|
SyscallRestartWrapper<status_t> error;
|
||||||
|
error = common_getsockopt(socket, level, option, value, &length,
|
||||||
false);
|
false);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
@@ -1022,7 +1015,9 @@ _user_setsockopt(int socket, int level, int option, const void *userValue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setsockopt();
|
// setsockopt();
|
||||||
return common_setsockopt(socket, level, option, value, length, false);
|
SyscallRestartWrapper<status_t> error;
|
||||||
|
return error = common_setsockopt(socket, level, option, value, length,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1032,8 +1027,9 @@ _user_getpeername(int socket, struct sockaddr *userAddress,
|
|||||||
{
|
{
|
||||||
// check parameters
|
// check parameters
|
||||||
socklen_t addressLength = 0;
|
socklen_t addressLength = 0;
|
||||||
status_t error = prepare_userland_address_result(userAddress,
|
SyscallRestartWrapper<status_t> error;
|
||||||
_addressLength, addressLength, true);
|
error = prepare_userland_address_result(userAddress, _addressLength,
|
||||||
|
addressLength, true);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
@@ -1062,8 +1058,9 @@ _user_getsockname(int socket, struct sockaddr *userAddress,
|
|||||||
{
|
{
|
||||||
// check parameters
|
// check parameters
|
||||||
socklen_t addressLength = 0;
|
socklen_t addressLength = 0;
|
||||||
status_t error = prepare_userland_address_result(userAddress,
|
SyscallRestartWrapper<status_t> error;
|
||||||
_addressLength, addressLength, true);
|
error = prepare_userland_address_result(userAddress, _addressLength,
|
||||||
|
addressLength, true);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
@@ -1089,7 +1086,8 @@ _user_getsockname(int socket, struct sockaddr *userAddress,
|
|||||||
int
|
int
|
||||||
_user_sockatmark(int socket)
|
_user_sockatmark(int socket)
|
||||||
{
|
{
|
||||||
return common_sockatmark(socket, false);
|
SyscallRestartWrapper<status_t> error;
|
||||||
|
return error = common_sockatmark(socket, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1104,8 +1102,8 @@ _user_socketpair(int family, int type, int protocol, int *userSocketVector)
|
|||||||
|
|
||||||
// socketpair()
|
// socketpair()
|
||||||
int socketVector[2];
|
int socketVector[2];
|
||||||
status_t error = common_socketpair(family, type, protocol, socketVector,
|
SyscallRestartWrapper<status_t> error;
|
||||||
false);
|
error = common_socketpair(family, type, protocol, socketVector, false);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
@@ -1135,7 +1133,8 @@ _user_get_next_socket_stat(int family, uint32 *_cookie, struct net_stat *_stat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
net_stat stat;
|
net_stat stat;
|
||||||
status_t error = common_get_next_socket_stat(family, &cookie, &stat);
|
SyscallRestartWrapper<status_t> error;
|
||||||
|
error = common_get_next_socket_stat(family, &cookie, &stat);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user