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);
}

関連ページ