haiku/headers/private/net/net_socket.h
Axel Dörfler 6f440aed2c * net_socket_module_info::acquire_socket() now returns whether or not the
socket could be acquired, ie. when its reference count is 0, it cannot be
  acquired anymore. This requires the protocol to do proper locking, though.
* The TCP EndpointManager now checks the return value of acquire_socket(), and
  only returns the endpoint if that succeeded.
* This fixes bug #2197.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30363 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-04-24 10:12:30 +00:00

119 lines
3.7 KiB
C

/*
* Copyright 2006-2009, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef NET_SOCKET_H
#define NET_SOCKET_H
#include <net_buffer.h>
#include <sys/socket.h>
#include <lock.h>
struct selectsync;
#define NET_SOCKET_MODULE_NAME "network/stack/socket/v1"
typedef struct net_socket {
struct net_protocol *first_protocol;
struct net_protocol_module_info *first_info;
int family;
int type;
int protocol;
struct sockaddr_storage address;
struct sockaddr_storage peer;
int options;
int linger;
int bound_to_device;
struct {
uint32 buffer_size;
uint32 low_water_mark;
bigtime_t timeout;
} send, receive;
status_t error;
} net_socket;
struct net_socket_module_info {
struct module_info info;
status_t (*open_socket)(int family, int type, int protocol,
net_socket **_socket);
status_t (*close)(net_socket *socket);
void (*free)(net_socket *socket);
status_t (*readv)(net_socket *socket, const iovec *vecs,
size_t vecCount, size_t *_length);
status_t (*writev)(net_socket *socket, const iovec *vecs,
size_t vecCount, size_t *_length);
status_t (*control)(net_socket *socket, int32 op, void *data,
size_t length);
ssize_t (*read_avail)(net_socket *socket);
ssize_t (*send_avail)(net_socket *socket);
status_t (*send_data)(net_socket *socket, net_buffer *buffer);
status_t (*receive_data)(net_socket *socket, size_t length,
uint32 flags, net_buffer **_buffer);
status_t (*get_option)(net_socket *socket, int level, int option,
void *value, int *_length);
status_t (*set_option)(net_socket *socket, int level, int option,
const void *value, int length);
status_t (*get_next_stat)(uint32 *cookie, int family,
struct net_stat *stat);
// connections
bool (*acquire_socket)(net_socket *socket);
bool (*release_socket)(net_socket *socket);
status_t (*spawn_pending_socket)(net_socket *parent,
net_socket **_socket);
status_t (*dequeue_connected)(net_socket *parent, net_socket **_socket);
ssize_t (*count_connected)(net_socket *parent);
status_t (*set_max_backlog)(net_socket *socket, uint32 backlog);
bool (*has_parent)(net_socket *socket);
status_t (*set_connected)(net_socket *socket);
status_t (*set_aborted)(net_socket *socket);
// notifications
status_t (*request_notification)(net_socket *socket, uint8 event,
struct selectsync *sync);
status_t (*cancel_notification)(net_socket *socket, uint8 event,
struct selectsync *sync);
status_t (*notify)(net_socket *socket, uint8 event, int32 value);
// standard socket API
int (*accept)(net_socket *socket, struct sockaddr *address,
socklen_t *_addressLength, net_socket **_acceptedSocket);
int (*bind)(net_socket *socket, const struct sockaddr *address,
socklen_t addressLength);
int (*connect)(net_socket *socket, const struct sockaddr *address,
socklen_t addressLength);
int (*getpeername)(net_socket *socket, struct sockaddr *address,
socklen_t *_addressLength);
int (*getsockname)(net_socket *socket, struct sockaddr *address,
socklen_t *_addressLength);
int (*getsockopt)(net_socket *socket, int level, int option,
void *optionValue, int *_optionLength);
int (*listen)(net_socket *socket, int backlog);
ssize_t (*receive)(net_socket *socket, struct msghdr *, void *data,
size_t length, int flags);
ssize_t (*send)(net_socket *socket, struct msghdr *, const void *data,
size_t length, int flags);
int (*setsockopt)(net_socket *socket, int level, int option,
const void *optionValue, int optionLength);
int (*shutdown)(net_socket *socket, int direction);
status_t (*socketpair)(int family, int type, int protocol,
net_socket* _sockets[2]);
};
#endif // NET_SOCKET_H