#include "minet_socket.h" #define UNINIT_SOCKS 0 #define KERNEL_SOCKS 1 #define MINET_SOCKS 2 #ifdef __cplusplus #define EXTERNC extern "C" #else #define EXTERNC #endif int socket_type = 0; EXTERNC int minet_error () { return (errno); } EXTERNC int minet_perror (char *s) { perror (s); return (0); } EXTERNC int minet_init (minet_socket_types type) { if (type == MINET_KERNEL) socket_type = KERNEL_SOCKS; else socket_type = MINET_SOCKS; return (socket_type); } EXTERNC int minet_deinit () { socket_type = UNINIT_SOCKS; return (socket_type); } EXTERNC int minet_socket (int type) { switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: if ((type != SOCK_STREAM) && (type != SOCK_DGRAM)) { errno = EINVAL; // "Invalid argument" error return (-1); } else return (socket (AF_INET, type, 0)); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } } EXTERNC int minet_bind (int sockfd, struct sockaddr_in *myaddr) { switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (bind (sockfd, (sockaddr *) myaddr, sizeof(*myaddr))); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); return (ENOSYS); // "Function not implemented" error break; } } EXTERNC int minet_listen (int sockfd, int backlog) { switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (listen (sockfd, backlog)); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } } EXTERNC int minet_accept (int sockfd, struct sockaddr_in *addr) { socklen_t length = sizeof(*addr); switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (accept (sockfd, (sockaddr *) addr, &length)); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } } EXTERNC int minet_connect (int sockfd, struct sockaddr_in *addr) { switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (connect (sockfd, (sockaddr *) addr, sizeof(*addr))); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } } EXTERNC int minet_read (int fd, char *buf, int len) { switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (read (fd, buf, len)); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } } EXTERNC int minet_write (int fd, char *buf, int len) { switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (write (fd, buf, len)); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } } EXTERNC int minet_recvfrom (int fd, char *buf, int len, struct sockaddr_in *from) { socklen_t length = sizeof(*from); switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (recvfrom (fd, buf, len, 0, (sockaddr *) from, &length)); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } } EXTERNC int minet_sendto (int fd, char *buf, int len, struct sockaddr_in *to) { switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (sendto (fd, buf, len, 0, (sockaddr *) to, sizeof(*to))); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } } EXTERNC int minet_close (int sockfd) { switch (socket_type) { case UNINIT_SOCKS: errno = ENODEV; // "No such device" error return (-1); break; case KERNEL_SOCKS: return (close (sockfd)); break; case MINET_SOCKS: errno = ENOSYS; // "Function not implemented" error return (-1); break; } }