socket.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <sys/socket.h>
  2. #include <errno.h>
  3. #include <Kernel/Syscall.h>
  4. extern "C" {
  5. int socket(int domain, int type, int protocol)
  6. {
  7. int rc = syscall(SC_socket, domain, type, protocol);
  8. __RETURN_WITH_ERRNO(rc, rc, -1);
  9. }
  10. int bind(int sockfd, const sockaddr* addr, socklen_t addrlen)
  11. {
  12. int rc = syscall(SC_bind, sockfd, addr, addrlen);
  13. __RETURN_WITH_ERRNO(rc, rc, -1);
  14. }
  15. int listen(int sockfd, int backlog)
  16. {
  17. int rc = syscall(SC_listen, sockfd, backlog);
  18. __RETURN_WITH_ERRNO(rc, rc, -1);
  19. }
  20. int accept(int sockfd, sockaddr* addr, socklen_t* addrlen)
  21. {
  22. int rc = syscall(SC_accept, sockfd, addr, addrlen);
  23. __RETURN_WITH_ERRNO(rc, rc, -1);
  24. }
  25. int connect(int sockfd, const sockaddr* addr, socklen_t addrlen)
  26. {
  27. int rc = syscall(SC_connect, sockfd, addr, addrlen);
  28. __RETURN_WITH_ERRNO(rc, rc, -1);
  29. }
  30. ssize_t sendto(int sockfd, const void* data, size_t data_length, int flags, const struct sockaddr* addr, socklen_t addr_length)
  31. {
  32. Syscall::SC_sendto_params params { sockfd, data, data_length, flags, addr, addr_length };
  33. int rc = syscall(SC_sendto, &params);
  34. __RETURN_WITH_ERRNO(rc, rc, -1);
  35. }
  36. ssize_t recvfrom(int sockfd, void* buffer, size_t buffer_length, int flags, struct sockaddr* addr, socklen_t* addr_length)
  37. {
  38. Syscall::SC_recvfrom_params params { sockfd, buffer, buffer_length, flags, addr, addr_length };
  39. int rc = syscall(SC_recvfrom, &params);
  40. __RETURN_WITH_ERRNO(rc, rc, -1);
  41. }
  42. int getsockopt(int sockfd, int level, int option, void* value, socklen_t* value_size)
  43. {
  44. Syscall::SC_getsockopt_params params { sockfd, level, option, value, value_size };
  45. int rc = syscall(SC_getsockopt, &params);
  46. __RETURN_WITH_ERRNO(rc, rc, -1);
  47. }
  48. int setsockopt(int sockfd, int level, int option, const void* value, socklen_t value_size)
  49. {
  50. Syscall::SC_setsockopt_params params { sockfd, level, option, value, value_size };
  51. int rc = syscall(SC_setsockopt, &params);
  52. __RETURN_WITH_ERRNO(rc, rc, -1);
  53. }
  54. }