1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
2 *
3 * Copyright (C) 2020 Tomas Bzatek <tbzatek@redhat.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 *
19 */
20
21 #include "config.h"
22
23 #include <blockdev/blockdev.h>
24
25 #include <src/udisksdaemon.h>
26 #include <src/udiskslogging.h>
27 #include <src/udiskslinuxdevice.h>
28 #include <src/udisksmodulemanager.h>
29 #include <src/udisksmodule.h>
30 #include <src/udisksmoduleobject.h>
31 #include <src/udiskslinuxblockobject.h>
32
33 #include "udiskslinuxmodulezram.h"
34 #include "udiskslinuxmanagerzram.h"
35 #include "udiskslinuxblockzram.h"
36
37 /**
38 * SECTION:udiskslinuxmodulezram
39 * @title: UDisksLinuxModuleZRAM
40 * @short_description: ZRAM module.
41 *
42 * The ZRAM module.
43 */
44
45 /**
46 * UDisksLinuxModuleZRAM:
47 *
48 * The #UDisksLinuxModuleZRAM structure contains only private data
49 * and should only be accessed using the provided API.
50 */
51 struct _UDisksLinuxModuleZRAM {
52 UDisksModule parent_instance;
53
54 };
55
56 typedef struct _UDisksLinuxModuleZRAMClass UDisksLinuxModuleZRAMClass;
57
58 struct _UDisksLinuxModuleZRAMClass {
59 UDisksModuleClass parent_class;
60 };
61
62 static void initable_iface_init (GInitableIface *initable_iface);
63
64 G_DEFINE_TYPE_WITH_CODE (UDisksLinuxModuleZRAM, udisks_linux_module_zram, UDISKS_TYPE_MODULE,
65 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init));
66
67
68 static void
udisks_linux_module_zram_init(UDisksLinuxModuleZRAM * module)69 udisks_linux_module_zram_init (UDisksLinuxModuleZRAM *module)
70 {
71 }
72
73 static void
udisks_linux_module_zram_constructed(GObject * object)74 udisks_linux_module_zram_constructed (GObject *object)
75 {
76 if (G_OBJECT_CLASS (udisks_linux_module_zram_parent_class)->constructed)
77 G_OBJECT_CLASS (udisks_linux_module_zram_parent_class)->constructed (object);
78 }
79
80 static void
udisks_linux_module_zram_finalize(GObject * object)81 udisks_linux_module_zram_finalize (GObject *object)
82 {
83 if (G_OBJECT_CLASS (udisks_linux_module_zram_parent_class)->finalize)
84 G_OBJECT_CLASS (udisks_linux_module_zram_parent_class)->finalize (object);
85 }
86
87 gchar *
udisks_module_id(void)88 udisks_module_id (void)
89 {
90 return g_strdup (ZRAM_MODULE_NAME);
91 }
92
93 /**
94 * udisks_module_zram_new:
95 * @daemon: A #UDisksDaemon.
96 * @cancellable: (nullable): A #GCancellable or %NULL
97 * @error: Return location for error or %NULL.
98 *
99 * Creates new #UDisksLinuxModuleZRAM object.
100 *
101 * Returns: (transfer full) (type UDisksLinuxModuleZRAM): A
102 * #UDisksLinuxModuleZRAM object or %NULL if @error is set. Free
103 * with g_object_unref().
104 */
105 UDisksModule *
udisks_module_zram_new(UDisksDaemon * daemon,GCancellable * cancellable,GError ** error)106 udisks_module_zram_new (UDisksDaemon *daemon,
107 GCancellable *cancellable,
108 GError **error)
109 {
110 GInitable *initable;
111
112 g_return_val_if_fail (UDISKS_IS_DAEMON (daemon), NULL);
113 g_return_val_if_fail (error == NULL || *error == NULL, NULL);
114
115 initable = g_initable_new (UDISKS_TYPE_LINUX_MODULE_ZRAM,
116 cancellable,
117 error,
118 "daemon", daemon,
119 "name", ZRAM_MODULE_NAME,
120 NULL);
121
122 if (initable == NULL)
123 return NULL;
124 else
125 return UDISKS_MODULE (initable);
126 }
127
128 /* ---------------------------------------------------------------------------------------------------- */
129
130 static gboolean
initable_init(GInitable * initable,GCancellable * cancellable,GError ** error)131 initable_init (GInitable *initable,
132 GCancellable *cancellable,
133 GError **error)
134 {
135 /* NULL means no specific so_name (implementation) */
136 BDPluginSpec kbd_plugin = { BD_PLUGIN_KBD, NULL };
137 BDPluginSpec swap_plugin = { BD_PLUGIN_SWAP, NULL };
138 BDPluginSpec *plugins[] = { &kbd_plugin, &swap_plugin, NULL };
139
140 if (! bd_is_plugin_available (BD_PLUGIN_KBD) || ! bd_is_plugin_available (BD_PLUGIN_SWAP))
141 {
142 if (! bd_reinit (plugins, FALSE, NULL, error))
143 return FALSE;
144 }
145
146 return TRUE;
147 }
148
149 static void
initable_iface_init(GInitableIface * initable_iface)150 initable_iface_init (GInitableIface *initable_iface)
151 {
152 initable_iface->init = initable_init;
153 }
154
155 /* ---------------------------------------------------------------------------------------------------- */
156
157 static GDBusInterfaceSkeleton *
udisks_linux_module_zram_new_manager(UDisksModule * module)158 udisks_linux_module_zram_new_manager (UDisksModule *module)
159 {
160 UDisksLinuxManagerZRAM *manager;
161
162 g_return_val_if_fail (UDISKS_IS_LINUX_MODULE_ZRAM (module), NULL);
163
164 manager = udisks_linux_manager_zram_new (UDISKS_LINUX_MODULE_ZRAM (module));
165
166 return G_DBUS_INTERFACE_SKELETON (manager);
167 }
168
169 /* ---------------------------------------------------------------------------------------------------- */
170
171 static GType *
udisks_linux_module_zram_get_block_object_interface_types(UDisksModule * module)172 udisks_linux_module_zram_get_block_object_interface_types (UDisksModule *module)
173 {
174 static GType block_object_interface_types[2];
175
176 g_return_val_if_fail (UDISKS_IS_LINUX_MODULE_ZRAM (module), NULL);
177
178 if (g_once_init_enter (&block_object_interface_types[0]))
179 g_once_init_leave (&block_object_interface_types[0], UDISKS_TYPE_LINUX_BLOCK_ZRAM);
180
181 return block_object_interface_types;
182 }
183
184 static GDBusInterfaceSkeleton *
udisks_linux_module_zram_new_block_object_interface(UDisksModule * module,UDisksLinuxBlockObject * object,GType interface_type)185 udisks_linux_module_zram_new_block_object_interface (UDisksModule *module,
186 UDisksLinuxBlockObject *object,
187 GType interface_type)
188 {
189 GDBusInterfaceSkeleton *interface = NULL;
190 UDisksLinuxDevice *device;
191
192 g_return_val_if_fail (UDISKS_IS_LINUX_MODULE_ZRAM (module), NULL);
193
194 if (interface_type == UDISKS_TYPE_LINUX_BLOCK_ZRAM)
195 {
196 /* Check device name */
197 device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (object));
198 if (g_str_has_prefix (g_udev_device_get_device_file (device->udev_device), "/dev/zram"))
199 {
200 interface = G_DBUS_INTERFACE_SKELETON (udisks_linux_block_zram_new (UDISKS_LINUX_MODULE_ZRAM (module), object));
201 }
202 g_object_unref (device);
203 }
204 else
205 {
206 udisks_error ("Invalid interface type");
207 }
208
209 return interface;
210 }
211
212 /* ---------------------------------------------------------------------------------------------------- */
213
214 static void
udisks_linux_module_zram_class_init(UDisksLinuxModuleZRAMClass * klass)215 udisks_linux_module_zram_class_init (UDisksLinuxModuleZRAMClass *klass)
216 {
217 GObjectClass *gobject_class;
218 UDisksModuleClass *module_class;
219
220 gobject_class = G_OBJECT_CLASS (klass);
221 gobject_class->constructed = udisks_linux_module_zram_constructed;
222 gobject_class->finalize = udisks_linux_module_zram_finalize;
223
224 module_class = UDISKS_MODULE_CLASS (klass);
225 module_class->new_manager = udisks_linux_module_zram_new_manager;
226 module_class->get_block_object_interface_types = udisks_linux_module_zram_get_block_object_interface_types;
227 module_class->new_block_object_interface = udisks_linux_module_zram_new_block_object_interface;
228 }
229