.\" and Copyright (c) 1998 Andries Brouwer (aeb@cwi.nl)
.\" and Copyright (c) 2006, 2007, 2008, 2014 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
-.\" %%%LICENSE_START(VERBATIM)
-.\" 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.
-.\"
-.\" 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.
-.\" %%%LICENSE_END
+.\" 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>
.\" (bsdgroups versus sysvgroups, and the effect of the parent
.\" directory's set-group-ID mode bit).
.\"
-.TH CHOWN 2 2021-03-22 "Linux" "Linux Programmer's Manual"
+.TH chown 2 (date) "Linux man-pages (unreleased)"
.SH NAME
chown, fchown, lchown, fchownat \- change ownership of a file
+.SH LIBRARY
+Standard C library
+.RI ( libc ", " \-lc )
.SH SYNOPSIS
.nf
.B #include <unistd.h>
-.PP
+.P
.BI "int chown(const char *" pathname ", uid_t " owner ", gid_t " group );
.BI "int fchown(int " fd ", uid_t " owner ", gid_t " group );
.BI "int lchown(const char *" pathname ", uid_t " owner ", gid_t " group );
-.PP
+.P
.BR "#include <fcntl.h> " "/* Definition of AT_* constants */"
.B #include <unistd.h>
-.PP
+.P
.BI "int fchownat(int " dirfd ", const char *" pathname ,
.BI " uid_t " owner ", gid_t " group ", int " flags );
.fi
-.PP
+.P
.RS -4
Feature Test Macro Requirements for glibc (see
.BR feature_test_macros (7)):
.RE
-.PP
+.P
.BR fchown (),
.BR lchown ():
.nf
/* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| _XOPEN_SOURCE >= 500
.\" || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
- || /* Glibc <= 2.19: */ _BSD_SOURCE
+ || /* glibc <= 2.19: */ _BSD_SOURCE
.fi
-.PP
+.P
.BR fchownat ():
.nf
Since glibc 2.10:
and
.BR lchown ()
system calls differ only in how the file is specified:
-.IP * 2
+.IP \[bu] 3
.BR chown ()
changes the ownership of the file specified by
.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.
A privileged process (Linux: with
.BR CAP_CHOWN )
may change the group arbitrarily.
-.PP
+.P
If the
.I owner
or
.I group
is specified as \-1, then that ID is not changed.
-.PP
+.P
When the owner or group of an executable file is
changed by an unprivileged user, the
.B S_ISUID
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 ().
-.PP
+.P
When the owner or group of an executable file is changed (by any user),
all capability sets for the file are cleared.
.\"
system call operates in exactly the same way as
.BR chown (),
except for the differences described here.
-.PP
+.P
If the pathname given in
.I pathname
is relative, then it is interpreted relative to the directory
the calling process, as is done by
.BR chown ()
for a relative pathname).
-.PP
+.P
If
.I pathname
is relative and
is interpreted relative to the current working
directory of the calling process (like
.BR chown ()).
-.PP
+.P
If
.I pathname
is absolute, then
.I dirfd
is ignored.
-.PP
+.P
The
.I flags
argument is a bit mask created by ORing together
If
.I pathname
is an empty string, operate on the file referred to by
-.IR dirfd
+.I dirfd
(which may have been obtained using the
.BR open (2)
.B O_PATH
.BR fchownat ()
dereferences symbolic links, like
.BR chown ().)
-.PP
+.P
See
.BR openat (2)
for an explanation of the need for
.SH ERRORS
Depending on the filesystem,
errors other than those listed below can be returned.
-.PP
+.P
The more general errors for
.BR chown ()
are listed below.
(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 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 pathname .
.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 filesystem.
-.PP
-The general errors for
-.BR fchown ()
-are listed below:
-.TP
-.B EBADF
-.I fd
-is not a valid open file descriptor.
-.TP
-.B EIO
-A low-level I/O error occurred while modifying the inode.
-.TP
-.B ENOENT
-See above.
-.TP
-.B EPERM
-See above.
-.TP
-.B EROFS
-See above.
-.PP
-The same errors that occur for
-.BR chown ()
-can also occur for
-.BR fchownat ().
-The following additional errors can occur for
-.BR fchownat ():
-.TP
-.B EBADF
-.I pathname
-is relative but
-.I dirfd
-is neither
-.B AT_FDCWD
-nor a valid file descriptor.
-.TP
-.B EINVAL
-Invalid flag specified in
-.IR flags .
-.TP
-.B ENOTDIR
-.I pathname
-is relative and
-.I dirfd
-is a file descriptor referring to a file other than a directory.
.SH VERSIONS
-.BR fchownat ()
-was added to Linux in kernel 2.6.16;
-library support was added to glibc in version 2.4.
-.SH CONFORMING TO
-.BR chown (),
-.BR fchown (),
-.BR lchown ():
-4.4BSD, SVr4, POSIX.1-2001, POSIX.1-2008.
-.PP
The 4.4BSD version can be
used only by the superuser (that is, ordinary users cannot give away files).
.\" chown():
.\" fchown():
.\" SVr4 documents additional EINVAL, EIO, EINTR, and ENOLINK
.\" error conditions.
-.PP
-.BR fchownat ():
+.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 "\-o\ sysvgroups" )
.BR mount (8)
options, then the rules are as follows:
-.IP * 2
+.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 *
+.IP \[bu]
If the filesystem is mounted with
-.BR "\-o\ nogrpid"
+.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 filesystem GID.
-.IP *
+.IP \[bu]
If the filesystem is mounted with
-.BR "\-o\ nogrpid"
+.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
+.P
As at Linux 4.12,
the
-.BR "\-o\ grpid"
+.B \-o\ grpid
and
-.BR "\-o\ nogrpid"
+.B \-o\ nogrpid
mount options are supported by ext2, ext3, ext4, and XFS.
Filesystems that don't support these mount options follow the
-.BR "\-o\ nogrpid"
+.B \-o\ nogrpid
rules.
-.SS Glibc notes
+.SS glibc notes
On older kernels where
.BR fchownat ()
is unavailable, the glibc wrapper function falls back to the use of
.I pathname
is a relative pathname,
glibc constructs a pathname based on the symbolic link in
-.IR /proc/self/fd
+.I /proc/self/fd
that corresponds to the
-.IR dirfd
+.I dirfd
argument.
.SS NFS
The
and
.BR lchown ()
wrapper functions transparently deal with the variations across kernel versions.
-.PP
-In versions of Linux prior to 2.1.81 (and distinct from 2.1.46),
+.P
+Before Linux 2.1.81 (except 2.1.46),
.BR chown ()
did not follow symbolic links.
Since Linux 2.1.81,
.BR getpwnam (3)
to perform a lookup in the system password file).
.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\e0\(aq) {
+ 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\e0\(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);
}
-
+\&
exit(EXIT_SUCCESS);
}
.EE
+.\" SRC END
.SH SEE ALSO
.BR chgrp (1),
.BR chown (1),