diff --git a/headers/private/drivers/ksocket.h b/headers/private/drivers/ksocket.h new file mode 100644 index 0000000000..903e70189e --- /dev/null +++ b/headers/private/drivers/ksocket.h @@ -0,0 +1,114 @@ +/* + * kernel-level support for sockets, includes userland support as well for testing. + * François Revol. + */ + +#ifndef _KSOCKET_H +#define _KSOCKET_H + +#include + +#ifndef _KERNEL_MODE /* userland wrapper */ + +#define ksocket socket +#define kbind bind +#define kconnect connect +#define kgetsockname getsockname +#define kgetpeername getpeername +#define kaccept accept +#define ksendmsg sendmsg +#define krecvmsg recvmsg +#define krecvfrom recvfrom +#define ksendto sendto +#define krecv recv +#define ksend send +#define klisten listen +#define kshutdown shutdown +#define kclosesocket close +#define ksocket_init() ({B_OK;}) +#define ksocket_cleanup() ({B_OK;}) +#define kmessage(fmt, ...) printf(fmt "\n", ##__VA_ARGS__) +#define KSOCKET_MODULE_DECL /* nothing */ + +#elif defined(__HAIKU__) + +/* Haiku socket module */ +#include + +extern struct socket_module_info *gSocket; +#define ksocket (gSocket->socket) +#define kbind (gSocket->bind) +#define kconnect (gSocket->connect) +#define kgetsockname (gSocket->getsockname) +#define kgetpeername (gSocket->getpeername) +#define kaccept (gSocket->accept) +//#define kaccept(_fd, _addr, _sz) ({int thesock; thesock = (gSocket->accept)(_fd, _addr, _sz); dprintf("kaccept(%d, , ) = %d\n", _fd, thesock); thesock; }) +#define ksendmsg (gSocket->sendmsg) +#define krecvmsg (gSocket->recvmsg) +#define krecvfrom (gSocket->recvfrom) +#define ksendto (gSocket->sendto) +#define krecv (gSocket->recv) +#define ksend (gSocket->send) +#define klisten (gSocket->listen) +#define kshutdown (gSocket->shutdown) +#define kclosesocket close +#define kmessage(fmt, ...) dprintf("ksocket: " fmt "\n", ##__VA_ARGS__) + +extern status_t ksocket_init (void); +extern status_t ksocket_cleanup (void); + +#define KSOCKET_MODULE_DECL \ +struct socket_module_info *gSocket; \ +status_t ksocket_init (void) { \ + return get_module(B_SOCKET_MODULE_NAME, (module_info **)&gSocket); \ +} \ + \ +status_t ksocket_cleanup (void) { \ + return put_module(B_SOCKET_MODULE_NAME); \ +} + +#elif defined(BONE_VERSION) + +/* BONE socket module */ +#include + +extern bone_socket_info_t *gSocket; +#define ksocket (gSocket->socket) +//#define ksocket(_fam, _typ, _pro) ({int thesock; thesock = (gSocket->socket)(_fam, _typ, _pro); dprintf("ksocket(%d, %d, %d) = %d\n", _fam, _typ, _pro, thesock); thesock;}) +#define kbind (gSocket->bind) +#define kconnect (gSocket->connect) +#define kgetsockname (gSocket->getsockname) +#define kgetpeername (gSocket->getpeername) +#define kaccept (gSocket->accept) +//#define kaccept(_fd, _addr, _sz) ({int thesock; thesock = (gSocket->accept)(_fd, _addr, _sz); dprintf("kaccept(%d, , ) = %d\n", _fd, thesock); thesock; }) +#define ksendmsg _ERROR_no_sendmsg_in_BONE +#define krecvmsg _ERROR_no_recvmsg_in_BONE +#define krecvfrom (gSocket->recvfrom) +#define ksendto (gSocket->sendto) +#define krecv (gSocket->recv) +#define ksend (gSocket->send) +#define klisten (gSocket->listen) +#define kshutdown (gSocket->shutdown) +#define kclosesocket close +#define kmessage(fmt, ...) dprintf("ksocket: " fmt "\n", ##__VA_ARGS__) + +extern status_t ksocket_init (void); +extern status_t ksocket_cleanup (void); + +#define KSOCKET_MODULE_DECL \ +bone_socket_info_t *gSocket; \ +status_t ksocket_init (void) { \ + return get_module(BONE_SOCKET_MODULE, (module_info **)&gSocket); \ +} \ + \ +status_t ksocket_cleanup (void) { \ + return put_module(BONE_SOCKET_MODULE); \ +} + +#else /* _KERNEL_MODE, !BONE_VERSION */ + +#error feel free to put back ksocketd support if you dare + +#endif /* _KERNEL_MODE, BONE_VERSION */ + +#endif /* _KSOCKET_H */