Инструменты пользователя

Инструменты сайта


// Временное решение проблемы автомонтирования в exo-mount (xfce4)

Столкнулся с проблемой, что в XFCE4 не все накопители монтируются с корректными опциями, вследствие чего, как минимум не видятся русские буковки. Первое что пришло в голову, нужно научить exo-mount понимать правила 'volume.policy.mount_option' но… какого-то черта в HAL 0.5.10 этот функционал стал DEPRECATED, а нового на замену я на нашёл, хотя вдумчиво прочитал всю спецификацию.

В результате был создан небольшой патч, с помощью которого можно сопоставить определённые опции монтирования различным файловым системам:

--- exo-mount-hal.c.orig        2007-11-29 20:26:09.000000000 +1000
+++ exo-mount-hal.c     2007-11-30 00:46:42.000000000 +1000
@@ -40,8 +40,6 @@
 
 #include <exo-mount/exo-mount-hal.h>
 
-
-
 static gboolean exo_mount_hal_init            (GError   **error);
 static void     exo_mount_hal_propagate_error (GError   **error,
                                                DBusError *derror);
@@ -70,7 +68,6 @@
 static DBusConnection *dbus_connection = NULL;
 
 
-
 static gboolean
 exo_mount_hal_init (GError **error)
 {
@@ -636,13 +633,67 @@
   gchar      **options;
   gchar       *fstype;
   gchar       *s;
+  gchar        opt_string[1024];
+  gchar      **sub_str;
+  gchar      **add_options;
+  gchar      **add_s;
+  const gchar *cs = g_getenv("HOME");;
+  gchar       *opt_file;
+  gint         add_opt_count = 0;
   gint         m, n = 0;
 
   g_return_val_if_fail (device != NULL, FALSE);
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
+  if(cs == NULL)
+  {
+       opt_file = "/.exo_mount_ops";
+  }
+  else
+  {
+       opt_file = g_strconcat(cs, "/.exo_mount_ops", NULL);
+  }
+
+  /* Get additional mount options */
+  FILE *fp = fopen(opt_file, "r");
+  if (fp != NULL)
+  {
+     printf("Additional fs options found\n");
+
+     while(1)
+     {
+        fgets(opt_string, sizeof(opt_string), fp);
+        sub_str = g_strsplit(opt_string, ":", -1);
+
+        printf("FS: %s\nOP: %s\nHAL_FS: %s\n", sub_str[0], sub_str[1], device->fstype);
+        if (strcmp(device->fstype, sub_str[0]) == 0)
+        {
+           add_options = g_strsplit(sub_str[1], ",", -1);
+           for(add_s = add_options; *add_s != NULL; ++add_s)
+           {
+              add_opt_count++;
+           }
+           printf("Hatred: hal_opt_count = %d\n", add_opt_count);
+           break;
+        }
+
+        if(feof(fp))
+        {
+           break;
+        }
+     }
+     
+     fclose(fp);
+  }
+  else
+  {
+       printf("Can't find user opt file: %s\n", opt_file);
+  }
+  
+  g_free(opt_file);
+
   /* determine the required mount options */
-  options = g_new0 (gchar *, 20);
+  options = g_new0 (gchar *, (20 + add_opt_count));
 
   /* check if we know any valid mount options */
   if (G_LIKELY (device->fsoptions != NULL))
@@ -679,6 +730,16 @@
         }
     }
 
+  if (add_opt_count != 0)
+  {
+       for(m = 0; m < add_opt_count; ++m)
+       {
+               options[n++] = g_strdup (add_options[m]);
+               g_free(add_options[m]);
+       }
+       g_free(add_options);
+  }
+
   /* try to determine a usable mount point */
   if (G_LIKELY (device->volume != NULL))
     {

Конфиг обладает именем .exo_mount_ops и находится в домашнем каталоге пользователя, примерное содержимое:

vfat:iocharset=utf8,codepage=1251,quiet
iso9660:iocharset=utf8

Эта бага есть в BufZilla XFCE, мой вариант решения проблемы там так же запощен:
http://bugzilla.xfce.org/show_bug.cgi?id=2891

Комментарии

Старые комментарии

спасибо :)

1 |
idkfa
| 2009-04-03 06:11 | reply

Да не за что, уже готово более свежее решение: XFCE 4.6, exo и опять опции монтирования

2 |
Alexander Drozdov
| 2009-04-04 02:23 | reply