chown(2) System Calls Manual chown(2) NOM chown, fchown, lchown, fchownat - Modifier l'appartenance d'un fichier BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int chown(const char *chemin, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int lchown(const char *chemin, uid_t owner, gid_t group); #include /* Definition des constantes AT_* */ #include int fchownat(int dirfd, const char *chemin, uid_t owner, gid_t group, int flags); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : fchown(), lchown() : /* Depuis la glibc 2.12: */ _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 500 || /* Versions de la glibc <= 2.19: */ _BSD_SOURCE fchownat() : Depuis la glibc 2.10 : _POSIX_C_SOURCE >= 200809L avant la glibc 2.10 : _ATFILE_SOURCE DESCRIPTION Ces appels systeme modifient le proprietaire et le groupe d'un fichier. Les appels systeme chown(), fchown() et lchown() different seulement dans la facon dont le fichier est indique : - chown() modifie l'appartenance du fichier indique dans chemin, qui est dereference s'il s'agit d'un lien symbolique. - fchown() modifie l'appartenance du fichier reference par le descripteur de fichier ouvert fd. - lchown() est comme chown(), mais ne dereference pas les liens symboliques. Seul un processus privilegie (sous Linux : un processus qui a la capacite CAP_CHOWN) peut modifier le proprietaire d'un fichier. Le proprietaire peut modifier le groupe du fichier pour n'importe quel groupe auquel il appartient. Un processus privilegie (sous Linux : avec la capacite CAP_CHOWN) peut modifier le groupe arbitrairement. Si l'argument owner ou group vaut -1, l'element correspondant n'est pas change. Quand le proprietaire ou le groupe d'un fichier executable sont modifies par un utilisateur ordinaire, les bits S_ISUID et S_ISGID sont effaces. POSIX ne precise pas s'il faut agir de meme lorsque c'est le superutilisateur qui invoque chown(). Le comportement de Linux dans ce cas depend de la version du noyau et depuis la version 2.2.13, root est traite comme les autres utilisateurs. Si le fichier n'est pas executable par les membres de son groupe (c'est-a-dire un fichier pour lequel le bit S_IXGRP n'est pas positionne), le bit S_ISGID indique la presence d'un verrou imperatif sur le fichier, et n'est donc pas efface par un chown(). Quand le proprietaire ou le groupe d'un fichier executable est modifie (quel que soit l'utilisateur), tous les parametres de capacites du fichier sont effaces. fchownat() L'appel systeme fchownat() fonctionne exactement comme chown(), les seules differences etant celles decrites ici. Si chemin est un chemin relatif, il est interprete par rapport au repertoire reference par le descripteur de fichier dirfd (plutot que relativement au repertoire de travail courant du processus appelant, comme cela est fait par chown() pour un chemin relatif). Si chemin est relatif et si dirfd est la valeur speciale AT_FDCWD, chemin est interprete comme etant relatif au repertoire courant du processus appelant (comme chown()). Si pathname est absolu, alors dirfd est ignore. L'argument flags est un masque de bits construit en realisant un OU logique entre zero ou plusieurs des valeurs suivantes : AT_EMPTY_PATH (depuis Linux 2.6.39) Si chemin est une chaine vide, operer sur le fichier reference par dirfd (qui peut avoir ete obtenu en utilisant open(2) avec le drapeau O_PATH). Dans ce cas, dirfd peut referer a tout type de fichier, pas uniquement un repertoire. Si dirfd vaut AT_FDCWD, l'appel opere sur le repertoire en cours. Ce drapeau est specifique a Linux, _GNU_SOURCE doit etre definie pour obtenir sa definition. AT_SYMLINK_NOFOLLOW Si chemin est un lien symbolique, ne pas le dereferencer, mais renvoyer des informations sur le lien lui-meme, comme le fait lchown(). (Par defaut, fchownat() suit les liens symboliques, comme chown().) Consultez openat(2) pour une explication de la necessite de fchownat(). VALEUR RENVOYEE En cas de succes, zero est renvoye. En cas d'erreur, -1 est renvoye et errno est definie pour preciser l'erreur. ERREURS Suivant le type de systeme de fichiers, d'autres erreurs que celles listees ci-desous peuvent etre renvoyees. Les erreurs les plus courantes pour chown() sont les suivantes : EACCES L'acces a un element du chemin est interdit. (Voir aussi path_resolution(7).) EBADF (fchown()) Le descripteur de fichier fd est non valable. EBADF (fchownat()) pathname est relatif mais dirfd ne vaut ni AT_FDCWD, ni un descripteur de fichier valable. EFAULT nom_chemin pointe en dehors de l'espace d'adressage accessible. EINVAL (fchownat()) flags contient un attribut non valable. EIO (fchown()) Une erreur d'entree-sortie bas niveau s'est produite durant la modification de l'inoeud. ELOOP Trop de liens symboliques ont ete rencontres en parcourant nom_chemin. ENAMETOOLONG nom_chemin est trop long. ENOENT Le fichier n'existe pas. ENOMEM La memoire disponible du noyau n'etait pas suffisante. ENOTDIR Un element du chemin d'acces n'est pas un repertoire. ENOTDIR (fchownat()) pathname est relatif et dirfd est un descripteur de fichier faisant reference a un fichier qui n'est pas un dossier. EPERM Le processus appelant n'a pas les permissions necessaires (voir plus haut) pour modifier le proprietaire et/ou le groupe. EPERM Le fichier est indique comme immuable ou uniquement completable (voir ioctl_iflags(2)). EROFS Le fichier indique reside sur un systeme de fichiers en lecture seule. VERSIONS La version BSD 4.4 ne peut etre appelee que par le superutilisateur (ce qui signifie qu'un utilisateur ordinaire ne peut pas ceder la propriete d'un fichier). STANDARDS POSIX.1-2008. HISTORIQUE chown() fchown() lchown() 4.4BSD, SVr4, POSIX.1-2001. fchownat() POSIX.1-2008. Linux 2.6.16, glibc 2.4. NOTES Proprietaire des nouveaux fichiers Lorsqu'un nouveau fichier est cree (par exemple avec open(2) ou mkdir(2)), son proprietaire est le meme que l'UID du systeme de fichiers du processus createur. Le groupe du fichier depend de plusieurs facteurs, incluant le type du systeme de fichiers, les options utilisees pour monter le systeme de fichiers, et si le bit de permission SGID est active pour le repertoire parent. Si le systeme de fichiers accepte les options -o grpid (ou de facon identique -o bsdgroups) et -o nogrpid (ou de facon identique -o sysvgroups) de mount(8), les regles sont alors les suivantes : - Si le systeme de fichiers est monte avec l'option -o grpid, le groupe du nouveau fichier est celui du repertoire parent. - Si le systeme de fichiers est monte avec l'option -o nogrpid et si le bit SGID est deactive pour le repertoire parent, le groupe du nouveau fichier est le GID du systeme de fichiers du processus. - Si le systeme de fichiers est monte avec l'option -o nogrpid et si le bit SGID est active pour le repertoire parent, le groupe du nouveau fichier est celui du repertoire parent. A partir de Linux 4.12, les options de montage -o grpid et -o nogrpid sont acceptees par ext2, ext3, ext4 et XFS. Les systemes de fichiers qui n'acceptent pas ces options de montage suivent les regles de l'option -o nogrpid. Notes de la glibc Sur les anciens noyaux ou fchownat() n'est pas disponible, la fonction enveloppe de glibc se rabat sur l'utilisation de chown() et de lchown(). Quand chemin est relatif, glibc construit un chemin a partir du lien symbolique dans /proc/self/fd qui correspond a un parametre dirfd. NFS La semantique de chown() est volontairement modifiee sur les systemes de fichiers NFS ou la correspondance d'UID est activee. De plus, c'est la semantique de tous les appels systeme accedant au contenu des fichiers qui est modifiee, puisque chown() peut declencher une interdiction immediate d'acces a des fichiers deja ouverts. Un cache situe du cote client peut induire un delai entre l'instant ou l'appartenance du fichier est modifiee et le moment ou l'acces est effectivement accorde a l'utilisateur. Details historiques Les appels systeme chown(), fchown() et lchown() originaux de Linux ne geraient que des identifiants d'utilisateur et de groupe sur 16 bits. En consequence, Linux 2.4 a ajoute chown32(), fchown32() et lchown32() qui prennent en charge des identifiants 32 bits. Les fonctions chown(), fchown() et lchown() de la glibc qui les encapsulent gerent de maniere transparente ces differences entre noyaux. Avant Linux 2.1.81 (sauf 2.1.46), chown() ne suivait pas les liens symboliques. Depuis Linux 2.1.81, chown() suit les liens symboliques, et il existe un nouvel appel systeme, lchown(), qui ne les suit pas. Depuis Linux 2.1.86, ce nouvel appel systeme (qui a donc la meme semantique que l'ancien chown()) a pris son numero de syscall, et chown() a recu un nouveau numero. EXEMPLES Le programme suivant change le proprietaire d'un fichier fourni comme second parametre de la ligne de commande, en l'attribuant au proprietaire fourni en premier argument. Le nouveau proprietaire peut etre precise par une valeur numerique ou par le nom de l'utilisateur (qui sera converti en UID avec getpwnam(3) pour rechercher dans le fichier des mots de passe du systeme). Source du programme #include #include #include #include int main(int argc, char *argv[]) { char *endptr; uid_t uid; struct passwd *pwd; if (argc != 3 || argv[1][0] == '\0') { fprintf(stderr, "%s \n", argv[0]); exit(EXIT_FAILURE); } uid = strtol(argv[1], &endptr, 10); /* Permet une chaine numerique */ if (*endptr != '\0') { /* N'etait pas une chaine numerique */ pwd = getpwnam(argv[1]); /* Essai de recuperer l'UID de l'utilisateur */ if (pwd == NULL) { perror("getpwnam"); exit(EXIT_FAILURE); } uid = pwd->pw_uid; } if (chown(argv[2], uid, -1) == -1) { perror("chown"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } VOIR AUSSI chgrp(1), chown(1), chmod(2), flock(2), path_resolution(7), symlink(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 chown(2)