int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
fchown(), lchown(): _BSD_SOURCE || _XOPEN_SOURCE >= 500
owner または group に -1 が指定された場合、それらの ID は変更されない。
スーパー・ユーザー以外によって実行ファイルの所有者またはグループが 変更された場合は S_ISUID と ISGID モードビットはクリアされる。 POSIX はこの動作やルートが chown() を行なった場合については特に指定されていない。 Linux における動作はカーネルのバージョンに依存する。 非グループ実行ファイル (S_IXGRP ビットが設定されていない) の場合には S_ISGID ビットは強制ロック (mandatory locking) を意味している。 そしてそれは chown() ではクリアできない。
fchown() で一般的なエラーを以下に挙げる:
4.4BSD 版ではスーパー・ユーザーのみが使用できる (つまり、普通のユーザーはファイルを手放すことはできない)。
Linux の 2.1.81 より前のバージョン (特に 2.1.46 以前) では、 chown() はシンボリック・リンクを追跡しない。 Linux 2.1.81 以降では chown() はシンボリック・リンクを追跡し、新たなシステム・コール lchown() はシンボリック・リンクを追跡しない。 Linux 2.1.86 以降ではこの新しいコール (古い chown() と全く同じ動作を行なう) は同じシステムコール番号を持ち chown() は新しく導入された番号を持つ。
以下のプログラムは、 二つ目のコマンドライン引き数で指定された名前のファイルの所有者を、 一つ目のコマンドライン引き数で指定された値に変更する。 新しい所有者は、数字のユーザ ID かユーザ名のいずれかで指定できる (ユーザ名で指定した場合には、 getpwnam(3) を使ってシステムのパスワードファイルの検索が行われ、 ユーザ ID への変換が行われる)。
#include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { uid_t uid; struct passwd *pwd; char *endptr; if (argc != 3 || argv[1][0] == '\0') { fprintf(stderr, "%s <owner> <file>\n", argv[0]); exit(EXIT_FAILURE); } uid = strtol(argv[1], &endptr, 10); /* Allow a numeric string */ if (*endptr != '\0') { /* Was not pure numeric string */ pwd = getpwnam(argv[1]); /* Try getting UID for username */ if (pwd == NULL) { perror("getpwnam"); exit(EXIT_FAILURE); } uid = pwd->pw_uid; } if (chown(argv[2], uid, -1) == -1) { perror("chown"); exit(EXIT_FAILURE); } /* if */ exit(EXIT_SUCCESS); } /* main */