]> git.ipfire.org Git - thirdparty/man-pages.git/blobdiff - man2/chown.2
man*/: srcfix (Use .P instead of .PP or .LP)
[thirdparty/man-pages.git] / man2 / chown.2
index d3e9de31aabf0818a8c2d2653cf986e4c62aae98..ffba3acafac098f6c8665d205998205ca4607511 100644 (file)
@@ -1,28 +1,8 @@
-.\" Hey Emacs! This file is -*- nroff -*- source.
-.\"
 .\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992
 .\" and Copyright (c) 1998 Andries Brouwer (aeb@cwi.nl)
-.\" and Copyright (c) 2007, 2008 Michael Kerrisk <mtk.manpages@gmail.com>
-.\"
-.\" Permission is granted to make and distribute verbatim copies of this
-.\" manual provided the copyright notice and this permission notice are
-.\" preserved on all copies.
-.\"
-.\" Permission is granted to copy and distribute modified versions of this
-.\" manual under the conditions for verbatim copying, provided that the
-.\" entire resulting derived work is distributed under the terms of a
-.\" permission notice identical to this one.
+.\" and Copyright (c) 2006, 2007, 2008, 2014 Michael Kerrisk <mtk.manpages@gmail.com>
 .\"
-.\" Since the Linux kernel and libraries are constantly changing, this
-.\" manual page may be incorrect or out-of-date.  The author(s) assume no
-.\" responsibility for errors or omissions, or for damages resulting from
-.\" the use of the information contained herein.  The author(s) may not
-.\" have taken the same level of care in the production of this manual,
-.\" which is licensed free of charge, as they might when working
-.\" professionally.
-.\"
-.\" Formatted or processed versions of this manual, if unaccompanied by
-.\" the source, must acknowledge the copyright and authors of this work.
+.\" SPDX-License-Identifier: Linux-man-pages-copyleft
 .\"
 .\" Modified by Michael Haardt <michael@moria.de>
 .\" Modified 1993-07-21 by Rik Faith <faith@cs.unc.edu>
 .\" 2007-07-08, mtk, added an example program; updated SYNOPSIS
 .\" 2008-05-08, mtk, Describe rules governing ownership of new files
 .\"     (bsdgroups versus sysvgroups, and the effect of the parent
-.\"     directory's set-group-ID permission bit).
+.\"     directory's set-group-ID mode bit).
 .\"
-.TH CHOWN 2 2008-06-16 "Linux" "Linux Programmer's Manual"
+.TH chown 2 (date) "Linux man-pages (unreleased)"
 .SH NAME
-chown, fchown, lchown \- change ownership of a file
+chown, fchown, lchown, fchownat \- change ownership of a file
+.SH LIBRARY
+Standard C library
+.RI ( libc ", " \-lc )
 .SH SYNOPSIS
+.nf
 .B #include <unistd.h>
-.sp
-.BI "int chown(const char *" path ", uid_t " owner ", gid_t " group );
-.br
+.P
+.BI "int chown(const char *" pathname ", uid_t " owner ", gid_t " group );
 .BI "int fchown(int " fd ", uid_t " owner ", gid_t " group );
-.br
-.BI "int lchown(const char *" path ", uid_t " owner ", gid_t " group );
-.sp
-.in -4n
+.BI "int lchown(const char *" pathname ", uid_t " owner ", gid_t " group );
+.P
+.BR "#include <fcntl.h>           " "/* Definition of AT_* constants */"
+.B #include <unistd.h>
+.P
+.BI "int fchownat(int " dirfd ", const char *" pathname ,
+.BI "             uid_t " owner ", gid_t " group ", int " flags );
+.fi
+.P
+.RS -4
 Feature Test Macro Requirements for glibc (see
 .BR feature_test_macros (7)):
-.in
-.sp
+.RE
+.P
 .BR fchown (),
 .BR lchown ():
-_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500
+.nf
+    /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
+        || _XOPEN_SOURCE >= 500
+.\"    || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
+        || /* glibc <= 2.19: */ _BSD_SOURCE
+.fi
+.P
+.BR fchownat ():
+.nf
+    Since glibc 2.10:
+        _POSIX_C_SOURCE >= 200809L
+    Before glibc 2.10:
+        _ATFILE_SOURCE
+.fi
 .SH DESCRIPTION
 These system calls change the owner and group of a file.
