Update of /cvsroot/alsa/alsa-lib/src/pcm
In directory sc8-pr-cvs1:/tmp/cvs-serv3236/src/pcm

Modified Files:
        pcm_direct.c pcm_direct.h pcm_dmix.c pcm_dshare.c pcm_dsnoop.c 
Log Message:
Maik Broemme <[EMAIL PROTECTED]>
- added ipc_perm for dmix plugin
Jaroslav Kysela <[EMAIL PROTECTED]>
- added ipc_perm for dsnoop and dshare plugins
- added ipc_perm to doc/asoundrc.txt


Index: pcm_direct.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_direct.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- pcm_direct.c        17 Oct 2003 13:53:06 -0000      1.8
+++ pcm_direct.c        7 Dec 2003 09:30:47 -0000       1.9
@@ -39,6 +39,7 @@
 #include <sys/sem.h>
 #include <sys/wait.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
 #include <sys/un.h>
 #include <sys/mman.h>
 #include "pcm_direct.h"
@@ -157,7 +158,7 @@
        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 size = offsetof(struct sockaddr_un, sun_path) + l;
@@ -181,6 +182,12 @@
                        int result = -errno;
                        SYSERR("bind failed");
                        return result;
+               } else {
+                       if (chmod(filename, ipc_perm) < 0) {
+                               int result = -errno;
+                               SYSERR("chmod failed");
+                               return result;
+                       }
                }
        } else {
                if (connect(sock, (struct sockaddr *) addr, size) < 0) {
@@ -297,7 +304,7 @@
        if (ret < 0)
                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)
                return ret;
        dmix->server_fd = ret;
@@ -349,7 +356,7 @@
        int ret;
        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)
                return ret;
        dmix->comm_fd = ret;

Index: pcm_direct.h
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_direct.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- pcm_direct.h        17 Sep 2003 17:09:45 -0000      1.5
+++ pcm_direct.h        7 Dec 2003 09:30:47 -0000       1.6
@@ -79,6 +79,7 @@
 struct snd_pcm_direct {
        snd_pcm_type_t type;            /* type (dmix, dsnoop, dshare) */
        key_t ipc_key;                  /* IPC key for semaphore and memory */
+       mode_t ipc_perm;                /* IPC socket permissions */
        int semid;                      /* IPC global semaphore identification */
        int shmid;                      /* IPC global shared memory identification */
        snd_pcm_direct_share_t *shmptr; /* pointer to shared memory area */

Index: pcm_dmix.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dmix.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- pcm_dmix.c  23 Oct 2003 14:42:47 -0000      1.44
+++ pcm_dmix.c  7 Dec 2003 09:30:47 -0000       1.45
@@ -33,6 +33,7 @@
 #include <signal.h>
 #include <string.h>
 #include <fcntl.h>
+#include <ctype.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/shm.h>
@@ -732,6 +733,7 @@
  * \param pcmp Returns created PCM handle
  * \param name Name of PCM
  * \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 root Configuration root
  * \param sconf Slave configuration
@@ -743,7 +745,8 @@
  *          changed in future.
  */
 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 *root, snd_config_t *sconf,
                      snd_pcm_stream_t stream, int mode)
@@ -771,6 +774,7 @@
                goto _err;
        
        dmix->ipc_key = ipc_key;
+       dmix->ipc_perm = ipc_perm;
        dmix->semid = -1;
        dmix->shmid = -1;
 
@@ -1056,6 +1060,7 @@
        struct slave_params params;
        int bsize, psize, ipc_key_add_uid = 0;
        key_t ipc_key = 0;
+       mode_t ipc_perm = 0600;
        int err;
        snd_config_for_each(i, next, conf) {
                snd_config_t *n = snd_config_iterator_entry(i);
@@ -1074,6 +1079,21 @@
                        ipc_key = key;
                        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) {
                        char *tmp;
                        err = snd_config_get_ascii(n, &tmp);
@@ -1135,7 +1155,7 @@
        params.period_size = psize;
        params.buffer_size = bsize;
 
-       err = snd_pcm_dmix_open(pcmp, name, ipc_key, &params, bindings, root, sconf, 
stream, mode);
+       err = snd_pcm_dmix_open(pcmp, name, ipc_key, ipc_perm, &params, bindings, 
root, sconf, stream, mode);
        if (err < 0)
                snd_config_delete(sconf);
        return err;

Index: pcm_dshare.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dshare.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- pcm_dshare.c        23 Oct 2003 14:42:47 -0000      1.10
+++ pcm_dshare.c        7 Dec 2003 09:30:47 -0000       1.11
@@ -33,6 +33,7 @@
 #include <signal.h>
 #include <string.h>
 #include <fcntl.h>
+#include <ctype.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/shm.h>
@@ -482,6 +483,7 @@
  * \param pcmp Returns created PCM handle
  * \param name Name of PCM
  * \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 root Configuration root
  * \param sconf Slave configuration
@@ -493,10 +495,11 @@
  *          changed in future.
  */
 int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
-                     key_t ipc_key, struct slave_params *params,
-                     snd_config_t *bindings,
-                     snd_config_t *root, snd_config_t *sconf,
-                     snd_pcm_stream_t stream, int mode)
+                       key_t ipc_key, mode_t ipc_perm,
+                       struct slave_params *params,
+                       snd_config_t *bindings,
+                       snd_config_t *root, snd_config_t *sconf,
+                       snd_pcm_stream_t stream, int mode)
 {
        snd_pcm_t *pcm = NULL, *spcm = NULL;
        snd_pcm_direct_t *dshare = NULL;
@@ -528,6 +531,7 @@
        }
        
        dshare->ipc_key = ipc_key;
