Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       chown, fchown, lchown, fchownat - Modifier l'appartenance d'un fichier

SYNOPSIS

       #include <unistd.h>

       int chown(const char *pathname, uid_t owner, gid_t group);
       int fchown(int fd, uid_t owner, gid_t group);
       int lchown(const char *pathname, uid_t owner, gid_t group);

       #include <fcntl.h> /* Définition des constantes AT_* */
       #include <unistd.h>

       int fchownat(int dirfd, const char *pathname,
                    uid_t owner, gid_t group, int flags);

   Exigences    de    macros    de   test   de   fonctionnalités   pour   la   glibc   (consultez
   feature_test_macros(7)) :

       fchown(), lchown() :
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* Depuis la glibc 2.12 : */ _POSIX_C_SOURCE >= 200809L

       fchownat() :
           Depuis la glibc 2.10 :
               _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
           Avant la glibc 2.10 :
               _ATFILE_SOURCE

DESCRIPTION

       Ces appels système modifient le propriétaire et le groupe d'un fichier. Les appels système
       chown(),  fchown()  et  lchown()  diffèrent  seulement  dans  la façon dont le fichier est
       indiqué :

       * chown() modifie l'appartenance du fichier indiqué dans  pathname,  qui  est  déréférencé
         s'il s'agit d'un lien symbolique.

       * fchown()  modifie  l'appartenance  du  fichier  référencé  par le descripteur de fichier
         ouvert fd.

       * lchown() est comme chown(), mais ne déréférence pas les liens symboliques.

       Seul un processus privilégié (sous Linux : un processus qui a la capacité CAP_CHOWN)  peut
       modifier  le propriétaire d'un fichier. Le propriétaire peut modifier le groupe du fichier
       pour n'importe quel groupe auquel il appartient. Un  processus  privilégié  (sous  Linux :
       avec la capacité CAP_CHOWN) peut modifier le groupe arbitrairement.

       Si l'argument owner ou group vaut -1, l'élément correspondant n'est pas changé.

       Quand  le  propriétaire,  ou  le  groupe  d'un  fichier  exécutable  sont  modifiés par un
       utilisateur ordinaire, les bits S_ISUID et S_ISGID sont effacés. POSIX ne précise pas s'il
       faut  agir  de même lorsque c'est le superutilisateur qui invoque chown(). Le comportement
       de Linux dans ce cas dépend de la version du noyau. Si le fichier n'est pas exécutable par
       les  membres  de  son groupe (c'est-à-dire un fichier pour lequel le bit S_IXGRP n'est pas
       positionné), le bit S_ISGID indique la présence d'un verrou obligatoire sur le fichier, et
       n'est donc pas effacé par un chown().

   fchownat()
       L'appel  système  fchownat()  fonctionne  exactement comme chown(), les seules différences
       étant celles décrites ici.

       Si pathname est un chemin relatif, il est interprété par rapport au  répertoire  référencé
       par  le  descripteur  de  fichier  dirfd (plutôt que relativement au répertoire de travail
       courant du processus appelant, comme cela est fait par chown() pour un chemin relatif).

       Si pathname est relatif et  si  dirfd  est  la  valeur  spéciale  AT_FDCWD,  pathname  est
       interprété  comme  étant  relatif  au  répertoire  courant  du  processus  appelant (comme
       chown()).

       Si pathname est un chemin absolu, dirfd est ignoré.

       L'argument flags est un masque  construit  en  réalisant  un  OU  logique  entre  zéro  ou
       plusieurs des valeurs suivantes :

       AT_EMPTY_PATH (depuis Linux 2.6.39)
              Si  pathname  est  une  chaîne vide, opérer sur le fichier référencé par dirfd (qui
              peut avoir été obtenu en utilisant open(2) avec le drapeau O_PATH).  Dans  ce  cas,
              dirfd  peut  référer à tout type de fichier, pas uniquement un répertoire. Si dirfd
              vaut AT_FDCWD, l'appel opère sur le répertoire en cours. Ce drapeau est  spécifique
              à Linux, _GNU_SOURCE doit être définie pour obtenir sa définition.

       AT_SYMLINK_NOFOLLOW
              Si  pathname  est  un  lien  symbolique,  ne pas le déréférencer, mais renvoyer des
              informations sur le lien lui-même, comme le fait lchown(). (Par défaut,  fchownat()
              suit les liens symboliques, comme chown().)

       Consultez openat(2) pour une explication de la nécessité de fchownat().

VALEUR RENVOYÉE

       S'il  réussit, cet appel système renvoie 0. S'il échoue, il renvoie -1 et remplit errno en
       conséquence.

ERREURS

       Suivant le type de système de fichiers, d'autres  erreurs  que  celles  listées  ci-desous
       peuvent être renvoyées.

       Les erreurs les plus courantes pour chown() sont les suivantes :

       EACCES L'accès à un élément du chemin est interdit. (Voir aussi path_resolution(7).)

       EFAULT pathname pointe en‐dehors de l'espace d'adressage accessible.

       ELOOP  Trop de liens symboliques ont été rencontrés en parcourant pathname.

       ENAMETOOLONG
              pathname est trop long.

       ENOENT Le fichier n'existe pas.

       ENOMEM Pas assez de mémoire pour le noyau.

       ENOTDIR
              Un élément du chemin d'accès n'est pas un répertoire.

       EPERM  Le  processus  appelant  n'a  pas les permissions nécessaires (voir plus haut) pour
              modifier le propriétaire et/ou le groupe.

       EROFS  Le fichier indiqué réside sur un système de fichiers en lecture seule.

       Les erreurs courantes pour fchown() sont les suivantes :

       EBADF  Le descripteur de fichier est invalide.

       EIO    Une erreur d'entrée-sortie bas niveau s'est  produite  durant  la  modification  de
              l'inœud.

       ENOENT Voir plus haut.

       EPERM  Voir plus haut.

       EROFS  Voir plus haut.

       Les  mêmes  erreurs  qui apparaissent pour chown() peuvent apparaître pour fchownat(). Les
       erreurs supplémentaires suivantes peuvent également se produire pour fchownat() :

       EBADF  dirfd n'est pas un descripteur de fichier valable.

       EINVAL flags contient un attribut invalide.

       ENOTDIR
              pathname est relatif, et le descripteur de fichier dirfd est associé à un  fichier,
              pas à un répertoire.

