bind-local-socket-to-symlink.cpp 880 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * Copyright (c) 2018-2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Assertions.h>
  7. #include <errno.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <sys/socket.h>
  11. #include <unistd.h>
  12. int main(int, char**)
  13. {
  14. constexpr const char* path = "/tmp/foo";
  15. int rc = symlink("bar", path);
  16. if (rc < 0) {
  17. perror("symlink");
  18. return 1;
  19. }
  20. int fd = socket(AF_UNIX, SOCK_STREAM, 0);
  21. if (fd < 0) {
  22. perror("socket");
  23. return 1;
  24. }
  25. struct sockaddr_un addr;
  26. memset(&addr, 0, sizeof(addr));
  27. addr.sun_family = AF_UNIX;
  28. VERIFY(strlcpy(addr.sun_path, path, sizeof(addr.sun_path)) < sizeof(addr.sun_path));
  29. rc = bind(fd, (struct sockaddr*)(&addr), sizeof(addr));
  30. if (rc < 0 && errno == EADDRINUSE) {
  31. printf("PASS\n");
  32. return 0;
  33. }
  34. return 1;
  35. }