1 /*
2 * Copyright (C) 2020 Purism SPC
3 * SPDX-License-Identifier: GPL-3.0+
4 * Author: Guido Günther <agx@sigxcpu.org>
5 *
6 */
7
8 #define G_LOG_DOMAIN "fbd-udev"
9
10 #include "fbd-udev.h"
11
12 #include <gio/gio.h>
13
14 #include <sys/types.h>
15 #include <sys/stat.h>
16 #include <errno.h>
17 #include <fcntl.h>
18
19 gboolean
fbd_udev_set_sysfs_path_attr_as_string(GUdevDevice * dev,const gchar * attr,const gchar * s,GError ** err)20 fbd_udev_set_sysfs_path_attr_as_string (GUdevDevice *dev, const gchar *attr,
21 const gchar *s, GError **err)
22 {
23 gint fd;
24 int len;
25 g_autofree gchar *path = g_strjoin ("/", g_udev_device_get_sysfs_path (dev),
26 attr, NULL);
27
28 fd = open (path, O_WRONLY|O_TRUNC, 0666);
29 if (fd < 0) {
30 g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to open %s: %s",
31 path, strerror (errno));
32 return FALSE;
33 }
34
35 len = strlen (s);
36 if (write (fd, s, len) < 0) {
37 g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to write %s to %s: %s",
38 s, path, strerror (errno));
39 close (fd);
40 return FALSE;
41 }
42
43 if (close (fd) < 0) {
44 g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to close %s: %s",
45 path, strerror (errno));
46 return FALSE;
47 }
48
49 return TRUE;
50 }
51
52 gboolean
fbd_udev_set_sysfs_path_attr_as_int(GUdevDevice * dev,const gchar * attr,gint val,GError ** err)53 fbd_udev_set_sysfs_path_attr_as_int (GUdevDevice *dev, const gchar *attr,
54 gint val, GError **err)
55 {
56 gint fd;
57 int len;
58 g_autofree gchar *s = NULL;
59
60 g_autofree gchar *path = g_strjoin ("/", g_udev_device_get_sysfs_path (dev),
61 attr, NULL);
62
63 fd = open (path, O_WRONLY|O_TRUNC, 0666);
64 if (fd < 0) {
65 g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to open %s: %s",
66 path, strerror (errno));
67 return FALSE;
68 }
69
70 s = g_strdup_printf ("%d", val);
71 len = strlen (s);
72 if (write (fd, s, len) < len) {
73 g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to write %s: %s",
74 path, strerror (errno));
75 close (fd);
76 return FALSE;
77 }
78
79 if (close (fd) < 0) {
80 g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to close %s: %s",
81 path, strerror (errno));
82 return FALSE;
83 }
84
85 return TRUE;
86 }
87