return 0;
}
-static int make_local_socket(const char *filename, int server, mode_t ipc_perm)
+static int make_local_socket(const char *filename, int server, mode_t ipc_perm, int ipc_gid)
{
size_t l = strlen(filename);
size_t size = offsetof(struct sockaddr_un, sun_path) + l;
int result = -errno;
SYSERR("chmod failed: %s", filename);
close(sock);
+ unlink(filename);
+ return result;
+ }
+ if (chown(filename, -1, ipc_gid) < 0) {
+ int result = -errno;
+ SYSERR("chmod failed: %s", filename);
+ close(sock);
+ unlink(filename);
return result;
}
}
if (ret < 0)
return ret;
- ret = make_local_socket(dmix->shmptr->socket_name, 1, dmix->ipc_perm);
+ ret = make_local_socket(dmix->shmptr->socket_name, 1, dmix->ipc_perm, dmix->ipc_gid);
if (ret < 0)
return ret;
dmix->server_fd = ret;
int ret;
unsigned char buf;
- ret = make_local_socket(dmix->shmptr->socket_name, 0, dmix->ipc_perm);
+ ret = make_local_socket(dmix->shmptr->socket_name, 0, -1, -1);
if (ret < 0)
return ret;
dmix->comm_fd = ret;