-The differ only in how the file is specified:
-.IP * 2
+The
+.BR chown (),
+.BR fchown (),
+and
+.BR lchown ()
+system calls differ only in how the file is specified:
+.IP \[bu] 3
 .BR chown ()
 changes the ownership of the file specified by
-.IR path ,
+.IR pathname ,
 which is dereferenced if it is a symbolic link.
-.IP *
+.IP \[bu]
 .BR fchown ()
 changes the ownership of the file referred to by the open file descriptor
 .IR fd .
-.IP *
+.IP \[bu]
 .BR lchown ()
 is like
 .BR chown (),
 but does not dereference symbolic links.
-.PP
+.P
 Only a privileged process (Linux: one with the
 .B CAP_CHOWN
 capability) may change the owner of a file.
@@ -81,15 +88,15 @@ to any group of which that owner is a member.
 A privileged process (Linux: with
 .BR CAP_CHOWN )
 may change the group arbitrarily.
-
+.P
 If the
 .I owner
 or
 .I group
 is specified as \-1, then that ID is not changed.
-
-When the owner or group of an executable file are changed by a non-superuser,
-the
+.P
+When the owner or group of an executable file is
+changed by an unprivileged user, the
 .B S_ISUID
 and
 .B S_ISGID
@@ -97,23 +104,108 @@ mode bits are cleared.
 POSIX does not specify whether
 this also should happen when root does the
 .BR chown ();
-the Linux behavior depends on the kernel version.
+the Linux behavior depends on the kernel version,
+and since Linux 2.2.13, root is treated like other users.
 .\" In Linux 2.0 kernels, superuser was like everyone else
-.\" In 2.2, up to 2.2.12, these bits were not cleared for superuser.
-.\" Since 2.2.13, superuser is once more like everyone else.
+.\" In Linux 2.2, up to Linux 2.2.12, these bits were not cleared for superuser.
+.\" Since Linux 2.2.13, superuser is once more like everyone else.
 In case of a non-group-executable file (i.e., one for which the
 .B S_IXGRP
 bit is not set) the
 .B S_ISGID
 bit indicates mandatory locking, and is not cleared by a
 .BR chown ().
-.SH "RETURN VALUE"
+.P
+When the owner or group of an executable file is changed (by any user),
+all capability sets for the file are cleared.
+.\"
+.SS fchownat()
+The
+.BR fchownat ()
+system call operates in exactly the same way as
+.BR chown (),
+except for the differences described here.
+.P
+If the pathname given in
+.I pathname
+is relative, then it is interpreted relative to the directory
+referred to by the file descriptor
+.I dirfd
+(rather than relative to the current working directory of
+the calling process, as is done by
+.BR chown ()
+for a relative pathname).
+.P
+If
+.I pathname
+is relative and
+.I dirfd
+is the special value
+.BR AT_FDCWD ,
+then
+.I pathname
+is interpreted relative to the current working
+directory of the calling process (like
+.BR chown ()).
+.P
+If
+.I pathname
+is absolute, then
+.I dirfd
+is ignored.
+.P
+The
+.I flags
+argument is a bit mask created by ORing together
+0 or more of the following values;
+.TP
+.BR AT_EMPTY_PATH " (since Linux 2.6.39)"
+.\" commit 65cfc6722361570bfe255698d9cd4dccaf47570d
+If
+.I pathname
+is an empty string, operate on the file referred to by
+.I dirfd
+(which may have been obtained using the
+.BR open (2)
+.B O_PATH
+flag).
+In this case,
+.I dirfd
+can refer to any type of file, not just a directory.
+If
+.I dirfd
+is
+.BR AT_FDCWD ,
+the call operates on the current working directory.
+This flag is Linux-specific; define
+.B _GNU_SOURCE
+.\" Before glibc 2.16, defining _ATFILE_SOURCE sufficed
+to obtain its definition.
+.TP
+.B AT_SYMLINK_NOFOLLOW
+If
+.I pathname
+is a symbolic link, do not dereference it:
+instead operate on the link itself, like
+.BR lchown ().
+(By default,
+.BR fchownat ()
+dereferences symbolic links, like
+.BR chown ().)
+.P
+See
+.BR openat (2)
+for an explanation of the need for
+.BR fchownat ().
+.SH RETURN VALUE
 On success, zero is returned.
 On error, \-1 is returned, and
 .I errno
-is set appropriately.
+is set to indicate the error.
 .SH ERRORS
