1/* 2 * kernel-level support for sockets, includes userland support as well for testing. 3 * François Revol. 4 */ 5 6#ifndef _KSOCKET_H 7#define _KSOCKET_H 8 9#include <sys/socket.h> 10 11#ifndef _KERNEL_MODE /* userland wrapper */ 12 13#define ksocket socket 14#define kbind bind 15#define kconnect connect 16#define kgetsockname getsockname 17#define kgetpeername getpeername 18#define kaccept accept 19#define ksendmsg sendmsg 20#define krecvmsg recvmsg 21#define krecvfrom recvfrom 22#define ksendto sendto 23#define krecv recv 24#define ksend send 25#define klisten listen 26#define kshutdown shutdown 27#define kclosesocket close 28#define ksocket_init() ({B_OK;}) 29#define ksocket_cleanup() ({B_OK;}) 30#define kmessage(fmt, ...) printf(fmt "\n", ##__VA_ARGS__) 31#define KSOCKET_MODULE_DECL /* nothing */ 32 33#elif defined(__HAIKU__) 34 35/* Haiku socket module */ 36#include <os/drivers/socket_interface.h> 37 38extern struct socket_module_info *gSocket; 39#define ksocket (gSocket->socket) 40#define kbind (gSocket->bind) 41#define kconnect (gSocket->connect) 42#define kgetsockname (gSocket->getsockname) 43#define kgetpeername (gSocket->getpeername) 44#define kaccept (gSocket->accept) 45//#define kaccept(_fd, _addr, _sz) ({int thesock; thesock = (gSocket->accept)(_fd, _addr, _sz); dprintf("kaccept(%d, , ) = %d\n", _fd, thesock); thesock; }) 46#define ksendmsg (gSocket->sendmsg) 47#define krecvmsg (gSocket->recvmsg) 48#define krecvfrom (gSocket->recvfrom) 49#define ksendto (gSocket->sendto) 50#define krecv (gSocket->recv) 51#define ksend (gSocket->send) 52#define klisten (gSocket->listen) 53#define kshutdown (gSocket->shutdown) 54#define kclosesocket close 55#define kmessage(fmt, ...) dprintf("ksocket: " fmt "\n", ##__VA_ARGS__) 56 57extern status_t ksocket_init (void); 58extern status_t ksocket_cleanup (void); 59 60#define KSOCKET_MODULE_DECL \ 61struct socket_module_info *gSocket; \ 62status_t ksocket_init (void) { \ 63 return get_module(B_SOCKET_MODULE_NAME, (module_info **)&gSocket); \ 64} \ 65 \ 66status_t ksocket_cleanup (void) { \ 67 return put_module(B_SOCKET_MODULE_NAME); \ 68} 69 70#elif defined(BONE_VERSION) 71 72/* BONE socket module */ 73#include <sys/socket_module.h> 74 75extern bone_socket_info_t *gSocket; 76#define ksocket (gSocket->socket) 77//#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;}) 78#define kbind (gSocket->bind) 79#define kconnect (gSocket->connect) 80#define kgetsockname (gSocket->getsockname) 81#define kgetpeername (gSocket->getpeername) 82#define kaccept (gSocket->accept) 83//#define kaccept(_fd, _addr, _sz) ({int thesock; thesock = (gSocket->accept)(_fd, _addr, _sz); dprintf("kaccept(%d, , ) = %d\n", _fd, thesock); thesock; }) 84#define ksendmsg _ERROR_no_sendmsg_in_BONE 85#define krecvmsg _ERROR_no_recvmsg_in_BONE 86#define krecvfrom (gSocket->recvfrom) 87#define ksendto (gSocket->sendto) 88#define krecv (gSocket->recv) 89#define ksend (gSocket->send) 90#define klisten (gSocket->listen) 91#define kshutdown (gSocket->shutdown) 92#define kclosesocket close 93#define kmessage(fmt, ...) dprintf("ksocket: " fmt "\n", ##__VA_ARGS__) 94 95extern status_t ksocket_init (void); 96extern status_t ksocket_cleanup (void); 97 98#define KSOCKET_MODULE_DECL \ 99bone_socket_info_t *gSocket; \ 100status_t ksocket_init (void) { \ 101 return get_module(BONE_SOCKET_MODULE, (module_info **)&gSocket); \ 102} \ 103 \ 104status_t ksocket_cleanup (void) { \ 105 return put_module(BONE_SOCKET_MODULE); \ 106} 107 108#else /* _KERNEL_MODE, !BONE_VERSION */ 109 110#error feel free to put back ksocketd support if you dare 111 112#endif /* _KERNEL_MODE, BONE_VERSION */ 113 114#endif /* _KSOCKET_H */ 115