C言語システムコール-access
accessシステムコール
概要
accessは指定ファイルに対する実ユーザ及び実グループでのアクセス権有無について確認します。
複数あるアクセス権を確認するシステムコールの中で、実効プロセスの実効ユーザ及び実効グループではなく、実ユーザ及び実グループの権限を確認することがaccessシステムコールの特徴といえます。
accessシステムコールをrootセットユーザIDのコマンドから呼び出した場合、root権限ではなく設定されているユーザ権限でアクセス権限の確認が行われます。
accessを利用することで、セットユーザIDまたはセットグループIDを設定したコマンドを、ユーザ権限またはグループ権限でアクセスできるかどうか判定することが可能になります。
アクセス権を確認するための条件フラグは以下の通りです。
フラグは「|」(パイプ)を用いてAND条件で列挙可能です。
R_OK | 読み込み権限を確認する。 |
W_OK | 書き込み権限を確認する。 |
X_OK | 実行権限を確認する。 |
F_OK | ファイルの存在を確認する。 |
サンプルプログラム
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
/*!
* @brief ファイルが実行可能であるか確認する。
* @param[in] filepath ファイルパス名
* @return 1 実行権限がある
* @return 0 実行権限がない
*/
static int
is_exec(char *filepath)
{
int rc = 0;
/* 読み込み権限と実行権限を確認する。 */
rc = access(filepath, R_OK|X_OK);
if(rc < 0) return(0);
return(1);
}
int
main(int argc, char *argv[])
{
int rc = 0;
if(argc != 2){
fprintf(stderr, "Usage: %s <path>\n", argv[0]);
exit(EXIT_FAILURE);
}
rc = is_exec(argv[1]);
if(rc == 1){
fprintf(stdout, "Executable file: %s\n", argv[1]);
}else{
fprintf(stdout, "Permission Deny: %s\n", argv[1]);
}
exit(EXIT_SUCCESS);
}