#include <libudev.h>
-#define TIMER_SYSNAME_TEMPLATE "timer"
-#define SYSFS_SND_TIMER_NODE "/sys/module/snd_timer/"
-
/**
* SECTION: query
* @Title: Global functions in ALSATimer
// For error handling.
G_DEFINE_QUARK("alsatimer-error", alsatimer_error)
+#define TIMER_SYSNAME_TEMPLATE "timer"
+#define SYSFS_SND_TIMER_NODE "/sys/module/snd_timer/"
+
+#define generate_file_error(exception, errno, msg) \
+ g_set_error_literal(exception, G_FILE_ERROR, g_file_error_from_errno(errno), msg)
+
+#define generate_file_error_fmt(exception, errno, fmt, msg) \
+ g_set_error(exception, G_FILE_ERROR, g_file_error_from_errno(errno), fmt, msg)
+
static bool check_existence(char *sysname, GError **error)
{
struct udev *ctx;
ctx = udev_new();
if (ctx == NULL) {
- generate_error(error, errno);
+ generate_file_error(error, errno, "udev_new()");
return false;
}
dev = udev_device_new_from_subsystem_sysname(ctx, "sound", sysname);
if (dev == NULL) {
- generate_error(error, errno);
+ generate_file_error(error, errno, "udev_device_new_from_subsystem_sysname()");
result = false;
} else {
result = true;
ctx = udev_new();
if (ctx == NULL) {
- generate_error(error, errno);
+ generate_file_error(error, errno, "udev_new()");
return;
}
dev = udev_device_new_from_subsystem_sysname(ctx, "sound",
TIMER_SYSNAME_TEMPLATE);
if (dev == NULL) {
- generate_error(error, ENODEV);
+ generate_file_error(error, ENODEV, "udev_device_new_from_subsystem_sysname()");
udev_unref(ctx);
return;
}
if (node != NULL)
*devnode = g_strdup(node);
else
- generate_error(error, ENODEV);
+ generate_file_error(error, ENODEV, "udev_device_get_devnode()");
udev_device_unref(dev);
udev_unref(ctx);
return;
fd = open(devnode, O_RDONLY);
- g_free(devnode);
if (fd < 0) {
- generate_error(error, errno);
+ generate_file_error_fmt(error, errno, "open(%s)", devnode);
+ g_free(devnode);
return;
}
+ g_free(devnode);
while (true) {
ALSATimerDeviceId *entry;
- if (ioctl(fd, SNDRV_TIMER_IOCTL_NEXT_DEVICE, &id) < 0)
+ if (ioctl(fd, SNDRV_TIMER_IOCTL_NEXT_DEVICE, &id) < 0) {
+ generate_file_error(error, errno, "ioctl(SNDRV_TIMER_IOCTL_NEXT_DEVICE)");
break;
+ }
if (id.dev_class == SNDRV_TIMER_CLASS_NONE)
break;
return;
fd = open(devnode, O_RDONLY);
- g_free(devnode);
if (fd < 0) {
- generate_error(error, errno);
+ generate_file_error_fmt(error, errno, "open(%s)", devnode);
return;
+ g_free(devnode);
}
+ g_free(devnode);
*device_info = g_object_new(ALSATIMER_TYPE_DEVICE_INFO, NULL);
timer_device_info_refer_private(*device_info, &info);
info->tid = *device_id;
if (ioctl(fd, SNDRV_TIMER_IOCTL_GINFO, info) < 0) {
- generate_error(error, errno);
+ generate_file_error(error, errno, "ioctl(SNDRV_TIMER_IOCTL_GINFO)");
g_object_unref(*device_info);
}
return;
fd = open(devnode, O_RDONLY);
- g_free(devnode);
if (fd < 0) {
- generate_error(error, errno);
+ generate_file_error_fmt(error, errno, "open(%s)", devnode);
+ g_free(devnode);
return;
}
+ g_free(devnode);
timer_device_status_refer_private(*device_status, &status);
status->tid = *device_id;
if (ioctl(fd, SNDRV_TIMER_IOCTL_GSTATUS, status) < 0) {
- generate_error(error, errno);
+ generate_file_error(error, errno, "ioctl(SNDRV_TIMER_IOCTL_GSTATUS)");
g_object_unref(*device_status);
}
return;
fd = open(devnode, O_RDONLY);
- g_free(devnode);
if (fd < 0) {
- generate_error(error, errno);
+ generate_file_error_fmt(error, errno, "open(%s)", devnode);
+ g_free(devnode);
return;
}
+ g_free(devnode);
timer_device_params_refer_private((ALSATimerDeviceParams *)device_params,
¶ms);
params->tid = *device_id;
if (ioctl(fd, SNDRV_TIMER_IOCTL_GPARAMS, params) < 0)
- generate_error(error, errno);
+ generate_file_error(error, errno, "ioctl(SNDRV_TIMER_IOCTL_GPARAMS)");
close(fd);
}
fd = open(literal, O_RDONLY);
if (fd < 0) {
- generate_error(error, errno);
+ generate_file_error_fmt(error, errno, "open(%s)", literal);
return;
}
len = read(fd, buf, size);
if (len < 0) {
- generate_error(error, errno);
+ generate_file_error(error, errno, "read()");
goto end;
}
v = strtol(buf, &term, 10);
if (errno > 0)
- generate_error(error, errno);
+ generate_file_error(error, errno, "strtol()");
else if (*term != '\n')
- generate_error(error, EIO);
+ generate_file_error(error, EIO, "strtol()");
else
*val = (int)v;
end:
*clock_id = CLOCK_MONOTONIC;
break;
default:
- generate_error(error, EPROTO);
+ generate_file_error(error, EPROTO, "timer_tstamp_monotonic");
break;
}
end: