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