Index: udisks-2.1.5/src/udiskslinuxfilesystem.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxfilesystem.c +++ udisks-2.1.5/src/udiskslinuxfilesystem.c @@ -79,6 +79,8 @@ static void filesystem_iface_init (UDisk G_DEFINE_TYPE_WITH_CODE (UDisksLinuxFilesystem, udisks_linux_filesystem, UDISKS_TYPE_FILESYSTEM_SKELETON, G_IMPLEMENT_INTERFACE (UDISKS_TYPE_FILESYSTEM, filesystem_iface_init)); +#define MOUNT_CONF "udisks2-mount.conf" + #ifdef HAVE_FHS_MEDIA # define MOUNT_BASE "/media" #else @@ -283,7 +285,12 @@ typedef struct /* ---------------------- vfat -------------------- */ static const gchar *vfat_defaults[] = { "uid=", "gid=", "shortname=mixed", "utf8=1", "showexec", "flush", NULL }; -static const gchar *vfat_allow[] = { "flush", "utf8=", "shortname=", "umask=", "dmask=", "fmask=", "codepage=", "iocharset=", "usefree", "showexec", NULL }; +static const gchar *vfat_allow[] = { "flush", "utf8=", "shortname=", "umask=", "dmask=", "fmask=", "codepage=", "iocharset=", "usefree", "showexec", + /* FAT flags */ + "allow_utime=", "check=", "discard", "dos1xfloppy", "errors=", "fat=", "nfs=", "tz=UTC", "time_offset=", "quiet", "rodir", "sys_immutable", "dots", "nodots", "dotsOK=", + /* VFAT flags */ + "uni_xlate", "nonumtail", + NULL }; static const gchar *vfat_allow_uid_self[] = { "uid=", NULL }; static const gchar *vfat_allow_gid_self[] = { "gid=", NULL }; @@ -532,10 +539,164 @@ is_mount_option_allowed (const FSMountOp return allowed; } +/* There can be 3 results: + * no key match (return FALSE, match = FALSE) + * id match (return TRUE, match = TRUE) + * no id match (return TRUE, match = FALSE) + * group/key is expected to exist, no checks are performed! + */ +static inline gboolean +check_mount_conf_condition (GKeyFile *keyfile, + const gchar *group, const gchar *key, gboolean *match, + const gchar *key_to_match, const gchar *id_to_match) +{ + if (!strcmp (key, key_to_match)) + { + if (id_to_match) + { + gchar **strarray, **value; + strarray = g_key_file_get_string_list (keyfile, + group, + key_to_match, NULL, NULL); + for (value = strarray; *value; value++) + if (!strcmp (*value, id_to_match)) + *match = TRUE; + g_strfreev(strarray); + } + return TRUE; + } else + return FALSE; +} + +static void +get_mount_conf_dir_options (const gchar *config_dir, + GPtrArray *options, + const gchar *fs_type, + UDisksBlock *block, + GError **error) +{ + GError *local_error; + GKeyFile *keyfile; + + gchar *conf_filename; + conf_filename = g_build_filename (config_dir, MOUNT_CONF, NULL); + + local_error = NULL; + keyfile = g_key_file_new (); + if (g_key_file_load_from_file (keyfile, conf_filename, + G_KEY_FILE_NONE, &local_error)) + { + gchar **groups, **group; + + udisks_info ("Loading %s", conf_filename); + + groups = g_key_file_get_groups (keyfile, NULL); + + group = groups; + while (*group) + { + gchar **keys, **key; + gboolean options_seen = FALSE; + gboolean match_all = TRUE; + gchar **options_add = NULL; + + keys = g_key_file_get_keys (keyfile, *group, NULL, NULL); + key = keys; + + while (*key) + { + if (!strcmp (*key, "Options")) + { + options_seen = TRUE; + options_add = g_key_file_get_string_list (keyfile, + *group, + "Options", NULL, NULL); + } else { + gboolean match = FALSE; + if (!((fs_type ? + check_mount_conf_condition (keyfile, *group, *key, &match, "Type", fs_type) : + check_mount_conf_condition (keyfile, *group, *key, &match, "Type", udisks_block_get_id_type (block))) || + check_mount_conf_condition (keyfile, *group, *key, &match, "UUID", udisks_block_get_id_uuid (block)) || + check_mount_conf_condition (keyfile, *group, *key, &match, "Label", udisks_block_get_id_label (block)) || + check_mount_conf_condition (keyfile, *group, *key, &match, "Usage", udisks_block_get_id_usage (block)) || + check_mount_conf_condition (keyfile, *group, *key, &match, "Version", udisks_block_get_id_version (block)))) + { + g_set_error (error, + UDISKS_ERROR, + UDISKS_ERROR_SYNTAX_ERROR, + "Error parsing %s: [%s]: unknown match keyword %s", + conf_filename, *group, *key); + g_strfreev (keys); + goto key_error; + } + if (!match) + match_all = FALSE; + } + key++; + } + g_strfreev (keys); + + if (!options_seen) { + g_set_error (error, + UDISKS_ERROR, + UDISKS_ERROR_SYNTAX_ERROR, + "Error parsing %s: [%s]: mission keyword \"Options\"", + conf_filename, *group); + goto key_error; + } + + if (match_all) + { + udisks_debug ("Mount options rule \"%s\" matches", *group); + for (key = options_add; *key; key++) + g_ptr_array_add (options, *key); + } + + /* Free just the array, keep elements allocated to save g_strdup() */ + g_free (options_add); + + group++; + } + key_error: + g_strfreev (groups); + g_key_file_free (keyfile); + } else + if (!g_error_matches (*error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) + { + if (local_error->code != G_FILE_ERROR_NOENT) + g_propagate_prefixed_error (error, local_error, "Error opening %s", conf_filename); + else + g_error_free (local_error); + } + g_free (conf_filename); +} + +static void +get_mount_conf_options (GPtrArray *options, + gchar *caller_home, + const gchar *fs_type, + UDisksBlock *block, + GError **error) +{ + gchar *config_dir; + + get_mount_conf_dir_options (PACKAGE_SYSCONF_DIR, options, fs_type, block, error); + if (*error) + return; + config_dir = g_build_filename (caller_home, ".config", NULL); + get_mount_conf_dir_options (config_dir, options, fs_type, block, error); + g_free (config_dir); + +} + static gchar ** prepend_default_mount_options (const FSMountOptions *fsmo, uid_t caller_uid, - GVariant *given_options) + gchar *caller_home, + GVariant *given_options, + const gchar *fs_type, + UDisksBlock *block, + GError **error) { GPtrArray *options; gint n; @@ -544,6 +705,7 @@ prepend_default_mount_options (const FSM const gchar *option_string; options = g_ptr_array_new (); + if (fsmo != NULL) { const gchar *const *defaults = fsmo->defaults; @@ -573,6 +735,8 @@ prepend_default_mount_options (const FSM } } + get_mount_conf_options (options, caller_home, fs_type, block, error); + if (g_variant_lookup (given_options, "options", "&s", &option_string)) @@ -712,6 +876,7 @@ static gchar * calculate_mount_options (UDisksDaemon *daemon, UDisksBlock *block, uid_t caller_uid, + gchar *caller_home, const gchar *fs_type, GVariant *options, GError **error) @@ -720,6 +885,7 @@ calculate_mount_options (UDisksDaemon gchar **options_to_use; gchar *options_to_use_str; GString *str; + GError *local_error; guint n; options_to_use = NULL; @@ -730,7 +896,13 @@ calculate_mount_options (UDisksDaemon /* always prepend some reasonable default mount options; these are * chosen here; the user can override them if he wants to */ - options_to_use = prepend_default_mount_options (fsmo, caller_uid, options); + local_error = NULL; + options_to_use = prepend_default_mount_options (fsmo, caller_uid, caller_home, options, fs_type, block, &local_error); + if (local_error) + { + g_propagate_error (error, local_error); + goto out2; + } /* validate mount options */ str = g_string_new ("uhelper=udisks2,nodev,nosuid"); @@ -744,7 +916,7 @@ calculate_mount_options (UDisksDaemon g_set_error (error, UDISKS_ERROR, UDISKS_ERROR_OPTION_NOT_PERMITTED, - "Malformed mount option `%s'", + "Malformed mount option `%s' (separate " MOUNT_CONF " options by \";\")", option); g_string_free (str, TRUE); goto out; @@ -770,8 +942,10 @@ calculate_mount_options (UDisksDaemon out: g_strfreev (options_to_use); + out2: g_assert (options_to_use_str == NULL || g_utf8_validate (options_to_use_str, -1, NULL)); + udisks_info ("Calculated mount options: %s", options_to_use_str); return options_to_use_str; } @@ -1159,6 +1333,7 @@ handle_mount (UDisksFilesystem *fi gchar *escaped_mount_point_to_use; gchar *error_message; gchar *caller_user_name; + gchar *caller_user_home; GError *error; const gchar *action_id; const gchar *message; @@ -1175,6 +1350,7 @@ handle_mount (UDisksFilesystem *fi escaped_mount_options_to_use = NULL; escaped_mount_point_to_use = NULL; caller_user_name = NULL; + caller_user_home = NULL; system_managed = FALSE; /* only allow a single call at a time */ @@ -1228,6 +1404,7 @@ handle_mount (UDisksFilesystem *fi &caller_uid, &caller_gid, &caller_user_name, + &caller_user_home, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -1402,6 +1579,7 @@ handle_mount (UDisksFilesystem *fi mount_options_to_use = calculate_mount_options (daemon, block, caller_uid, + caller_user_home, fs_type_to_use, options, &error); @@ -1530,6 +1708,7 @@ handle_mount (UDisksFilesystem *fi g_free (mount_point_to_use); g_free (fstab_mount_options); g_free (caller_user_name); + g_free (caller_user_home); g_clear_object (&object); /* only allow a single call at a time */ @@ -1618,7 +1797,7 @@ handle_unmount (UDisksFilesystem * } error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL, &caller_uid, NULL, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL, &caller_uid, NULL, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); @@ -1884,6 +2063,7 @@ handle_set_label (UDisksFilesystem &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); Index: udisks-2.1.5/src/udisksbasejob.c =================================================================== --- udisks-2.1.5.orig/src/udisksbasejob.c +++ udisks-2.1.5/src/udisksbasejob.c @@ -384,6 +384,7 @@ handle_cancel (UDisksJob *_ &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_take_error (invocation, error); Index: udisks-2.1.5/src/udiskslinuxblock.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxblock.c +++ udisks-2.1.5/src/udiskslinuxblock.c @@ -2243,7 +2243,7 @@ handle_format (UDisksBlock *bl } error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, &caller_gid, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, &caller_gid, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); Index: udisks-2.1.5/src/udiskslinuxdrive.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxdrive.c +++ udisks-2.1.5/src/udiskslinuxdrive.c @@ -1006,6 +1006,7 @@ handle_eject (UDisksDrive *_dr &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -1423,6 +1424,7 @@ handle_power_off (UDisksDrive &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); Index: udisks-2.1.5/src/udiskslinuxdriveata.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxdriveata.c +++ udisks-2.1.5/src/udiskslinuxdriveata.c @@ -1171,6 +1171,7 @@ handle_smart_selftest_start (UDisksDrive &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -2265,6 +2266,7 @@ handle_security_erase_unit (UDisksDriveA &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -2358,6 +2360,7 @@ handle_smart_set_enabled (UDisksDriveAta &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); Index: udisks-2.1.5/src/udiskslinuxencrypted.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxencrypted.c +++ udisks-2.1.5/src/udiskslinuxencrypted.c @@ -307,7 +307,7 @@ handle_unlock (UDisksEncrypted *e /* we need the uid of the caller for the unlocked-luks file */ error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); @@ -556,7 +556,7 @@ handle_lock (UDisksEncrypted *enc /* we need the uid of the caller to check authorization */ error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); @@ -676,7 +676,7 @@ handle_change_passphrase (UDisksEncrypte } error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); Index: udisks-2.1.5/src/udiskslinuxloop.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxloop.c +++ udisks-2.1.5/src/udiskslinuxloop.c @@ -215,7 +215,7 @@ handle_delete (UDisksLoop *l state = udisks_daemon_get_state (daemon); error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL, &caller_uid, NULL, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL, &caller_uid, NULL, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); @@ -401,7 +401,7 @@ handle_set_autoclear (UDisksLoop daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object)); error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL, &caller_uid, NULL, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL, &caller_uid, NULL, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); Index: udisks-2.1.5/src/udiskslinuxmanager.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxmanager.c +++ udisks-2.1.5/src/udiskslinuxmanager.c @@ -319,7 +319,7 @@ handle_loop_setup (UDisksManager /* we need the uid of the caller for the loop file */ error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (manager->daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (manager->daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); @@ -555,7 +555,7 @@ handle_mdraid_create (UDisksManager dev_t raid_device_num; error = NULL; - if (!udisks_daemon_util_get_caller_uid_sync (manager->daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, &error)) + if (!udisks_daemon_util_get_caller_uid_sync (manager->daemon, invocation, NULL /* GCancellable */, &caller_uid, NULL, NULL, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_clear_error (&error); Index: udisks-2.1.5/src/udiskslinuxmdraid.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxmdraid.c +++ udisks-2.1.5/src/udiskslinuxmdraid.c @@ -609,6 +609,7 @@ handle_start (UDisksMDRaid *_m &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -773,6 +774,7 @@ handle_stop (UDisksMDRaid *_md &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -957,6 +959,7 @@ handle_remove_device (UDisksMDRaid &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -1160,6 +1163,7 @@ handle_add_device (UDisksMDRaid &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -1299,6 +1303,7 @@ handle_set_bitmap_location (UDisksMDRaid &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -1421,6 +1426,7 @@ handle_request_sync_action (UDisksMDRaid &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); Index: udisks-2.1.5/src/udiskslinuxpartition.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxpartition.c +++ udisks-2.1.5/src/udiskslinuxpartition.c @@ -260,6 +260,7 @@ handle_set_flags (UDisksPartition &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -425,6 +426,7 @@ handle_set_name (UDisksPartition &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -767,6 +769,7 @@ handle_set_type (UDisksPartition &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -878,6 +881,7 @@ handle_delete (UDisksPartition *p &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); Index: udisks-2.1.5/src/udiskslinuxpartitiontable.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxpartitiontable.c +++ udisks-2.1.5/src/udiskslinuxpartitiontable.c @@ -382,6 +382,7 @@ handle_create_partition (UDisksPartition &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); Index: udisks-2.1.5/src/udiskslinuxswapspace.c =================================================================== --- udisks-2.1.5.orig/src/udiskslinuxswapspace.c +++ udisks-2.1.5/src/udiskslinuxswapspace.c @@ -181,6 +181,7 @@ handle_start (UDisksSwapspace *sw &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); @@ -268,6 +269,7 @@ handle_stop (UDisksSwapspace *swa &caller_uid, &caller_gid, NULL, + NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); Index: udisks-2.1.5/src/udisksdaemonutil.h =================================================================== --- udisks-2.1.5.orig/src/udisksdaemonutil.h +++ udisks-2.1.5/src/udisksdaemonutil.h @@ -61,6 +61,7 @@ gboolean udisks_daemon_util_get_caller_u uid_t *out_uid, gid_t *out_gid, gchar **out_user_name, + gchar **out_user_home, GError **error); gboolean udisks_daemon_util_get_caller_pid_sync (UDisksDaemon *daemon, Index: udisks-2.1.5/src/udisksdaemonutil.c =================================================================== --- udisks-2.1.5.orig/src/udisksdaemonutil.c +++ udisks-2.1.5/src/udisksdaemonutil.c @@ -467,6 +467,7 @@ check_authorization_no_polkit (UDisksDae &caller_uid, NULL, /* gid_t *out_gid */ NULL, /* gchar **out_user_name */ + NULL, /* gchar **out_user_home */ &error)) { g_dbus_method_invocation_return_error (invocation, @@ -778,6 +779,7 @@ udisks_daemon_util_get_caller_uid_sync ( uid_t *out_uid, gid_t *out_gid, gchar **out_user_name, + gchar **out_user_home, GError **error) { gboolean ret; @@ -854,6 +856,8 @@ udisks_daemon_util_get_caller_uid_sync ( *out_gid = pw->pw_gid; if (out_user_name != NULL) *out_user_name = g_strdup (pwstruct.pw_name); + if (out_user_home != NULL) + *out_user_home = g_strdup (pwstruct.pw_dir); } ret = TRUE; Index: udisks-2.1.5/udisks/udisksenums.h =================================================================== --- udisks-2.1.5.orig/udisks/udisksenums.h +++ udisks-2.1.5/udisks/udisksenums.h @@ -46,6 +46,7 @@ G_BEGIN_DECLS * @UDISKS_ERROR_TIMED_OUT: The operation timed out. * @UDISKS_ERROR_WOULD_WAKEUP: The operation would wake up a disk that is in a deep-sleep state. * @UDISKS_ERROR_DEVICE_BUSY: Attempting to unmount a device that is busy. + * @UDISKS_ERROR_SYNTAX_ERROR: Syntax error in the configuration file. * * Error codes for the #UDISKS_ERROR error domain and the * corresponding D-Bus error names. @@ -66,10 +67,11 @@ typedef enum UDISKS_ERROR_NOT_SUPPORTED, /* org.freedesktop.UDisks2.Error.NotSupported */ UDISKS_ERROR_TIMED_OUT, /* org.freedesktop.UDisks2.Error.Timedout */ UDISKS_ERROR_WOULD_WAKEUP, /* org.freedesktop.UDisks2.Error.WouldWakeup */ - UDISKS_ERROR_DEVICE_BUSY /* org.freedesktop.UDisks2.Error.DeviceBusy */ + UDISKS_ERROR_DEVICE_BUSY, /* org.freedesktop.UDisks2.Error.DeviceBusy */ + UDISKS_ERROR_SYNTAX_ERROR /* org.freedesktop.UDisks2.Error.SyntaxError */ } UDisksError; -#define UDISKS_ERROR_NUM_ENTRIES (UDISKS_ERROR_DEVICE_BUSY + 1) +#define UDISKS_ERROR_NUM_ENTRIES (UDISKS_ERROR_SYNTAX_ERROR + 1) /** * UDisksPartitionTypeInfoFlags: Index: udisks-2.1.5/udisks/udiskserror.c =================================================================== --- udisks-2.1.5.orig/udisks/udiskserror.c +++ udisks-2.1.5/udisks/udiskserror.c @@ -48,6 +48,7 @@ static const GDBusErrorEntry dbus_error_ {UDISKS_ERROR_TIMED_OUT, "org.freedesktop.UDisks2.Error.Timedout"}, {UDISKS_ERROR_WOULD_WAKEUP, "org.freedesktop.UDisks2.Error.WouldWakeup"}, {UDISKS_ERROR_DEVICE_BUSY, "org.freedesktop.UDisks2.Error.DeviceBusy"}, + {UDISKS_ERROR_SYNTAX_ERROR, "org.freedesktop.UDisks2.Error.SyntaxError"}, }; GQuark