mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-12-16 08:56:42 -05:00
Maik Broemme <mbroemme@plusserver.de>
- added ipc_perm for dmix plugin Jaroslav Kysela <perex@suse.cz> - added ipc_perm for dsnoop and dshare plugins - added ipc_perm to doc/asoundrc.txt
This commit is contained in:
parent
e88884e9bf
commit
0545cf711d
6 changed files with 88 additions and 15 deletions
|
|
@ -317,6 +317,7 @@ pcm.NAME {
|
||||||
type dmix # Direct mixing plugin
|
type dmix # Direct mixing plugin
|
||||||
slave STR # Slave name (see pcm_slave)
|
slave STR # Slave name (see pcm_slave)
|
||||||
ipc_key INT # Unique ipc key
|
ipc_key INT # Unique ipc key
|
||||||
|
ipc_perm INT # ipc permissions (default 0600)
|
||||||
ipc_key_add_uid BOOL # Add current uid to ipc_key
|
ipc_key_add_uid BOOL # Add current uid to ipc_key
|
||||||
bindings { # Bindings table
|
bindings { # Bindings table
|
||||||
N INT # Slave channel for client channel N
|
N INT # Slave channel for client channel N
|
||||||
|
|
@ -325,6 +326,7 @@ pcm.NAME {
|
||||||
type dsnoop # Direct snoop (split one capture stream to more)
|
type dsnoop # Direct snoop (split one capture stream to more)
|
||||||
slave STR # Slave name (see pcm_slave)
|
slave STR # Slave name (see pcm_slave)
|
||||||
ipc_key INT # Unique ipc key
|
ipc_key INT # Unique ipc key
|
||||||
|
ipc_perm INT # ipc permissions (default 0600)
|
||||||
ipc_key_add_uid BOOL # Add current uid to ipc_key
|
ipc_key_add_uid BOOL # Add current uid to ipc_key
|
||||||
bindings { # Bindings table
|
bindings { # Bindings table
|
||||||
N INT # Slave channel for client channel N
|
N INT # Slave channel for client channel N
|
||||||
|
|
@ -333,6 +335,7 @@ pcm.NAME {
|
||||||
type dshare # Share channels from one stream
|
type dshare # Share channels from one stream
|
||||||
slave STR # Slave name (see pcm_slave)
|
slave STR # Slave name (see pcm_slave)
|
||||||
ipc_key INT # Unique ipc key
|
ipc_key INT # Unique ipc key
|
||||||
|
ipc_perm INT # ipc permissions (default 0600)
|
||||||
ipc_key_add_uid BOOL # Add current uid to ipc_key
|
ipc_key_add_uid BOOL # Add current uid to ipc_key
|
||||||
bindings { # Bindings table
|
bindings { # Bindings table
|
||||||
N INT # Slave channel for client channel N
|
N INT # Slave channel for client channel N
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@
|
||||||
#include <sys/sem.h>
|
#include <sys/sem.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include "pcm_direct.h"
|
#include "pcm_direct.h"
|
||||||
|
|
@ -157,7 +158,7 @@ static int get_tmp_name(char *filename, size_t size)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int make_local_socket(const char *filename, int server)
|
static int make_local_socket(const char *filename, int server, mode_t ipc_perm)
|
||||||
{
|
{
|
||||||
size_t l = strlen(filename);
|
size_t l = strlen(filename);
|
||||||
size_t size = offsetof(struct sockaddr_un, sun_path) + l;
|
size_t size = offsetof(struct sockaddr_un, sun_path) + l;
|
||||||
|
|
@ -181,6 +182,12 @@ static int make_local_socket(const char *filename, int server)
|
||||||
int result = -errno;
|
int result = -errno;
|
||||||
SYSERR("bind failed");
|
SYSERR("bind failed");
|
||||||
return result;
|
return result;
|
||||||
|
} else {
|
||||||
|
if (chmod(filename, ipc_perm) < 0) {
|
||||||
|
int result = -errno;
|
||||||
|
SYSERR("chmod failed");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (connect(sock, (struct sockaddr *) addr, size) < 0) {
|
if (connect(sock, (struct sockaddr *) addr, size) < 0) {
|
||||||
|
|
@ -297,7 +304,7 @@ int snd_pcm_direct_server_create(snd_pcm_direct_t *dmix)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = make_local_socket(dmix->shmptr->socket_name, 1);
|
ret = make_local_socket(dmix->shmptr->socket_name, 1, dmix->ipc_perm);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
dmix->server_fd = ret;
|
dmix->server_fd = ret;
|
||||||
|
|
@ -349,7 +356,7 @@ int snd_pcm_direct_client_connect(snd_pcm_direct_t *dmix)
|
||||||
int ret;
|
int ret;
|
||||||
unsigned char buf;
|
unsigned char buf;
|
||||||
|
|
||||||
ret = make_local_socket(dmix->shmptr->socket_name, 0);
|
ret = make_local_socket(dmix->shmptr->socket_name, 0, dmix->ipc_perm);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
dmix->comm_fd = ret;
|
dmix->comm_fd = ret;
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ typedef struct snd_pcm_direct snd_pcm_direct_t;
|
||||||
struct snd_pcm_direct {
|
struct snd_pcm_direct {
|
||||||
snd_pcm_type_t type; /* type (dmix, dsnoop, dshare) */
|
snd_pcm_type_t type; /* type (dmix, dsnoop, dshare) */
|
||||||
key_t ipc_key; /* IPC key for semaphore and memory */
|
key_t ipc_key; /* IPC key for semaphore and memory */
|
||||||
|
mode_t ipc_perm; /* IPC socket permissions */
|
||||||
int semid; /* IPC global semaphore identification */
|
int semid; /* IPC global semaphore identification */
|
||||||
int shmid; /* IPC global shared memory identification */
|
int shmid; /* IPC global shared memory identification */
|
||||||
snd_pcm_direct_share_t *shmptr; /* pointer to shared memory area */
|
snd_pcm_direct_share_t *shmptr; /* pointer to shared memory area */
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/shm.h>
|
#include <sys/shm.h>
|
||||||
|
|
@ -732,6 +733,7 @@ static snd_pcm_fast_ops_t snd_pcm_dmix_fast_ops = {
|
||||||
* \param pcmp Returns created PCM handle
|
* \param pcmp Returns created PCM handle
|
||||||
* \param name Name of PCM
|
* \param name Name of PCM
|
||||||
* \param ipc_key IPC key for semaphore and shared memory
|
* \param ipc_key IPC key for semaphore and shared memory
|
||||||
|
* \param ipc_perm IPC permissions for semaphore and shared memory
|
||||||
* \param params Parameters for slave
|
* \param params Parameters for slave
|
||||||
* \param root Configuration root
|
* \param root Configuration root
|
||||||
* \param sconf Slave configuration
|
* \param sconf Slave configuration
|
||||||
|
|
@ -743,7 +745,8 @@ static snd_pcm_fast_ops_t snd_pcm_dmix_fast_ops = {
|
||||||
* changed in future.
|
* changed in future.
|
||||||
*/
|
*/
|
||||||
int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
||||||
key_t ipc_key, struct slave_params *params,
|
key_t ipc_key, mode_t ipc_perm,
|
||||||
|
struct slave_params *params,
|
||||||
snd_config_t *bindings,
|
snd_config_t *bindings,
|
||||||
snd_config_t *root, snd_config_t *sconf,
|
snd_config_t *root, snd_config_t *sconf,
|
||||||
snd_pcm_stream_t stream, int mode)
|
snd_pcm_stream_t stream, int mode)
|
||||||
|
|
@ -771,6 +774,7 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
||||||
goto _err;
|
goto _err;
|
||||||
|
|
||||||
dmix->ipc_key = ipc_key;
|
dmix->ipc_key = ipc_key;
|
||||||
|
dmix->ipc_perm = ipc_perm;
|
||||||
dmix->semid = -1;
|
dmix->semid = -1;
|
||||||
dmix->shmid = -1;
|
dmix->shmid = -1;
|
||||||
|
|
||||||
|
|
@ -1056,6 +1060,7 @@ int _snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
||||||
struct slave_params params;
|
struct slave_params params;
|
||||||
int bsize, psize, ipc_key_add_uid = 0;
|
int bsize, psize, ipc_key_add_uid = 0;
|
||||||
key_t ipc_key = 0;
|
key_t ipc_key = 0;
|
||||||
|
mode_t ipc_perm = 0600;
|
||||||
int err;
|
int err;
|
||||||
snd_config_for_each(i, next, conf) {
|
snd_config_for_each(i, next, conf) {
|
||||||
snd_config_t *n = snd_config_iterator_entry(i);
|
snd_config_t *n = snd_config_iterator_entry(i);
|
||||||
|
|
@ -1074,6 +1079,21 @@ int _snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
||||||
ipc_key = key;
|
ipc_key = key;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (strcmp(id, "ipc_perm") == 0) {
|
||||||
|
char *perm;
|
||||||
|
char *endp;
|
||||||
|
err = snd_config_get_ascii(n, &perm);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("The field ipc_perm must be a valid file permission");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
if (isdigit(*perm) == 0) {
|
||||||
|
SNDERR("The field ipc_perm must be a valid file permission");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
ipc_perm = strtol(perm, &endp, 8);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (strcmp(id, "ipc_key_add_uid") == 0) {
|
if (strcmp(id, "ipc_key_add_uid") == 0) {
|
||||||
char *tmp;
|
char *tmp;
|
||||||
err = snd_config_get_ascii(n, &tmp);
|
err = snd_config_get_ascii(n, &tmp);
|
||||||
|
|
@ -1135,7 +1155,7 @@ int _snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
||||||
params.period_size = psize;
|
params.period_size = psize;
|
||||||
params.buffer_size = bsize;
|
params.buffer_size = bsize;
|
||||||
|
|
||||||
err = snd_pcm_dmix_open(pcmp, name, ipc_key, ¶ms, bindings, root, sconf, stream, mode);
|
err = snd_pcm_dmix_open(pcmp, name, ipc_key, ipc_perm, ¶ms, bindings, root, sconf, stream, mode);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
snd_config_delete(sconf);
|
snd_config_delete(sconf);
|
||||||
return err;
|
return err;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/shm.h>
|
#include <sys/shm.h>
|
||||||
|
|
@ -482,6 +483,7 @@ static snd_pcm_fast_ops_t snd_pcm_dshare_fast_ops = {
|
||||||
* \param pcmp Returns created PCM handle
|
* \param pcmp Returns created PCM handle
|
||||||
* \param name Name of PCM
|
* \param name Name of PCM
|
||||||
* \param ipc_key IPC key for semaphore and shared memory
|
* \param ipc_key IPC key for semaphore and shared memory
|
||||||
|
* \param ipc_mode IPC permissions for semaphore and shared memory
|
||||||
* \param params Parameters for slave
|
* \param params Parameters for slave
|
||||||
* \param root Configuration root
|
* \param root Configuration root
|
||||||
* \param sconf Slave configuration
|
* \param sconf Slave configuration
|
||||||
|
|
@ -493,7 +495,8 @@ static snd_pcm_fast_ops_t snd_pcm_dshare_fast_ops = {
|
||||||
* changed in future.
|
* changed in future.
|
||||||
*/
|
*/
|
||||||
int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
|
int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
|
||||||
key_t ipc_key, struct slave_params *params,
|
key_t ipc_key, mode_t ipc_perm,
|
||||||
|
struct slave_params *params,
|
||||||
snd_config_t *bindings,
|
snd_config_t *bindings,
|
||||||
snd_config_t *root, snd_config_t *sconf,
|
snd_config_t *root, snd_config_t *sconf,
|
||||||
snd_pcm_stream_t stream, int mode)
|
snd_pcm_stream_t stream, int mode)
|
||||||
|
|
@ -528,6 +531,7 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
|
||||||
}
|
}
|
||||||
|
|
||||||
dshare->ipc_key = ipc_key;
|
dshare->ipc_key = ipc_key;
|
||||||
|
dshare->ipc_perm = ipc_perm;
|
||||||
dshare->semid = -1;
|
dshare->semid = -1;
|
||||||
dshare->shmid = -1;
|
dshare->shmid = -1;
|
||||||
|
|
||||||
|
|
@ -745,6 +749,8 @@ int _snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
|
||||||
struct slave_params params;
|
struct slave_params params;
|
||||||
int bsize, psize, ipc_key_add_uid = 0;
|
int bsize, psize, ipc_key_add_uid = 0;
|
||||||
key_t ipc_key = 0;
|
key_t ipc_key = 0;
|
||||||
|
mode_t ipc_perm = 0600;
|
||||||
|
|
||||||
int err;
|
int err;
|
||||||
snd_config_for_each(i, next, conf) {
|
snd_config_for_each(i, next, conf) {
|
||||||
snd_config_t *n = snd_config_iterator_entry(i);
|
snd_config_t *n = snd_config_iterator_entry(i);
|
||||||
|
|
@ -763,6 +769,21 @@ int _snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
|
||||||
ipc_key = key;
|
ipc_key = key;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (strcmp(id, "ipc_perm") == 0) {
|
||||||
|
char *perm;
|
||||||
|
char *endp;
|
||||||
|
err = snd_config_get_ascii(n, &perm);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("The field ipc_perm must be a valid file permission");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
if (isdigit(*perm) == 0) {
|
||||||
|
SNDERR("The field ipc_perm must be a valid file permission");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
ipc_perm = strtol(perm, &endp, 8);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (strcmp(id, "ipc_key_add_uid") == 0) {
|
if (strcmp(id, "ipc_key_add_uid") == 0) {
|
||||||
char *tmp;
|
char *tmp;
|
||||||
err = snd_config_get_ascii(n, &tmp);
|
err = snd_config_get_ascii(n, &tmp);
|
||||||
|
|
@ -822,7 +843,7 @@ int _snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
|
||||||
|
|
||||||
params.period_size = psize;
|
params.period_size = psize;
|
||||||
params.buffer_size = bsize;
|
params.buffer_size = bsize;
|
||||||
err = snd_pcm_dshare_open(pcmp, name, ipc_key, ¶ms, bindings, root, sconf, stream, mode);
|
err = snd_pcm_dshare_open(pcmp, name, ipc_key, ipc_perm, ¶ms, bindings, root, sconf, stream, mode);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
snd_config_delete(sconf);
|
snd_config_delete(sconf);
|
||||||
return err;
|
return err;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/shm.h>
|
#include <sys/shm.h>
|
||||||
|
|
@ -450,6 +451,7 @@ static snd_pcm_fast_ops_t snd_pcm_dsnoop_fast_ops = {
|
||||||
* \param pcmp Returns created PCM handle
|
* \param pcmp Returns created PCM handle
|
||||||
* \param name Name of PCM
|
* \param name Name of PCM
|
||||||
* \param ipc_key IPC key for semaphore and shared memory
|
* \param ipc_key IPC key for semaphore and shared memory
|
||||||
|
* \param ipc_perm IPC permissions for semaphore and shared memory
|
||||||
* \param params Parameters for slave
|
* \param params Parameters for slave
|
||||||
* \param root Configuration root
|
* \param root Configuration root
|
||||||
* \param sconf Slave configuration
|
* \param sconf Slave configuration
|
||||||
|
|
@ -461,7 +463,8 @@ static snd_pcm_fast_ops_t snd_pcm_dsnoop_fast_ops = {
|
||||||
* changed in future.
|
* changed in future.
|
||||||
*/
|
*/
|
||||||
int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
|
int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
|
||||||
key_t ipc_key, struct slave_params *params,
|
key_t ipc_key, mode_t ipc_perm,
|
||||||
|
struct slave_params *params,
|
||||||
snd_config_t *bindings,
|
snd_config_t *bindings,
|
||||||
snd_config_t *root, snd_config_t *sconf,
|
snd_config_t *root, snd_config_t *sconf,
|
||||||
snd_pcm_stream_t stream, int mode)
|
snd_pcm_stream_t stream, int mode)
|
||||||
|
|
@ -488,6 +491,7 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
|
||||||
goto _err;
|
goto _err;
|
||||||
|
|
||||||
dsnoop->ipc_key = ipc_key;
|
dsnoop->ipc_key = ipc_key;
|
||||||
|
dsnoop->ipc_perm = ipc_perm;
|
||||||
dsnoop->semid = -1;
|
dsnoop->semid = -1;
|
||||||
dsnoop->shmid = -1;
|
dsnoop->shmid = -1;
|
||||||
|
|
||||||
|
|
@ -695,7 +699,9 @@ int _snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
|
||||||
struct slave_params params;
|
struct slave_params params;
|
||||||
int bsize, psize, ipc_key_add_uid = 0;
|
int bsize, psize, ipc_key_add_uid = 0;
|
||||||
key_t ipc_key = 0;
|
key_t ipc_key = 0;
|
||||||
|
mode_t ipc_perm = 0600;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
snd_config_for_each(i, next, conf) {
|
snd_config_for_each(i, next, conf) {
|
||||||
snd_config_t *n = snd_config_iterator_entry(i);
|
snd_config_t *n = snd_config_iterator_entry(i);
|
||||||
const char *id;
|
const char *id;
|
||||||
|
|
@ -713,6 +719,21 @@ int _snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
|
||||||
ipc_key = key;
|
ipc_key = key;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (strcmp(id, "ipc_perm") == 0) {
|
||||||
|
char *perm;
|
||||||
|
char *endp;
|
||||||
|
err = snd_config_get_ascii(n, &perm);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("The field ipc_perm must be a valid file permission");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
if (isdigit(*perm) == 0) {
|
||||||
|
SNDERR("The field ipc_perm must be a valid file permission");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
ipc_perm = strtol(perm, &endp, 8);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (strcmp(id, "ipc_key_add_uid") == 0) {
|
if (strcmp(id, "ipc_key_add_uid") == 0) {
|
||||||
char *tmp;
|
char *tmp;
|
||||||
err = snd_config_get_ascii(n, &tmp);
|
err = snd_config_get_ascii(n, &tmp);
|
||||||
|
|
@ -780,7 +801,7 @@ int _snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
|
||||||
|
|
||||||
params.period_size = psize;
|
params.period_size = psize;
|
||||||
params.buffer_size = bsize;
|
params.buffer_size = bsize;
|
||||||
err = snd_pcm_dsnoop_open(pcmp, name, ipc_key, ¶ms, bindings, root, sconf, stream, mode);
|
err = snd_pcm_dsnoop_open(pcmp, name, ipc_key, ipc_perm, ¶ms, bindings, root, sconf, stream, mode);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
snd_config_delete(sconf);
|
snd_config_delete(sconf);
|
||||||
return err;
|
return err;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue