*/
struct _ALSASeqUserClientPrivate {
int fd;
+ const char *devnode;
int client_id;
guint16 proto_ver_triplet[3];
};
g_set_error(exception, ALSASEQ_USER_CLIENT_ERROR, ALSASEQ_USER_CLIENT_ERROR_FAILED, \
fmt" %d(%s)", arg, errno, strerror(errno))
+#define generate_file_error(exception, code, fmt, arg) \
+ g_set_error(exception, G_FILE_ERROR, code, fmt, arg)
+
typedef struct {
GSource src;
ALSASeqUserClient *self;
if (priv->fd >= 0)
close(priv->fd);
+ g_free((gpointer)priv->devnode);
G_OBJECT_CLASS(alsaseq_user_client_parent_class)->finalize(obj);
}
open_flag |= O_RDWR;
priv->fd = open(devnode, open_flag);
- g_free(devnode);
if (priv->fd < 0) {
- generate_error(error, errno);
+ GFileError code = g_file_error_from_errno(errno);
+
+ if (code != G_FILE_ERROR_FAILED)
+ generate_file_error(error, errno, "open(%s)", devnode);
+ else
+ generate_syscall_error(error, errno, "open(%s)", devnode);
+
+ g_free(devnode);
return;
}
+ priv->devnode = devnode;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_CLIENT_ID, &priv->client_id) < 0) {
generate_syscall_error(error, errno, "ioctl(%s)", "CLIENT_ID");
g_return_if_fail(buf != NULL && length > 0);
len = write(priv->fd, buf, length);
- if (len < 0)
- generate_error(error, errno);
+ if (len < 0) {
+ GFileError code = g_file_error_from_errno(errno);
+
+ if (code != G_FILE_ERROR_FAILED)
+ generate_file_error(error, errno, "open(%s)", priv->devnode);
+ else
+ generate_syscall_error(error, errno, "open(%s)", priv->devnode);
+ }
}
static gboolean seq_user_client_check_src(GSource *gsrc)