-Depending on the file system, other errors can be returned.
+Depending on the filesystem,
+errors other than those listed below can be returned.
+.P
 The more general errors for
 .BR chown ()
 are listed below.
@@ -123,16 +215,39 @@ Search permission is denied on a component of the path prefix.
 (See also
 .BR path_resolution (7).)
 .TP
+.B EBADF
+.RB ( fchown ())
+.I fd
+is not a valid open file descriptor.
+.TP
+.B EBADF
+.RB ( fchownat ())
+.I pathname
+is relative but
+.I dirfd
+is neither
+.B AT_FDCWD
+nor a valid file descriptor.
+.TP
 .B EFAULT
-.I path
+.I pathname
 points outside your accessible address space.
 .TP
+.B EINVAL
+.RB ( fchownat ())
+Invalid flag specified in
+.IR flags .
+.TP
+.B EIO
+.RB ( fchown ())
+A low-level I/O error occurred while modifying the inode.
+.TP
 .B ELOOP
 Too many symbolic links were encountered in resolving
-.IR path .
+.IR pathname .
 .TP
 .B ENAMETOOLONG
-.I path
+.I pathname
 is too long.
 .TP
 .B ENOENT
@@ -144,95 +259,117 @@ Insufficient kernel memory was available.
 .B ENOTDIR
 A component of the path prefix is not a directory.
 .TP
+.B ENOTDIR
+.RB ( fchownat ())
+.I pathname
+is relative and
+.I dirfd
+is a file descriptor referring to a file other than a directory.
+.TP
 .B EPERM
 The calling process did not have the required permissions
 (see above) to change owner and/or group.
 .TP
-.B EROFS
-The named file resides on a read-only file system.
-.PP
-The general errors for
-.BR fchown ()
-are listed below:
-.TP
-.B EBADF
-The descriptor is not valid.
-.TP
-.B EIO
-A low-level I/O error occurred while modifying the inode.
-.TP
-.B ENOENT
-See above.
-.TP
 .B EPERM
-See above.
+The file is marked immutable or append-only.
+(See
+.BR ioctl_iflags (2).)
 .TP
 .B EROFS
-See above.
-.SH "CONFORMING TO"
-4.4BSD, SVr4, POSIX.1-2001.
-
-The 4.4BSD version can only be
-used by the superuser (that is, ordinary users cannot give away files).
+The named file resides on a read-only filesystem.
+.SH VERSIONS
+The 4.4BSD version can be
+used only by the superuser (that is, ordinary users cannot give away files).
 .\" chown():
 .\" SVr4 documents EINVAL, EINTR, ENOLINK and EMULTIHOP returns, but no
 .\" ENOMEM.  POSIX.1 does not document ENOMEM or ELOOP error conditions.
 .\" fchown():
 .\" SVr4 documents additional EINVAL, EIO, EINTR, and ENOLINK
 .\" error conditions.
+.SH STANDARDS
+POSIX.1-2008.
+.SH HISTORY
+.TP
+.BR chown ()
+.TQ
+.BR fchown ()
+.TQ
+.BR lchown ()
+4.4BSD, SVr4, POSIX.1-2001.
+.TP
+.BR fchownat ()
+POSIX.1-2008.
+Linux 2.6.16,
+glibc 2.4.
 .SH NOTES
+.SS Ownership of new files
 When a new file is created (by, for example,
 .BR open (2)
 or
 .BR mkdir (2)),
-its owner is made the same as the file system user ID of the
+its owner is made the same as the filesystem user ID of the
 creating process.
 The group of the file depends on a range of factors,
-including the type of file system,
-the options used to mount the file system,
-and whether or not the set-group-ID permission bit is enabled
+including the type of filesystem,
+the options used to mount the filesystem,
+and whether or not the set-group-ID mode bit is enabled
 on the parent directory.
-If the file system supports the
-.I "\-o\ grpid"
+If the filesystem supports the
+.B "\-o\ grpid"
 (or, synonymously
-.IR "\-o\ bsdgroups" )
+.BR "\-o\ bsdgroups" )
 and
-.I "\-o\ nogrpid"
+.B "\-o\ nogrpid"
 (or, synonymously
-.IR "\-o\ sysvgroups" )
+.BR "\-o\ sysvgroups" )
 .BR mount (8)
 options, then the rules are as follows:
-.IP * 2
-If the file system is mounted with
-.IR "\-o\ grpid" ,
+.IP \[bu] 3
+If the filesystem is mounted with
+.BR "\-o\ grpid" ,
 then the group of a new file is made
 the same as that of the parent directory.
