IT

C에서 특정 권한으로 유닉스 도메인 소켓을 만드는 방법?

itgroup 2023. 10. 25. 23:16
반응형

C에서 특정 권한으로 유닉스 도메인 소켓을 만드는 방법?

간단한 코드가 있어요 다음과 같습니다.

sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
unlink(path);

int fd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)(&address), sizeof(address));
listen(fd, 100);

다음과 같이 특정 권한을 가진 Unix Domain Socket 파일을 원자적으로 생성하고자 합니다.0777. 설명서에는 소켓 파일 권한에 대한 내용이 없습니다.umask아니면 뭐든.심지어, 만약에.umask소켓 파일에 영향을 미치므로 다중 threaded 프로그램에서는 원자 방식이 아닙니다.

동기화를 사용하지 않고 목표를 달성할 수 있는 방법이 있기를 바랍니다.umask()부름.

또 다른 해결책은 원하는 권한을 가진 디렉토리를 생성한 다음 그 내부에 소켓을 생성하는 것입니다(오류 검사 및 버퍼 오버플로에 대한 고려 없이 코드 예시).

// Create a directory with the proper permissions
mkdir(path, 0700);
// Append the name of the socket
strcat(path, "/socket_name");

// Create the socket normally
sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)(&address), sizeof(address));
listen(fd, 100);

나는 최고의 운을 이용했습니다.chmod()(없음)fchmod()호출 후 Unix 도메인 소켓의 파일 이름 사용socket(),bind(), 전화하기 전에listen().

  int return_value;
  const char *sock_path;
  struct sockaddr_un local;

  sock_path = "/tmp/mysocket";

  sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
  if (sockfd == -1)
  {
    perror("socket");
    exit(-1);
  }

  local.sun_family = AF_UNIX; 
  strcpy(local.sun_path, sock_path);
  unlink(local.sun_path);
  len = strlen(local.sun_path) + sizeof(local.sun_family);
  bind(sockfd, (struct sockaddr *)&local, len);

  chmod(sock_path, 0777);

  retval = listen(sockfd, BACKLOG);
  if (retval == -1)
  {
    perror("listen");
    exit(-1);
  }

. . . . .

포크, 사용umask그리고 뒤로 돌아감.fd내가 생각할 수 있는 유일한 휴대용 방법입니다.예를 들어, 소켓에 대한 디렉토리를 갖는 것이 더 낫습니다. 디렉토리에 적절한 권한이 없으면 아무도 소켓을 삭제할 수 없으며 디렉토리를 만드는 것은 원자적으로 수행될 수 있습니다.

더 큰 문제는 사용 권한에 의존하는 것이 휴대용이 아니라는 것입니다. 많은 BSD 파생 소켓 스택은 단순히 엔클로저 디렉토리 및/또는 소켓 자체의 사용 권한을 무시합니다.

GNU/리눅스 시스템에서는 다음을 호출하여 작업할 수 있습니다.fchmod()소켓에fd끝나고socket()그리고 그전에bind().

언급URL : https://stackoverflow.com/questions/20171747/how-to-create-unix-domain-socket-with-a-specific-permissions-in-c

반응형