我正在使用libhal来检测设备事件。我能够检测到添加或删除的设备但我无法检测到设备的挂载点。函数libhal_volume_get_mount_point(volume)
不起作用。
我有一个回调函数来检测设备添加:
static void handle_device_added(LibHalContext *ctx, const char *udi) {
dbus_bool_t is_storage;
dbus_bool_t is_volume;
is_storage = libhal_device_query_capability(ctx, udi, "storage", NULL);
is_volume = libhal_device_query_capability(ctx, udi, "volume", NULL);
if (is_storage) {
drive = libhal_drive_from_udi(ctx, udi);
if (libhal_drive_is_hotpluggable(drive) || libhal_drive_uses_removable_media(drive)) {
printf("Storage device added %s model %s\n",
libhal_drive_get_device_file(drive),
libhal_drive_get_model(drive));
}
libhal_drive_free(drive);
}
if(is_volume) {
volume = libhal_volume_from_udi(ctx, udi);
printf("Mount point = %s\n", libhal_volume_get_mount_point(volume));
libhal_volume_free(volume);
}
}
libhal_volume_from_udi,返回NULL。
您知道在C中检测存储设备安装点的任何合适方法吗?
更新
我设法通过搜索/etc/mtab
找到了设备的挂载点,但仍然存在一个小问题。我假设设备只有一个分区。
如何获取存储设备上的分区列表?所以我可以找到每个的挂载点。
答案 0 :(得分:1)
首先,如果您提供有关尝试使用libhal函数时失败的详细信息,您可能会得到有助于解决该问题的答案。但是为了直接回答你的问题,C程序可以通过读取/ etc / mtab来确定安装在哪里。格式相当不言自明,每行通常列出存储设备的名称,安装目录,文件系统类型和挂载选项。
要将文件系统中的特定目录映射到它所属的挂载点,它可能有点棘手 - 请记住,如果您在/ etc / mtab中循环,挂载点可以在其下面有其他挂载点。
您可能会发现查看正确执行此操作的程序的来源,例如“df”将帮助您正确执行此操作,或者如果您的程序不需要经常查找此信息,您可能会决定简单地调用popen (3)在df命令上为你做。例如,命令:df /media/my-volume/some/path
可以很好地显示存储设备的名称和安装该设备的安装点。