#include <utils.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
#include <sys/ioctl.h>
-#include <unistd.h>
/**
* SECTION: query
generate_file_error(error, -err, "Fail to generate hwdep devname");
}
-static void hwdep_perform_ctl_ioctl(guint card_id, long request, void *data,
- const char *req_label, GError **error)
-{
- char *devname;
- int fd;
- int err;
-
- g_return_if_fail(error == NULL || *error == NULL);
-
- err = lookup_and_allocate_control_devname(&devname, card_id);
- if (err < 0) {
- generate_file_error(error, -err, "Fail to generate control devname");
- return;
- }
-
- fd = open(devname, O_RDONLY | O_NONBLOCK);
- if (fd < 0) {
- generate_file_error_fmt(error, errno, "open(%s)", devname);
- goto end;
- }
-
- if (ioctl(fd, request, data) < 0)
- generate_file_error_fmt(error, errno, "ioctl(%s)", req_label);
-
- close(fd);
-end:
- free(devname);
-}
-
/**
* alsahwdep_get_device_info:
* @card_id: The numberical value for sound card to query.
GError **error)
{
struct snd_hwdep_info *info;
+ int err;
g_return_if_fail(device_info != NULL);
g_return_if_fail(error == NULL || *error == NULL);
info->device = device_id;
info->card = card_id;
- hwdep_perform_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_HWDEP_INFO, info, "HWDEP_INFO", error);
- if (*error != NULL)
+ err = request_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_HWDEP_INFO, info);
+ if (err < 0) {
+ generate_file_error(error, -err, "ioctl(HWDEP_INFO)");
g_object_unref(*device_info);
+ }
}
#include <utils.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
#include <sys/ioctl.h>
-#include <unistd.h>
/**
* SECTION: query
generate_file_error(error, -err, "Fail to generate rawmidi devname");
}
-static void rawmidi_perform_ctl_ioctl(guint card_id, long request, void *data,
- const char *req_label, int *ctl_fd, GError **error)
-{
- char *devname;
- int fd;
- int err;
-
- err = lookup_and_allocate_control_devname(&devname, card_id);
- if (err < 0) {
- generate_file_error(error, -err, "Fail to generate control devname");
- return;
- }
-
- fd = open(devname, O_RDONLY);
- if (fd < 0) {
- generate_file_error_fmt(error, errno, "open(%s)", devname);
- goto end;
- }
-
- if (ioctl(fd, request, data) < 0)
- generate_file_error_fmt(error, errno, "ioctl(%s)", req_label);
-
- // The caller is responsible for closing the file descriptor.
- if (ctl_fd != NULL)
- *ctl_fd = fd;
- else
- close(fd);
-end:
- free(devname);
-}
-
/**
* alsarawmidi_get_subdevice_id_list:
* @card_id: The numberical value for sound card to query.
.subdevice = 0,
};
int i;
+ int err;
g_return_if_fail(entries != NULL);
g_return_if_fail(entry_count != NULL);
g_return_if_fail(error == NULL || *error == NULL);
- rawmidi_perform_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_RAWMIDI_INFO, &info, "RAWMIDI_INFO", NULL, error);
- if (*error != NULL)
+ err = request_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_RAWMIDI_INFO, &info);
+ if (err < 0) {
+ generate_file_error(error, -err, "RAWMIDI_INFO");
return;
+ }
*entries = g_malloc0_n(info.subdevices_count, sizeof(guint));
GError **error)
{
struct snd_rawmidi_info *info;
+ int err;
g_return_if_fail(substream_info != NULL);
g_return_if_fail(error == NULL || *error == NULL);
info->stream = direction;
info->card = card_id;
- rawmidi_perform_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_RAWMIDI_INFO, info, "RAWMIDI_INFO", NULL, error);
- if (*error != NULL)
+ err = request_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_RAWMIDI_INFO, info);
+ if (err < 0) {
g_object_unref(*substream_info);
+ generate_file_error(error, -err, "RAWMIDI_INFO");
+ }
}
void rawmidi_select_subdevice(guint card_id, guint subdevice_id, int *ctl_fd, GError **error)
{
guint data = subdevice_id;
- rawmidi_perform_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE,
- &data, "RAWMIDI_PREFER_SUBDEVICE", ctl_fd, error);
+ int err;
+
+ err = request_ctl_ioctl_opened(ctl_fd, card_id, SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE, &data);
+ if (err < 0)
+ generate_file_error(error, -err, "RAWMIDI_PREFER_SUBDEVICE");
}
--- /dev/null
+// SPDX-License-Identifier: LGPL-3.0-or-later
+#include "utils.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+int request_ctl_ioctl_opened(int *fd, unsigned int card_id, long request, void *data)
+{
+ char *devname;
+ int err;
+
+ if (fd == NULL)
+ return -EINVAL;
+
+ err = lookup_and_allocate_control_devname(&devname, card_id);
+ if (err < 0)
+ return err;
+
+ *fd = open(devname, O_RDONLY | O_NONBLOCK);
+ free(devname);
+ if (*fd < 0)
+ return -errno;
+
+ if (ioctl(*fd, request, data) < 0)
+ return -errno;
+
+ return 0;
+}
+
+int request_ctl_ioctl(unsigned int card_id, long request, void *data)
+{
+ int fd;
+ int err;
+
+ err = request_ctl_ioctl_opened(&fd, card_id, request, data);
+ close(fd);
+
+ return err;
+}
int generate_sysnum_list_by_sysname_prefix(unsigned int **entries, unsigned long *entry_count,
const char *prefix);
+int request_ctl_ioctl_opened(int *fd, unsigned int card_id, long request, void *data);
+int request_ctl_ioctl(unsigned int card_id, long request, void *data);
+
static inline int lookup_and_allocate_name_by_sysname(char **name,
const char *(*func)(struct udev_device *),
const char *fmt, va_list ap)