socket.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <AK/Assertions.h>
  2. #include <Kernel/Syscall.h>
  3. #include <errno.h>
  4. #include <stdio.h>
  5. #include <sys/socket.h>
  6. extern "C" {
  7. int socket(int domain, int type, int protocol)
  8. {
  9. int rc = syscall(SC_socket, domain, type, protocol);
  10. __RETURN_WITH_ERRNO(rc, rc, -1);
  11. }
  12. int bind(int sockfd, const sockaddr* addr, socklen_t addrlen)
  13. {
  14. int rc = syscall(SC_bind, sockfd, addr, addrlen);
  15. __RETURN_WITH_ERRNO(rc, rc, -1);
  16. }
  17. int listen(int sockfd, int backlog)
  18. {
  19. int rc = syscall(SC_listen, sockfd, backlog);
  20. __RETURN_WITH_ERRNO(rc, rc, -1);
  21. }
  22. int accept(int sockfd, sockaddr* addr, socklen_t* addrlen)
  23. {
  24. int rc = syscall(SC_accept, sockfd, addr, addrlen);
  25. __RETURN_WITH_ERRNO(rc, rc, -1);
  26. }
  27. int connect(int sockfd, const sockaddr* addr, socklen_t addrlen)
  28. {
  29. int rc = syscall(SC_connect, sockfd, addr, addrlen);
  30. __RETURN_WITH_ERRNO(rc, rc, -1);
  31. }
  32. ssize_t sendto(int sockfd, const void* data, size_t data_length, int flags, const struct sockaddr* addr, socklen_t addr_length)
  33. {
  34. Syscall::SC_sendto_params params { sockfd, { data, data_length }, flags, addr, addr_length };
  35. int rc = syscall(SC_sendto, &params);
  36. __RETURN_WITH_ERRNO(rc, rc, -1);
  37. }
  38. ssize_t send(int sockfd, const void* data, size_t data_length, int flags)
  39. {
  40. return sendto(sockfd, data, data_length, flags, nullptr, 0);
  41. }
  42. ssize_t recvfrom(int sockfd, void* buffer, size_t buffer_length, int flags, struct sockaddr* addr, socklen_t* addr_length)
  43. {
  44. Syscall::SC_recvfrom_params params { sockfd, { buffer, buffer_length }, flags, addr, addr_length };
  45. int rc = syscall(SC_recvfrom, &params);
  46. __RETURN_WITH_ERRNO(rc, rc, -1);
  47. }
  48. ssize_t recv(int sockfd, void* buffer, size_t buffer_length, int flags)
  49. {
  50. return recvfrom(sockfd, buffer, buffer_length, flags, nullptr, nullptr);
  51. }
  52. int getsockopt(int sockfd, int level, int option, void* value, socklen_t* value_size)
  53. {
  54. Syscall::SC_getsockopt_params params { sockfd, level, option, value, value_size };
  55. int rc = syscall(SC_getsockopt, &params);
  56. __RETURN_WITH_ERRNO(rc, rc, -1);
  57. }
  58. int setsockopt(int sockfd, int level, int option, const void* value, socklen_t value_size)
  59. {
  60. Syscall::SC_setsockopt_params params { sockfd, level, option, value, value_size };
  61. int rc = syscall(SC_setsockopt, &params);
  62. __RETURN_WITH_ERRNO(rc, rc, -1);
  63. }
  64. int getsockname(int sockfd, struct sockaddr* addr, socklen_t* addrlen)
  65. {
  66. int rc = syscall(SC_getsockname, sockfd, addr, addrlen);
  67. __RETURN_WITH_ERRNO(rc, rc, -1);
  68. }
  69. int getpeername(int sockfd, struct sockaddr* addr, socklen_t* addrlen)
  70. {
  71. int rc = syscall(SC_getpeername, sockfd, addr, addrlen);
  72. __RETURN_WITH_ERRNO(rc, rc, -1);
  73. }
  74. }