2011-12-26 32 views
3

我正在使用libhal來檢測設備事件。我能夠檢測添加或刪除的設備,但無法檢測設備的安裝點。功能libhal_volume_get_mount_point(volume)不起作用。如何在C/C++中查找設備的掛載點?

我有一個回調函數來檢測設備添加:

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檢測存儲設備掛載點的合適方法?

UPDATE

我設法找到通過搜索/etc/mtab安裝該設備的點,但還是有一個小問題。我假設設備只有一個分區。

如何獲取存儲設備上的分區列表?所以我可以找到每個的掛載點。

回答

1

首先,如果您提供有關嘗試使用libhal函數時失敗的更多詳細信息,則可能會得到解決此問題的答案。但要直接回答你的問題,C程序可以通過閱讀/ etc/mtab來確定安裝在哪裏。格式相當明顯,每行通常列出存儲設備的名稱,安裝目錄,文件系統類型和掛載選項。

要將文件系統中的特定目錄映射到它所屬的安裝點,它可能有點棘手 - 請記住,如果您正在循環訪問/ etc/mtab,則掛載點可以在其下具有其他掛載點。

您可能會發現查看正確執行此操作的程序的源代碼,例如「df」會幫助您正確使用它,或者如果您的程序不需要經常查看此信息,則可能決定直接調用popen(3)在df命令上爲你做。例如,命令:df /media/my-volume/some/path可以很好地顯示存儲設備的名稱和安裝該設備的安裝點。

+0

我已添加我的代碼。感謝您的回答。 – 2011-12-26 19:20:21

+0

我會嘗試搜索設備名稱的mtap。 – 2011-12-26 19:28:30

+0

我用'/ etc/mtab'成功了,但是我仍然有一個小問題:我假設連接的設備有一個分區。我如何獲得存儲設備的分區信息? – 2011-12-27 00:22:54