Subversion Repositories Kolibri OS

Rev

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

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