C言語システムコール-chown
chownシステムコール
概要
chownは指定ファイルの所有者とグループを変更します。
chownコマンド内部で使用されるシステムコールとなります。
chownは「change owner」の略です。
chwonでは所有者とグループはそれぞれ数値(ユーザIDとグループID)で指定する必要があります。
chownコマンドのようにユーザ名やグループ名で指定する場合には、getpwnam()やgetgrnam()などを利用してIDを取得する必要があります。
chown関連システムコール
- chown
- 指定ファイルがシンボリックリンクである場合、リンク先の実体ファイルをたどっての所有者情報を変更します。
- lchown
- 指定ファイルがシンボリックリンクである場合、リンク先の実体ファイルをたどらず、シンボリックリンク自体の所有者情報を変更します。
- fchown
- 指定ファイルをファイルパスでなく、ファイルディスクリプタで指定します。
サンプルプログラム
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
/*!
* @brief ファイルの所有者情報を変更する
* @param[in] filepath ファイルパス名
* @param[in] username ユーザ名
* @return 0:success/-1:failure
*/
static int
change_owner(char *filepath, char *username)
{
int rc = 0;
struct passwd *pswd = NULL;
errno = 0;
pswd = getpwnam(username);
if(pswd == NULL){
if(errno == 0){
printf("Error: getpwnam() Not found: %s\n", username);
}else{
printf("Error: getpwnam() %s: %s\n", strerror(errno), username);
}
return(-1);
}
rc = chown(filepath, pswd->pw_uid, pswd->pw_gid);
if(rc < 0){
printf("Error: chown() %s: %s\n", strerror(errno), filepath);
return(-1);
}
return(0);
}
int
main(int argc, char *argv[])
{
int rc = 0;
if(argc != 3){
printf("Usage: %s <path> <username>\n", argv[0]);
exit(EXIT_FAILURE);
}
rc = change_owner(argv[1], argv[2]);
if(rc != 0) exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}