Files
feedbackd/src/fbd-udev.c
T
Guido Günther a5b4f99412 feedbackd: Support visual feedback via LEDs
Currently all LED feedbacks are infinite we can improve that
later on by using the 'repeat' attribute of the LED pattern
trigger.
2020-07-05 19:25:44 +00:00

87 lines
2.1 KiB
C

/*
* Copyright (C) 2020 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*
*/
#define G_LOG_DOMAIN "fbd-udev"
#include "fbd-udev.h"
#include <gio/gio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
gboolean
fbd_udev_set_sysfs_path_attr_as_string (GUdevDevice *dev, const gchar *attr,
const gchar *s, GError **err)
{
gint fd;
int len;
g_autofree gchar *path = g_strjoin ("/", g_udev_device_get_sysfs_path (dev),
attr, NULL);
fd = open (path, O_WRONLY|O_TRUNC, 0666);
if (fd < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to open %s: %s",
path, strerror (errno));
return FALSE;
}
len = strlen (s);
if (write (fd, s, len) < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to write %s to %s: %s",
s, path, strerror (errno));
close (fd);
return FALSE;
}
if (close (fd) < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to close %s: %s",
path, strerror (errno));
return FALSE;
}
return TRUE;
}
gboolean
fbd_udev_set_sysfs_path_attr_as_int (GUdevDevice *dev, const gchar *attr,
gint val, GError **err)
{
gint fd;
int len;
g_autofree gchar *s = NULL;
g_autofree gchar *path = g_strjoin ("/", g_udev_device_get_sysfs_path (dev),
attr, NULL);
fd = open (path, O_WRONLY|O_TRUNC, 0666);
if (fd < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to open %s: %s",
path, strerror (errno));
return FALSE;
}
s = g_strdup_printf ("%d", val);
len = strlen (s);
if (write (fd, s, len) < len) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to write %s: %s",
path, strerror (errno));
close (fd);
return FALSE;
}
if (close (fd) < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to close %s: %s",
path, strerror (errno));
return FALSE;
}
return TRUE;
}