Спасибо всем!
Порылся по вашим ссылкам, почитал, сделал так:
Нахожу устройства, сидящие на usb:
[cr@localhost hal-0.5.12rc1]$ hal-find-by-property --key storage.bus --string usb
/org/freedesktop/Hal/devices/storage_serial_Sony_Storage_Media
/org/freedesktop/Hal/devices/storage_serial_USBest_USB2FlashStorage_00000000000004_0_0
Затем для каждой точки монтирования нахожу uuid:
[cr@localhost hal-0.5.12rc1]$ hal-find-by-property --key volume.mount_point --string /media/disk
/org/freedesktop/Hal/devices/volume_uuid_CC21_0F55
Каждый из найденных uuid передаю дальше в dbus-send:
[cr@localhost hal-0.5.12rc1]$ dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/volume_uuid_CC21_0F55 org.freedesktop.Hal.Device.GetAllProperties
Получаю вывод от dbus-send и ищу в нем имена usb-девайсов, полученных на первом шаге:
method return sender=:1.1 -> dest=:1.101 reply_serial=2
array [
dict entry(
string "info.product"
variant string "Volume (vfat)"
)
dict entry(
string "linux.hotplug_type"
variant int32 3
)
dict entry(
string "info.udi"
variant string "/org/freedesktop/Hal/devices/volume_uuid_CC21_0F55"
)
dict entry(
string "block.storage_device"
variant string "/org/freedesktop/Hal/devices/storage_serial_USBest_USB2FlashStorage_00000000000004_0_0"
)
dict entry(
string "volume.fstype"
variant string "vfat"
)
dict entry(
string "volume.fsusage"
variant string "filesystem"
)
dict entry(
string "volume.fsversion"
variant string "FAT32"
)
dict entry(
string "volume.uuid"
variant string "CC21-0F55"
)
dict entry(
string "volume.label"
variant string ""
)
dict entry(
string "volume.mount_point"
variant string "/media/disk"
)
dict entry(
string "volume.is_mounted"
variant boolean true
)
dict entry(
string "volume.is_mounted_read_only"
variant boolean false
)
dict entry(
string "volume.linux.is_device_mapper"
variant boolean false
)
dict entry(
string "volume.is_disc"
variant boolean false
)
dict entry(
string "info.interfaces"
variant array [
string "org.freedesktop.Hal.Device.Volume"
]
)
dict entry(
string "volume.is_partition"
variant boolean true
)
dict entry(
string "volume.partition.number"
variant int32 1
)
dict entry(
string "volume.block_size"
variant int32 512
)
dict entry(
string "volume.num_blocks"
variant int32 31588288
)
dict entry(
string "volume.size"
variant uint64 16173203456
)
dict entry(
string "block.device"
variant string "/dev/sdc1"
)
dict entry(
string "volume.partition.start"
variant uint64 32256
)
dict entry(
string "info.category"
variant string "volume"
)
dict entry(
string "block.major"
variant int32 8
)
dict entry(
string "volume.partition.media_size"
variant uint64 16173235712
)
dict entry(
string "info.capabilities"
variant array [
string "volume"
string "block"
]
)
dict entry(
string "block.minor"
variant int32 33
)
dict entry(
string "volume.partition.scheme"
variant string "mbr"
)
dict entry(
string "block.is_volume"
variant boolean true
)
dict entry(
string "volume.partition.type"
variant string "0x0c"
)
dict entry(
string "volume.partition.label"
variant string ""
)
dict entry(
string "linux.sysfs_path"
variant string "/sys/block/sdc/sdc1"
)
dict entry(
string "volume.partition.uuid"
variant string ""
)
dict entry(
string "info.parent"
variant string "/org/freedesktop/Hal/devices/storage_serial_USBest_USB2FlashStorage_00000000000004_0_0"
)
dict entry(
string "volume.partition.flags"
variant array [
string "boot"
]
)
dict entry(
string "volume.ignore"
variant boolean false
)
dict entry(
string "storage.model"
variant string ""
)
dict entry(
string "org.freedesktop.Hal.Device.Volume.method_names"
variant array [
string "Mount"
string "Unmount"
string "Eject"
]
)
dict entry(
string "org.freedesktop.Hal.Device.Volume.method_signatures"
variant array [
string "ssas"
string "as"
string "as"
]
)
dict entry(
string "org.freedesktop.Hal.Device.Volume.method_argnames"
variant array [
string "mount_point fstype extra_options"
string "extra_options"
string "extra_options"
]
)
dict entry(
string "org.freedesktop.Hal.Device.Volume.method_execpaths"
variant array [
string "hal-storage-mount"
string "hal-storage-unmount"
string "hal-storage-eject"
]
)
dict entry(
string "volume.mount.valid_options"
variant array [
string "ro"
string "sync"
string "dirsync"
string "noatime"
string "nodiratime"
string "noexec"
string "quiet"
string "remount"
string "exec"
string "utf8"
string "shortname="
string "codepage="
string "iocharset="
string "umask="
string "dmask="
string "fmask="
string "uid="
string "flush"
]
)
dict entry(
string "volume.unmount.valid_options"
variant array [
string "lazy"
]
)
]
Нашёл - значит removable, если нет, проверяю поле volume.is_disc. которое равно true в случае cd-rom'a и false в случае винчестера.
Такой вот геморройный алгоритм.
Но и этот алгоритм на некоторых разделах даёт сбой: некоторые uuid dbus-send категорически отказывается принимать, возвещая об ошибке и ссылаясь на некие баги в прогах, использующих D-Bus:
process 11609: arguments to dbus_message_new_method_call() were incorrect, assertion "_dbus_check_is_valid_path (path)" failed in file dbus-message.c line 1074.
This is normally a bug in some application using the D-Bus library.
Такие вот пирожки
Что делать?
libhal, которая советовалась выше, использовать пока не решился. Фиг его знает, как она состыкуется с моей системой.
У меня установлена libhal1. Версия: 0.5.11-0.rc2.1mdv2008.1. Тот list_shares.c, который советовался выше, ссылается на <libhal.h> и <libhal-storage.h>, которых у меня нет.
Ставить devel-пакет hal-0.5.12rc1?