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