C言語システムコール-chmod

chmodシステムコール

概要

chmodは指定ファイルのパーミッションを変更します。

chmodコマンド内部で使用されるシステムコールとなります。

chmodは「change mode」の略です。


chmodでは対象ファイルのパスを指定することでパーミッションを変更します。

fchmodではファイルディスクリプタを指定してパーミッションを変更します。


現在のファイルパーミッションを調べる場合にはstatシステムコールを使用します。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

/*!
 * @brief     ファイルのパーミッションを変更する。
 * @param[in] filepath  ファイルパス名
 * @param[in] mode      パーミッション
 * @return    0:success/-1:failure
 */
static int
change_mode(char *filepath, mode_t mode)
{
    int rc = 0;

    rc = chmod(filepath, mode);
    if(rc < 0){
        printf("Error: chmod() %s: %s\n", strerror(errno), filepath);
        return(-1);
    }

    printf("chmod: %s=%lo\n", filepath, (unsigned long)mode);

    return(0);
}

/*!
 * @brief     文字列を8進数に変換する。
 * @param[in] str    文字列
 * @return    8進数値
 * @return    -1ならばエラーとする。
 */
static unsigned long
str_to_octval(char *str)
{
    char *p = NULL;
    unsigned long num = 0;

    num = strtoul(str, &p, 8);
    if((p == str) || ((*p != '\0') && (*p != '\n'))){
        printf("Error: strtoul() %s: %s\n", strerror(errno), str);
        return(-1);
    }

    if(num < 0){
        printf("Error: Invalid value: %s\n", str);
        return(-1);
    }

    return(num);
}

int
main(int argc, char *argv[])
{
    int rc = 0;
    unsigned long val = 0;

    if(argc != 3){
        printf("Usage: %s <path> <permission-mode:octval>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    /* 8進数に変換する。 */
    val = str_to_octval(argv[2]);
    if(val < 0) exit(EXIT_FAILURE);

    rc = change_mode(argv[1], (mode_t)val);
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}


関連ページ