C言語でchmodコマンドを書きたい

■要求定義
– ファイルやフォルダのアクセス権限を変更する

e.g.
$ ls -l
-rw-rw-r– 1 vagrant vagrant 89 May 17 11:50 sample.txt
$ chmod 777 sample.txt
$ ls -l
-rwxrwxrwx 1 vagrant vagrant 89 May 17 11:50 sample.txt

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <sys/stat.h>
 
int main(void){
 
    FILE *fp = "./sample.txt";
 
    chmod(fp, 666);
 
    return 0;
}

これでは上手く行かない。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <sys/stat.h>
 
int main(int argc, char**argv){
 
    char ans;
    int return_code = 0;
 
    if(argc == 2){
        printf('%sに実行許可を与えます。宜しいでしょうか(y/n)==>', *(argv+1));
        scanf('%c', &ans);
 
        if(ans == 'y' || ans == 'Y'){
            if(chmod(*(argv+1),
                S_IRUSR | S_IWUSR | S_IXUSR | /* S_IRUSR 00400, S_IWUSR 00200, S_IXUSR 00100 rwx*/
                S_IRGRP | S_IXGRP | /*IRGRP 00040 r-x, IXGRP 00010 */
                S_IROTH | S_IXOTH) == 0) { /*IROTH 00004, S_IXOTH 00001 */
                printf('実行許可を与えました。\n');
            } else {
                printf("実行許可を与えられませんでした\n");
                perror("");
                return 1;
            }
        } else {
            printf("キャンセルします。\n");
        }
    } else {
        printf("実行時引数の数が不正です。\n");
        return 2;
    }
 
    return 0;
}

■mode一覧
S_ISUID 04000:実行時のセット・ユーザー・ID(set user ID)。
S_ISGID 02000:実行時のセット・グループ・ID(set group ID)。
S_ISVTX 01000:スティッキー(sticky)ビット。
S_IRUSR 00400:所有者(owner)による読み取り(read)。
S_IWUSR 00200:所有者による書き込み(write)。
S_IXUSR 00100:所有者による実行(execute)・検索(search)。
S_IRGRP 00040:グループ(group)による読み取り。
S_IWGRP 00020:グループによる書き込み。
S_IXGRP 00010:グループによる実行・検索。
S_IROTH 00004:他人(others)による読み取り。
S_IWOTH 00002:他人による書き込み。
S_IXOTH 00001:他人による実行・検索。