2011-12-26 7 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つの小さな問題がまだあります。デバイスに1つのパーティションしかないと仮定しています。

ストレージデバイス上のパーティションのリストを取得するにはどうすればよいですか?だから私はそれぞれのマウントポイントを見つけることができます。

答えて

1

まず、libhal関数を使用するときに何が失敗するかについて詳しく説明すると、その問題を解決するための回答が得られる場合があります。しかし、あなたの質問に直接答えるために、Cプログラムは/ etc/mtabを読んでどこにマウントされているかを判断することができます。形式はかなり分かりやすく、各行には通常、ストレージデバイスの名前、マウントされているディレクトリ、ファイルシステムの種類、マウントオプションがリストされています。

ファイルシステム内の特定のディレクトリを、それが属するマウントポイントにマップするには、ややこしいことがあります。/ etc/mtabをループしている場合は、マウントポイントの下に別のマウントポイントを置くことができます。

「df」のように正しく機能するプログラムのソースを見ると、この情報を正しく参照する必要がない場合や、プログラムでこの情報を頻繁に参照する必要がない場合は、 popen(3)をdfコマンドで実行してください。たとえば、コマンドdf /media/my-volume/some/pathは、ストレージデバイスの名前とそのデバイスがマウントされているマウントポイントの両方を表示する素晴らしいジョブを実行します。

+0

私のコードを追加しました。ご回答有難うございます。 –

+0

mtapでデバイス名を検索しようとします。 –

+0

私は '/ etc/mtab'で成功しましたが、私はまだ少し問題があります:接続されたデバイスが1つのパーティションを持っていると仮定しています。ストレージデバイスのパーティション情報を取得するにはどうすればよいですか? –

関連する問題