В общем нарисовал я патчик для этой фигни:
http://gq.net.ru/2007/01/25/kde-mountoptions-patch/ Патч не совсем честный, просто потому, что честного метода похоже не существует (точнее он заключается в том, чтобы задавать параметры в настройках KDE, а не в HAL, но возможность их задавать появится только в KDE 4). Тем не менее подожду еще немного (может из списка рассылки ответят-таки) и попробую протолкнуть его в дебиановский пакет для Etch. Типа “non-utf8-non-latin1 speaking communities need it very-very much”. Для того, чтобы KDE монтировал флэшки (и другие носители) с iocharset, а не с utf8 должен стоять пропатченный пакет kdebase-kio-plugin и в настройках HAL должно быть следующее (эти настройки, кстати, заставляют pmount-hal, gnome и ivman монтировать носители с правильной кодировкой): [EMAIL PROTECTED]:~# cat /etc/hal/fdi/policy/codepage.fdi <?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- --> <deviceinfo version="0.2"> <device> <match key="volume.fstype" string="vfat"> <merge key="volume.policy.mount_option.utf8" type="bool">false</merge> <merge key="volume.policy.mount_option.iocharset=koi8-r" type="bool">true</merge> <merge key="volume.policy.mount_option.codepage=866" type="bool">true</merge> </match> </device> </deviceinfo> В принципе можно там дописать еще каких-нить опций, но учтите, что опции можно только добавлять к тем, которые устанавливает KDE (отменять можно только опцию utf8). Сделано так просто потому, что вменяемого способа работы с ключами в libhal-storage нету, а добавлять проверку к каждой опции мне показалось излишним. Патч: 40_use_hal_mountoptions.diff Пакет, собранный для Debian Etch: * kdebase-kio-plugins Также пришлось обновить, чтобы не было проблем по зависимостям: * kcontrol * kdebase-bin * kdesktop * kfind * konqueror В принципе все эти другие пакеты (которые тоже может потребоваться обновить) ставится из репозитория deb http://gq.net.ru/debian experimental/
diff -u -r kdebase-3.5.5a.dfsg.1.orig/kioslave/media/mediamanager/halbackend.cpp kdebase-3.5.5a.dfsg.1/kioslave/media/mediamanager/halbackend.cpp --- kdebase-3.5.5a.dfsg.1.orig/kioslave/media/mediamanager/halbackend.cpp 2006-10-01 21:31:54.000000000 +0400 +++ kdebase-3.5.5a.dfsg.1/kioslave/media/mediamanager/halbackend.cpp 2007-01-25 00:20:57.036700891 +0300 @@ -745,6 +745,33 @@ s_HALBackend->DeviceCondition(udi, condition_name); } +QStringList HALBackend::getHALmountoptions(QString udi) +{ + const char* _ppt_string; + LibHalVolume* volume; + LibHalDrive* drive; + + QString _ppt_QString; + + volume = libhal_volume_from_udi( m_halContext, udi.latin1() ); + if( volume ) + drive = libhal_drive_from_udi( m_halContext, libhal_volume_get_storage_device_udi( volume ) ); + else + drive = libhal_drive_from_udi( m_halContext, udi.latin1() ); + + if( !drive ) + return QString::null; + + if( volume ) + _ppt_string = libhal_volume_policy_get_mount_options ( drive, volume, NULL ); + else + _ppt_string = libhal_drive_policy_get_mount_options ( drive, NULL ); + + _ppt_QString = QString(_ppt_string ? _ppt_string : ""); + + return QStringList::split(",",_ppt_QString); +} + QStringList HALBackend::mountoptions(const QString &name) { const Medium* medium = m_mediaList.findById(name); @@ -824,7 +851,11 @@ if (valids.contains("utf8")) { value = config.readBoolEntry("utf8", true); - tmp = QString("utf8=%1").arg(value ? "true" : "false"); + tmp = QString("utf8=%1").arg( + (!libhal_device_property_exists(m_halContext, name.latin1(), "volume.policy.mount_option.utf8",NULL)&&value + ||libhal_device_property_exists(m_halContext, name.latin1(), "volume.policy.mount_option.utf8",NULL) + &&libhal_device_get_property_bool(m_halContext, name.latin1(), "volume.policy.mount_option.utf8",NULL) + ) ? "true" : "false"); result << tmp; } @@ -1069,10 +1100,20 @@ soptions << QString("data=ordered"); } + QStringList hal_mount_options = getHALmountoptions(medium->id()); + for (QValueListIterator<QString> it=hal_mount_options.begin();it!=hal_mount_options.end();it++) + { + soptions << *it; + kdDebug()<<"HALOption: "<<*it<<endl; + } + const char **options = new const char*[soptions.size() + 1]; uint noptions = 0; for (QStringList::ConstIterator it = soptions.begin(); it != soptions.end(); ++it, ++noptions) + { options[noptions] = (*it).latin1(); + kdDebug()<<"Option: "<<*it<<endl; + } options[noptions] = NULL; QString qerror = mount_priv(medium->id().latin1(), mount_point.utf8(), options, noptions, dbus_connection); diff -u -r kdebase-3.5.5a.dfsg.1.orig/kioslave/media/mediamanager/halbackend.h kdebase-3.5.5a.dfsg.1/kioslave/media/mediamanager/halbackend.h --- kdebase-3.5.5a.dfsg.1.orig/kioslave/media/mediamanager/halbackend.h 2006-07-22 12:15:45.000000000 +0400 +++ kdebase-3.5.5a.dfsg.1/kioslave/media/mediamanager/halbackend.h 2007-01-25 00:21:07.729315759 +0300 @@ -192,6 +192,7 @@ const char* message ); + QStringList getHALmountoptions(QString udi); /* HAL and DBus structures */ private: /**