Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. #ifndef __SOCKET_H__
  2. #define __SOCKET_H__
  3.  
  4. #include <stddef.h>
  5.  
  6. // Socket Types
  7. #define SOCK_STREAM 1
  8. #define SOCK_DGRAM 2
  9. #define SOCK_RAW 3
  10.  
  11. // IP protocols
  12. #define IPPROTO_IP 0
  13. #define IPPROTO_ICMP 1
  14. #define IPPROTO_TCP 6
  15. #define IPPROTO_UDP 17
  16. #define IPPROTO_RAW 255
  17.  
  18. // IP options
  19. #define IP_TTL 2
  20.  
  21. // Address families
  22. #define AF_UNSPEC 0
  23. #define AF_LOCAL 1
  24. #define AF_INET4 2     // IPv4
  25. #define AF_INET6 10    // IPv6
  26.  
  27. #define PF_UNSPEC AF_UNSPEC
  28. #define PF_LOCAL  AF_LOCAL
  29. #define PF_INET4  AF_INET4
  30. #define PF_INET6  AF_INET6
  31.  
  32. // internal definition
  33. #define AI_SUPPORTED 0x40F
  34.  
  35. // for system function 76
  36. #define API_ETH (0<<16)
  37. #define API_IPv4 (1<<16)
  38. #define API_ICMP (2<<16)
  39. #define API_UDP (3<<16)
  40. #define API_TCP (4<<16)
  41. #define API_ARP (5<<16)
  42. #define API_PPPOE (6<<16)
  43.  
  44. // Socket flags for user calls
  45. #define MSG_NOFLAG 0
  46. #define MSG_PEEK 0x02
  47. #define MSG_DONTWAIT 0x40
  48.  
  49. // Socket levels
  50. #define SOL_SOCKET 0xffff
  51.  
  52. //Socket options
  53. #define SO_BINDTODEVICE (1<<9)
  54. #define SO_NONBLOCK (1<<31)
  55.  
  56. // Error Codes
  57. #define ENOBUFS      1
  58. #define EINPROGRESS  2
  59. #define EOPNOTSUPP   4
  60. #define EWOULDBLOCK  6
  61. #define ENOTCONN     9
  62. #define EALREADY     10
  63. #define EINVALUE     11
  64. #define EMSGSIZE     12
  65. #define ENOMEM       18
  66. #define EADDRINUSE   20
  67. #define ECONNREFUSED 61
  68. #define ECONNRESET   52
  69. #define EISCONN      56
  70. #define ETIMEDOUT    60
  71. #define ECONNABORTED 53
  72.  
  73.  
  74. #define PORT(X) (X<<8)
  75. int err_code;
  76.  
  77. #pragma pack(push,1)
  78. typedef struct{
  79.     unsigned short sin_family;
  80.     unsigned short sin_port;
  81.     unsigned int sin_addr;
  82.     unsigned long long sin_zero;
  83. }sockaddr;
  84. #pragma pack(pop)
  85.  
  86. #pragma pack(push,1)
  87. typedef struct{
  88.   unsigned int level;
  89.   unsigned int optionname;
  90.   unsigned int optlenght;
  91.   unsigned char options;
  92. }optstruct;
  93. #pragma pack(pop)
  94.  
  95. static inline int socket(int domain, int type, int protocol)
  96. {
  97.     int socket;
  98.     asm volatile(
  99.     "int $0x40"
  100.     :"=b"(err_code), "=a"(socket)
  101.     :"a"(75), "b"(0), "c"(domain), "d"(type), "S"(protocol)
  102.     );
  103.     return socket;
  104. }
  105.  
  106. static inline int close(int socket)
  107. {
  108.     int status;
  109.     asm volatile(
  110.     "int $0x40"
  111.     :"=b"(err_code), "=a"(status)
  112.     :"a"(75), "b"(1), "c"(socket)
  113.     );
  114.     return status;
  115. }
  116. static inline int bind(int socket, const sockaddr *addres, int addres_len)
  117. {
  118.     int status;
  119.     asm volatile(
  120.     "int $0x40"
  121.     :"=b"(err_code), "=a"(status)
  122.     :"a"(75), "b"(2), "c"(socket), "d"(addres), "S"(addres_len)
  123.     );
  124.     return status;
  125. }
  126.  
  127. static inline int listen(int socket, int backlog)
  128. {
  129.     int status;
  130.     asm volatile(
  131.     "int $0x40"
  132.     :"=b"(err_code), "=a"(status)
  133.     :"a"(75), "b"(3), "c"(socket), "d"(backlog)
  134.     );
  135.     return status;
  136. }
  137.  
  138. static inline int connect(int socket,const sockaddr* address, int socket_len)
  139. {
  140.     int status;
  141.     asm volatile(
  142.     "int $0x40"
  143.     :"=b"(err_code), "=a"(status)
  144.     :"a"(75), "b"(4), "c"(socket), "d"(address), "S"(socket_len)
  145.     );
  146.     return status;
  147. }
  148.  
  149. static inline int accept(int socket, const sockaddr *address, int address_len)
  150. {
  151.     int new_socket;
  152.     asm volatile(
  153.     "int $0x40"
  154.     :"=b"(err_code), "=a"(new_socket)
  155.     :"a"(75), "b"(5), "c"(socket), "d"(address), "S"(address_len)
  156.     );
  157.     return new_socket;
  158. }
  159.  
  160. static inline int send(int socket, const void *message, size_t msg_len, int flag)
  161. {
  162.     int status;
  163.     asm volatile(
  164.     "int $0x40"
  165.     :"=b"(err_code), "=a"(status)
  166.     :"a"(75), "b"(6), "c"(socket), "d"(message), "S"(msg_len), "D"(flag)
  167.     );
  168.     return status;
  169. }
  170.  
  171. static inline int recv(int socket, void *buffer, size_t buff_len, int flag)
  172. {
  173.     int status;
  174.     asm volatile(
  175.     "int $0x40"
  176.     :"=b"(err_code), "=a"(status)
  177.     :"a"(75), "b"(7), "c"(socket), "d"(buffer), "S"(buff_len), "D"(flag)
  178.     );
  179.     return status;
  180. }
  181.  
  182. static inline int setsockopt(int socket,const optstruct* opt)
  183. {
  184.     int status;
  185.     asm volatile(
  186.         "int $0x40"
  187.         :"=b"(err_code), "=a"(status)
  188.         :"a"(75), "b"(8), "c"(socket),"d"(opt)
  189.     );
  190.     return status;
  191. }
  192.  
  193. static inline int getsockopt(int socket, optstruct* opt)
  194. {
  195.     int status;
  196.     asm volatile(
  197.         "int $0x40"
  198.         :"=b"(err_code), "=a"(status)
  199.         :"a"(75), "b"(9), "c"(socket),"d"(opt)
  200.     );
  201.     return status;
  202. }
  203.  
  204. static inline int socketpair(int *socket1, int *socket2)
  205. {
  206.     asm volatile(
  207.         "int $0x40"
  208.         :"=b"(*socket2), "=a"(*socket1)
  209.         :"a"(75), "b"(10)
  210.     );
  211.     err_code=*socket2;
  212.     return *socket1;
  213. }
  214. #endif
  215.