-.IP *
-If the file system is mounted with
-.IR "\-o\ nogrpid"
+.IP \[bu]
+If the filesystem is mounted with
+.B \-o\ nogrpid
 and the set-group-ID bit is disabled on the parent directory,
 then the group of a new file is made the same as the
-process's file system GID.
-.IP *
-If the file system is mounted with
-.IR "\-o\ nogrpid"
+process's filesystem GID.
+.IP \[bu]
+If the filesystem is mounted with
+.B \-o\ nogrpid
 and the set-group-ID bit is enabled on the parent directory,
 then the group of a new file is made
 the same as that of the parent directory.
-.PP
-As at Linux 2.6.25,
+.P
+As at Linux 4.12,
 the
-.IR "\-o\ grpid"
+.B \-o\ grpid
 and
-.IR "\-o\ nogrpid"
+.B \-o\ nogrpid
 mount options are supported by ext2, ext3, ext4, and XFS.
-File systems that don't support these mount options follow the
-.IR "\-o\ nogrpid"
+Filesystems that don't support these mount options follow the
+.B \-o\ nogrpid
 rules.
-.PP
+.SS glibc notes
+On older kernels where
+.BR fchownat ()
+is unavailable, the glibc wrapper function falls back to the use of
+.BR chown ()
+and
+.BR lchown ().
+When
+.I pathname
+is a relative pathname,
+glibc constructs a pathname based on the symbolic link in
+.I /proc/self/fd
+that corresponds to the
+.I dirfd
+argument.
+.SS NFS
 The
 .BR chown ()
-semantics are deliberately violated on NFS file systems
+semantics are deliberately violated on NFS filesystems
 which have UID mapping enabled.
 Additionally, the semantics of all system
 calls which access the file contents are violated, because
@@ -242,8 +379,27 @@ Client side
 caching may lead to a delay between the time where ownership have
 been changed to allow access for a user and the time where the file can
 actually be accessed by the user on other clients.
-
-In versions of Linux prior to 2.1.81 (and distinct from 2.1.46),
+.SS Historical details
+The original Linux
+.BR chown (),
+.BR fchown (),
+and
+.BR lchown ()
+system calls supported only 16-bit user and group IDs.
+Subsequently, Linux 2.4 added
+.BR chown32 (),
+.BR fchown32 (),
+and
+.BR lchown32 (),
+supporting 32-bit IDs.
+The glibc
+.BR chown (),
+.BR fchown (),
+and
+.BR lchown ()
+wrapper functions transparently deal with the variations across kernel versions.
+.P
+Before Linux 2.1.81 (except 2.1.46),
 .BR chown ()
 did not follow symbolic links.
 Since Linux 2.1.81,
@@ -257,8 +413,7 @@ as the old
 has got the same syscall number, and
 .BR chown ()
 got the newly introduced number.
-.SH EXAMPLE
-.PP
+.SH EXAMPLES
 The following program changes the ownership of the file named in
 its second command-line argument to the value specified in its
 first command-line argument.
@@ -266,48 +421,51 @@ The new owner can be specified either as a numeric user ID,
 or as a username (which is converted to a user ID by using
 .BR getpwnam (3)
 to perform a lookup in the system password file).
-.nf
-
+.SS Program source
+.\" SRC BEGIN (chown.c)
+.EX
 #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] == \(aq\\0\(aq) {
-        fprintf(stderr, "%s <owner> <file>\\n", argv[0]);
+    char           *endptr;
+    uid_t          uid;
+    struct passwd  *pwd;
+\&
+    if (argc != 3 || argv[1][0] == \[aq]\e0\[aq]) {
+        fprintf(stderr, "%s <owner> <file>\en", argv[0]);
         exit(EXIT_FAILURE);
     }
-
+\&
     uid = strtol(argv[1], &endptr, 10);  /* Allow a numeric string */
-
-    if (*endptr != \(aq\\0\(aq) {         /* Was not pure numeric string */
+\&
+    if (*endptr != \[aq]\e0\[aq]) {         /* 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 */
-.fi
-.SH "SEE ALSO"
+}
+.EE
+.\" SRC END
+.SH SEE ALSO
+.BR chgrp (1),
+.BR chown (1),
 .BR chmod (2),
-.BR fchownat (2),
 .BR flock (2),
 .BR path_resolution (7),
 .BR symlink (7)