A certain engineer "COMPLEX"

.NETでLinuxと遊んでみる Visual Studio Code編 第5回

Introduction


前回は、System.IO.FileStreamを使ってファイルのアクセス権限を確認してみました。

.NETでLinuxと遊んでみる Visual Studio Code編 第4回
Introduction前回は、System.IO.DirectoryInfoを使って、ファイルの一覧を列挙してみました。今回はファイルへのアクセス可否についてです。May I open this file?Windo...

今回は少し高度なファイルへのアクセス可否についてです。

P/Invoke


ファイルに実際にアクセスしてみて、アクセスできるかどうかを試すって、結構良くないと思います。
かといって、Windowsの.NET Frameworkにアクセスできるかどうかを試すAPIは無かったはずです。

ですが、Linuxのシステムコールを使えば、それが実現可能です。
システムコールの呼び出しは当然P/Invokeで実現します。

Linuxのシステムコールで、ファイルに対して、読み込みができるか、書き込みが出来るか、実行できるか、という状態を調べるには、accessを呼び出します。

大抵のシステムコールはlibcに定義されています。
実際に、libcに定義されている関数の一覧からaccessを探してみます。
そのために、nmコマンドに-Dオプションを渡します。

これでlibcにaccessが定義されていることがわかりました。

次にaccessの使い方です。
定義は下記です。

第一引数はファイルパスです。
第二引数は調べるモードを表します。

意味
F_OK 存在するか
R_OK 読み込み可能か
W_OK 書き込み可能か
X_OK 実行可能か

第二引数のモードを組み合わせることで、アクセス可否をチェックします。
指定したモードを満たせば、0を返します。
満たさない場合は-1を返します。

Try


今回は、/etc/passwdを調べてみます。

root以外は、読み込みしかできません。

では、これをコードで調べてみます。

引数で指定したファイルの読み込み、書き込み、実行の可否を調べます。

前回同様、まずは、一般ユーザで確認します。
whichでdotnetコマンドの場所を調べているのは、rootユーザでdotnetまでのパスが通っていなかったので、実施しているだけです。
パスが通っているなら不要です。
引数のファイルパスはdotnet runの直後に追記することで指定できます。

読み込みしかできないようです。
ls -laで調べたとおりです。

続いて、rootで確認します。

読み書きができて、実行できないことが確認できました。
これも、ls -laで調べたとおりです。

では、存在しないファイルを指定してみます。

きちんと存在しないことを確認してくれます。

フォルダも調べることが出来ます。

Conclusion


Windows同様、P/Invokeが利用可能であることを確認できました。

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。