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

12345678910111213141516171819202122232425262728293031323334353637383940
  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 <stdio.h>
  8. #include <string.h>
  9. #include <sys/socket.h>
  10. #include <unistd.h>
  11. int main(int, char**)
  12. {
  13. constexpr const char* path = "/tmp/foo";
  14. int rc = symlink("bar", path);
  15. if (rc < 0) {
  16. perror("symlink");
  17. return 1;
  18. }
  19. int fd = socket(AF_UNIX, SOCK_STREAM, 0);
  20. if (fd < 0) {
  21. perror("socket");
  22. return 1;
  23. }
  24. struct sockaddr_un addr;
  25. memset(&addr, 0, sizeof(addr));
  26. addr.sun_family = AF_UNIX;
  27. VERIFY(strlcpy(addr.sun_path, path, sizeof(addr.sun_path)) < sizeof(addr.sun_path));
  28. rc = bind(fd, (struct sockaddr*)(&addr), sizeof(addr));
  29. if (rc < 0 && errno == EADDRINUSE) {
  30. printf("PASS\n");
  31. return 0;
  32. }
  33. return 1;
  34. }