]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: user_client: report error for queue access permission
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 15 Nov 2020 02:54:07 +0000 (11:54 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 15 Nov 2020 02:54:07 +0000 (11:54 +0900)
Queue in ALSA sequencer has locking mechanism and client has access
permission to operate the queue. When unpermitted, the operation fails
and return EPERM error code.

This commit handles the code for local error.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/seq/alsaseq-enum-types.h
src/seq/user-client.c
tests/alsaseq-enums

index b741e81da68fcec3246753149c128b7f850e60c2..b7f3f911497c9743d50736d5d1fa69acf09166f1 100644 (file)
@@ -366,12 +366,14 @@ typedef enum /*< flags >*/
  * ALSASeqUserClientError:
  * @ALSASEQ_USER_CLIENT_ERROR_FAILED:              The system call failed.
  * @ALSASEQ_USER_CLIENT_ERROR_PORT_PERMISSION:      The operation fails due to access permission of port.
+ * @ALSASEQ_USER_CLIENT_ERROR_QUEUE_PERMISSION:     The operation fails due to access permission of queue.
  *
  * A set of error code for GError with domain which equals to #alsaseq_user_client_error_quark()
  */
 typedef enum {
     ALSASEQ_USER_CLIENT_ERROR_FAILED,
     ALSASEQ_USER_CLIENT_ERROR_PORT_PERMISSION,
+    ALSASEQ_USER_CLIENT_ERROR_QUEUE_PERMISSION,
 } ALSASeqUserClientError;
 
 #endif
index 2f1b3ddcf17a1221e7c8b3a25ea93116b704130e..e289f704e5e22c276ae424edb7f4d6014e7beced 100644 (file)
@@ -45,6 +45,7 @@ G_DEFINE_QUARK(alsaseq-user-client-error-quark, alsaseq_user_client_error)
 
 static const char *const err_msgs[] = {
         [ALSASEQ_USER_CLIENT_ERROR_PORT_PERMISSION] = "The operation fails due to access permission of port",
+        [ALSASEQ_USER_CLIENT_ERROR_QUEUE_PERMISSION] = "The operation fails due to access permission of queue",
 };
 
 #define generate_local_error(exception, code) \
@@ -780,8 +781,12 @@ void alsaseq_user_client_update_queue(ALSASeqUserClient *self,
 
     seq_queue_info_refer_private(queue_info, &info);
 
-    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_INFO, info) < 0)
-        generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_INFO");
+    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_INFO, info) < 0) {
+        if (errno == EPERM)
+            generate_local_error(error, ALSASEQ_USER_CLIENT_ERROR_QUEUE_PERMISSION);
+        else
+            generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_INFO");
+    }
 }
 
 /**
@@ -880,8 +885,12 @@ void alsaseq_user_client_set_queue_tempo(ALSASeqUserClient *self,
 
     seq_queue_tempo_refer_private(queue_tempo, &tempo);
     tempo->queue = queue_id;
-    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO, tempo) < 0)
-        generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_TEMPO");
+    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO, tempo) < 0) {
+        if (errno == EPERM)
+            generate_local_error(error, ALSASEQ_USER_CLIENT_ERROR_QUEUE_PERMISSION);
+        else
+            generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_TEMPO");
+    }
 }
 
 /**
@@ -959,8 +968,12 @@ void alsaseq_user_client_set_queue_timer(ALSASeqUserClient *self,
     }
 
     timer->queue = queue_id;
-    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, timer) < 0)
-        generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_TIMER");
+    if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, timer) < 0) {
+        if (errno == EPERM)
+            generate_local_error(error, ALSASEQ_USER_CLIENT_ERROR_QUEUE_PERMISSION);
+        else
+            generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_TIMER");
+    }
 }
 
 /**
index 602ea8cd601e1dfd9f4e0b9c20e09aede298ff09..88c0af0222311533dc26004640c1fc1f1d3e8962 100644 (file)
@@ -167,6 +167,7 @@ remove_filter_flags = (
 user_client_error_types = (
     'FAILED',
     'PORT_PERMISSION',
+    'QUEUE_PERMISSION',
 )
 
 types = {