Как создать файл сокета unix с правами чтения / записи для разных пользователей C ++? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть 2 разных приложения, работающих на 2 разных пользователей в linux. Я хочу, чтобы они были соединены с помощью unix сокетов и, поскольку сокет домена unix известен по имени пути, 2 приложения должны использовать один и тот же путь и тот же файл сокета, который был создан. Проблема здесь в том, что при привязке сокета на сервере все нормально, но при попытке подключения из 2-го приложения появляется ошибка «доступ запрещен».

Вот код, который я использую для сервера, который создает файл сокета.

  int main() {
    struct sockaddr_un addr;
    char buf[100];
    int fd,cl,rc;

    if (argc > 1) socket_path=argv[1];

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

    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    if (*socket_path.c_str() == '\0') {
      *addr.sun_path = '\0';
      strncpy(addr.sun_path+1, socket_path.c_str()+1, sizeof(addr.sun_path)-2);
    } else {
      strncpy(addr.sun_path, socket_path.c_str(), sizeof(addr.sun_path)-1);
      unlink(socket_path.c_str());
    }

    if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
      perror("bind error");
      exit(-1);
    }

    if (listen(fd, 5) == -1) {
      perror("listen error");
      exit(-1);
    }

     return 0;
}

1 Ответ

0 голосов
/ 29 апреля 2020

Я решил проблему, просто изменив разрешения с помощью функции chmod, как предложил @Sam Varshavchik.

Поскольку оба пользователя принадлежат к одной группе, я использовал S_IRWXG, чтобы установить все разрешения для группы.

chmod(socket_path.c_str(), S_IRWXG);
...