From 4d302775d88adec8c316e0265ce7e804fa16331b Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sun, 15 Nov 2020 11:54:07 +0900 Subject: [PATCH] seq: user_client: report error for port access permission Port in ALSA sequencer has capability and client has access permission to operate the port. When unpermitted, the operation fails and return EPERM error code. This commit handles the code for local error. Signed-off-by: Takashi Sakamoto --- src/seq/alsaseq-enum-types.h | 4 +++- src/seq/user-client.c | 15 +++++++++++++-- tests/alsaseq-enums | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/seq/alsaseq-enum-types.h b/src/seq/alsaseq-enum-types.h index 975b0ea..b741e81 100644 --- a/src/seq/alsaseq-enum-types.h +++ b/src/seq/alsaseq-enum-types.h @@ -364,12 +364,14 @@ typedef enum /*< flags >*/ /** * ALSASeqUserClientError: - * @ALSASEQ_USER_CLIENT_ERROR_FAILED: The system call failed. + * @ALSASEQ_USER_CLIENT_ERROR_FAILED: The system call failed. + * @ALSASEQ_USER_CLIENT_ERROR_PORT_PERMISSION: The operation fails due to access permission of port. * * 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, } ALSASeqUserClientError; #endif diff --git a/src/seq/user-client.c b/src/seq/user-client.c index 5c63920..2f1b3dd 100644 --- a/src/seq/user-client.c +++ b/src/seq/user-client.c @@ -43,6 +43,13 @@ G_DEFINE_TYPE_WITH_PRIVATE(ALSASeqUserClient, alsaseq_user_client, G_TYPE_OBJECT */ 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", +}; + +#define generate_local_error(exception, code) \ + g_set_error_literal(exception, ALSASEQ_USER_CLIENT_ERROR, code, err_msgs[code]) + #define generate_syscall_error(exception, errno, fmt, arg) \ g_set_error(exception, ALSASEQ_USER_CLIENT_ERROR, ALSASEQ_USER_CLIENT_ERROR_FAILED, \ fmt" %d(%s)", arg, errno, strerror(errno)) @@ -680,8 +687,12 @@ void alsaseq_user_client_operate_subscription(ALSASeqUserClient *self, label = "UNSUBSCRIBE_PORT"; } - if (ioctl(priv->fd, request, data) < 0) - generate_syscall_error(error, errno, "ioctl(%s)", label); + if (ioctl(priv->fd, request, data) < 0) { + if (errno == EPERM) + generate_local_error(error, ALSASEQ_USER_CLIENT_ERROR_PORT_PERMISSION); + else + generate_syscall_error(error, errno, "ioctl(%s)", label); + } } /** diff --git a/tests/alsaseq-enums b/tests/alsaseq-enums index 0375e26..602ea8c 100644 --- a/tests/alsaseq-enums +++ b/tests/alsaseq-enums @@ -166,6 +166,7 @@ remove_filter_flags = ( user_client_error_types = ( 'FAILED', + 'PORT_PERMISSION', ) types = { -- 2.47.3