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

■要求定義
– ファイルやフォルダのオーナーやグループを変更する
– chown [オプション] ユーザー[:グループ] ファイル

■chownサンプル
$ ls -l sample.txt
–w–wx-wT 1 vagrant vagrant 89 May 17 11:50 sample.txt
// ここではユーザー所有権「vagrant」、グループ所有権「vagrant」
// [vagrant]から[root]に変更する
$ sudo chown root sample.txt
$ ls -l sample.txt
–w–wx-wT 1 root vagrant 89 May 17 11:50 sample.txt

基本的にファイルを作成したユーザがユーザ所有権者になる
ユーザ所有権を変更すると、所有権者以外はファイルの変更ができなくなる

所有者を自分にしておき、パーミッションを700にすると、他のユーザは見ることができない
ユーザグループに属しておけば、ユーザグループの権限が作業できる

■検討
#include
int chown(const char *path, uid_t owner, gid_t group);

– whoamiで自分のユーザ名、id ${ユーザ名}でuid, gidを調べられる
$ whoami
vagrant
$ id vagrant
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)

– ユーザ名一覧は「/etc/passwd」ファイルにある
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
// 省略
ubuntu:x:1001:1001:Ubuntu:/home/ubuntu:/bin/bash
mysql:x:111:115:MySQL Server,,,:/nonexistent:/bin/false

■ユーザ追加の手順
$ sudo su –
$ useradd -m hpscript
$ passwd ${ユーザ名} // パスワード設定
$ usermod -G sudo hpscript // sudoユーザに追加
$ cat /etc/group | grep hpscript
sudo:x:27:ubuntu,hpscript
hpscript:x:1002:

■ユーザ変更の手順
$ su hpscript

■グループ追加の手順
$ groupadd test-group

■グループにユーザ追加の手順
$ sudo gpasswd -a hpscript test-group
Adding user hpscript to group test-group
$ id hpscript
uid=1002(hpscript) gid=1002(hpscript) groups=1002(hpscript),1003(test-group)

$ sudo touch hpscript.txt
$ ls -l
-rw-r–r– 1 root root 0 May 18 03:51 hpscript.txt
あれ、sudoでtouchをするとルートユーザで作成したことになりますな。

#include <stdio.h>
#include <unistd.h>

int main(){

	char *fp;
	fp = "./hpscript.txt";
	int uid = 1001;
	int gid = 1001;

	if(chown(fp, uid, gid) == 0){
		printf("success\n");
	} else {
		printf("try again\n");
	};

	return 0;
}

$ ./dev
try again

あれ、なんでやろう??