+       dshare->ipc_perm = ipc_perm;
        dshare->semid = -1;
        dshare->shmid = -1;
 
@@ -745,6 +749,8 @@
        struct slave_params params;
        int bsize, psize, ipc_key_add_uid = 0;
        key_t ipc_key = 0;
+       mode_t ipc_perm = 0600;
+       
        int err;
        snd_config_for_each(i, next, conf) {
                snd_config_t *n = snd_config_iterator_entry(i);
@@ -763,6 +769,21 @@
                        ipc_key = key;
                        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) {
                        char *tmp;
                        err = snd_config_get_ascii(n, &tmp);
@@ -822,7 +843,7 @@
 
        params.period_size = psize;
        params.buffer_size = bsize;
-       err = snd_pcm_dshare_open(pcmp, name, ipc_key, &params, bindings, root, sconf, 
stream, mode);
+       err = snd_pcm_dshare_open(pcmp, name, ipc_key, ipc_perm, &params, bindings, 
root, sconf, stream, mode);
        if (err < 0)
                snd_config_delete(sconf);
        return err;

Index: pcm_dsnoop.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dsnoop.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- pcm_dsnoop.c        23 Oct 2003 14:42:47 -0000      1.10
+++ pcm_dsnoop.c        7 Dec 2003 09:30:47 -0000       1.11
@@ -33,6 +33,7 @@
 #include <signal.h>
 #include <string.h>
 #include <fcntl.h>
+#include <ctype.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/shm.h>
@@ -450,6 +451,7 @@
  * \param pcmp Returns created PCM handle
  * \param name Name of PCM
  * \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 root Configuration root
  * \param sconf Slave configuration
@@ -461,10 +463,11 @@
  *          changed in future.
  */
 int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
-                     key_t ipc_key, struct slave_params *params,
-                     snd_config_t *bindings,
-                     snd_config_t *root, snd_config_t *sconf,
-                     snd_pcm_stream_t stream, int mode)
+                       key_t ipc_key, mode_t ipc_perm,
+                       struct slave_params *params,
+                       snd_config_t *bindings,
+                       snd_config_t *root, snd_config_t *sconf,
+                       snd_pcm_stream_t stream, int mode)
 {
        snd_pcm_t *pcm = NULL, *spcm = NULL;
        snd_pcm_direct_t *dsnoop = NULL;
@@ -488,6 +491,7 @@
                goto _err;
        
        dsnoop->ipc_key = ipc_key;
+       dsnoop->ipc_perm = ipc_perm;
        dsnoop->semid = -1;
        dsnoop->shmid = -1;
 
@@ -695,7 +699,9 @@
        struct slave_params params;
        int bsize, psize, ipc_key_add_uid = 0;
        key_t ipc_key = 0;
+       mode_t ipc_perm = 0600;
        int err;
+
        snd_config_for_each(i, next, conf) {
                snd_config_t *n = snd_config_iterator_entry(i);
                const char *id;
@@ -713,6 +719,21 @@
                        ipc_key = key;
                        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) {
                        char *tmp;
                        err = snd_config_get_ascii(n, &tmp);
@@ -780,7 +801,7 @@
 
        params.period_size = psize;
        params.buffer_size = bsize;
-       err = snd_pcm_dsnoop_open(pcmp, name, ipc_key, &params, bindings, root, sconf, 
stream, mode);
+       err = snd_pcm_dsnoop_open(pcmp, name, ipc_key, ipc_perm, &params, bindings, 
root, sconf, stream, mode);
        if (err < 0)
                snd_config_delete(sconf);
        return err;



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to