VERSIONS

       fchownat() a été ajouté au noyau Linux dans sa version 2.6.16 ; la glibc le gère depuis la
       version 2.4.

CONFORMITÉ

       chown(), fchown(), lchown() : 4.4BSD, SVr4, POSIX.1-2001, POSIX.1-2008.

       La version BSD 4.4 ne peut être appelée que par le superutilisateur (ce qui signifie qu'un
       utilisateur ordinaire ne peut pas céder la propriété d'un fichier).

       fchownat() : POSIX.1-2008.

NOTES

       Les  appels  système  chown(), fchown() et lchown() originaux de Linux ne géraient que des
       identifiants d'utilisateur et de groupe sur 16 bits. En conséquence,  Linux 2.4  a  ajouté
       chown32(),  fchown32()  et lchown32() qui prennent en charge des identifiants 32 bits. Les
       fonctions chown(), fchown() et lchown() de la glibc qui les encapsulent gèrent de  manière
       transparente ces différences entre noyaux.

       Lorsqu'un   nouveau  fichier  est  créé  (par  exemple  avec  open(2)  ou  mkdir(2)),  son
       propriétaire est le même que l'UID du système de fichiers du processus créateur. Le groupe
       du  fichier  dépend  de  plusieurs  facteurs, incluant le type du système de fichiers, les
       options utilisées pour monter le système de fichiers, et si le bit de permission SGID  est
       activé  pour  le répertoire parent. Si le système de fichiers accepte les options -o grpid
       (ou de façon identique -o bsdgroups) et -o nogrpid (ou de façon  identique  -o sysvgroups)
       de mount(8), les règles sont alors les suivantes :

       * Si le système de fichiers est monté avec l'option -o grpid, le groupe du nouveau fichier
         est celui du répertoire parent.

       * Si le système de fichiers est monté avec l'option -o nogrpid  et  si  le  bit  SGID  est
         déactivé  pour  le répertoire parent, le groupe du nouveau fichier est le GID du système
         de fichiers du processus.

       * Si le système de fichiers est monté avec l'option -o nogrpid  et  si  le  bit  SGID  est
         activé  pour  le répertoire parent, le groupe du nouveau fichier est celui du répertoire
         parent.

       Dans Linux 2.6.25, les options de montage -o grpid et -o nogrpid sont acceptées par  ext2,
       ext3,  ext4  et  XFS.  Les systèmes de fichiers qui n'acceptent pas ces options de montage
       suivent les règles de l'option -o nogrpid.

       La sémantique de chown() est volontairement modifiée sur les systèmes de fichiers  NFS  où
       la  correspondance  d'UID  est  activée.  De  plus, c'est la sémantique de tous les appels
       système accédant au contenu des fichiers qui est modifiée, puisque chown() peut déclencher
       une  interdiction  immédiate  d'accès  à des fichiers déjà ouverts. Un cache situé du côté
       client peut induire un délai entre l'instant où l'appartenance du fichier est modifiée  et
       le moment où l'accès est effectivement accordé à l'utilisateur.

       Dans  les versions de Linux antérieures à 2.1.81 (sauf 2.1.46), chown() ne suivait pas les
       liens symboliques. Depuis cette version, chown() suit les liens symboliques, et il  existe
       un  nouvel  appel  système,  lchown(), qui ne les suit pas. Depuis Linux 2.1.86, ce nouvel
       appel système (qui a donc la même sémantique que l'ancien chown()) a pris  son  numéro  de
       syscall, et chown() a reçu un nouveau numéro.

EXEMPLE

       Le  programme suivant change le propriétaire d'un fichier fourni comme second paramètre de
       la ligne de commande, en l'attribuant au  propriétaire  fourni  en  premier  argument.  Le
       nouveau  propriétaire  peut  être  précisé  par  une  valeur  numérique  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 système.

   Source du programme
       #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 <propriétaire> <fichier>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           uid = strtol(argv[1], &endptr, 10);  /* Permet une chaîne numérique */

           if (*endptr != '\0') {         /* N'était pas une chaîne numérique */
               pwd = getpwnam(argv[1]);    /* Essai de récupérer 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

       chmod(2), flock(2), path_resolution(7), symlink(7)

COLOPHON

       Cette  page  fait partie de la publication 3.65 du projet man-pages Linux. Une description
       du projet et des  instructions  pour  signaler  des  anomalies  peuvent  être  trouvées  à
       l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis    2010,    cette   traduction   est   maintenue   à   l'aide   de   l'outil   po4a
       <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du  projet
       perkamon <http://perkamon.alioth.debian.org/>.

       Christophe    Blaess    <http://www.blaess.fr/christophe/>   (1996-2003),   Alain   Portal
       <http://manpagesfr.free.fr/>  (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de
       traduction de Debian (2006-2009).

       Veuillez     signaler     toute     erreur     de     traduction     en     écrivant     à
       <debian-l10n-french@lists.debian.org>  ou  par  un  rapport  de  bogue   sur   le   paquet
       manpages-fr.

       Vous  pouvez  toujours  avoir  accès  à la version anglaise de ce document en utilisant la
       commande « man -L C <section> <page_de_man> ».