1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
|
.\" Copyright, the authors of the Linux man-pages project
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.TH chmod 2 2025-10-29 "Linux man-pages (unreleased)"
.SH NAME
chmod, fchmod, fchmodat \- change permissions of a file
.SH LIBRARY
Standard C library
.RI ( libc ,\~ \-lc )
.SH SYNOPSIS
.nf
.B #include <sys/stat.h>
.P
.BI "int chmod(const char *" path ", mode_t " mode );
.BI "int fchmod(int " fd ", mode_t " mode );
.P
.BR "#include <fcntl.h>" " /* Definition of AT_* constants */"
.B #include <sys/stat.h>
.P
.BI "int fchmodat(int " dirfd ", const char *" path ", mode_t " \
mode ", int " flags );
.fi
.P
.RS -4
Feature Test Macro Requirements for glibc (see
.BR feature_test_macros (7)):
.RE
.P
.nf
.BR fchmod ():
Since glibc 2.24:
_POSIX_C_SOURCE >= 199309L
.\" || (_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED)
glibc 2.19 to glibc 2.23
_POSIX_C_SOURCE
glibc 2.16 to glibc 2.19:
_BSD_SOURCE || _POSIX_C_SOURCE
glibc 2.12 to glibc 2.16:
_BSD_SOURCE || _XOPEN_SOURCE >= 500
|| _POSIX_C_SOURCE >= 200809L
glibc 2.11 and earlier:
_BSD_SOURCE || _XOPEN_SOURCE >= 500
.\" || (_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED)
.fi
.P
.BR fchmodat ():
.nf
Since glibc 2.10:
_POSIX_C_SOURCE >= 200809L
Before glibc 2.10:
_ATFILE_SOURCE
.fi
.SH DESCRIPTION
The
.BR chmod ()
and
.BR fchmod ()
system calls change a file's mode bits.
(The file mode consists of the file permission bits plus the set-user-ID,
set-group-ID, and sticky bits.)
These system calls differ only in how the file is specified:
.IP \[bu] 3
.BR chmod ()
changes the mode of the file specified whose pathname is given in
.IR path ,
which is dereferenced if it is a symbolic link.
.IP \[bu]
.BR fchmod ()
changes the mode of the file referred to by the open file descriptor
.IR fd .
.P
The new file mode is specified in
.IR mode ,
which is a bit mask created by ORing together zero or
more of the following:
.TP 18
.BR S_ISUID " (04000)"
set-user-ID (set process effective user ID on
.BR execve (2))
.TP
.BR S_ISGID " (02000)"
set-group-ID (set process effective group ID on
.BR execve (2);
mandatory locking, as described in
.BR fcntl (2);
take a new file's group from parent directory, as described in
.BR chown (2)
and
.BR mkdir (2))
.TP
.BR S_ISVTX " (01000)"
sticky bit (restricted deletion flag, as described in
.BR unlink (2))
.TP
.BR S_IRUSR " (00400)"
read by owner
.TP
.BR S_IWUSR " (00200)"
write by owner
.TP
.BR S_IXUSR " (00100)"
execute/search by owner ("search" applies for directories,
and means that entries within the directory can be accessed)
.TP
.BR S_IRGRP " (00040)"
read by group
.TP
.BR S_IWGRP " (00020)"
write by group
.TP
.BR S_IXGRP " (00010)"
execute/search by group
.TP
.BR S_IROTH " (00004)"
read by others
.TP
.BR S_IWOTH " (00002)"
write by others
.TP
.BR S_IXOTH " (00001)"
execute/search by others
.P
The effective UID of the calling process must match the owner of the file,
or the process must be privileged (Linux: it must have the
.B CAP_FOWNER
capability).
.P
If the calling process is not privileged (Linux: does not have the
.B CAP_FSETID
capability), and the group of the file does not match
the effective group ID of the process or one of its
supplementary group IDs, the
.B S_ISGID
bit will be turned off,
but this will not cause an error to be returned.
.P
As a security measure, depending on the filesystem,
the set-user-ID and set-group-ID execution bits
may be turned off if a file is written.
(On Linux, this occurs if the writing process does not have the
.B CAP_FSETID
capability.)
On some filesystems, only the superuser can set the sticky bit,
which may have a special meaning.
For the sticky bit, and for set-user-ID and set-group-ID bits on
directories, see
.BR inode (7).
.P
On NFS filesystems, restricting the permissions will immediately influence
already open files, because the access control is done on the server, but
open files are maintained by the client.
Widening the permissions may be
delayed for other clients if attribute caching is enabled on them.
.\"
.\"
.SS fchmodat()
The
.BR fchmodat ()
system call operates in exactly the same way as
.BR chmod (),
except for the differences described here.
.P
If
.I path
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 chmod ()
for a relative pathname).
.P
If
.I path
is relative and
.I dirfd
is the special value
.BR AT_FDCWD ,
then
.I path
is interpreted relative to the current working
directory of the calling process (like
.BR chmod ()).
.P
If
.I path
is absolute, then
.I dirfd
is ignored.
.P
.I flags
can either be 0, or include the following flags:
.TP
.BR AT_EMPTY_PATH " (since Linux 6.6)"
.\" commit 5daeb41a6fc9d0d81cb2291884b7410e062d8fa1
If
.I path
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 path
is a symbolic link, do not dereference it:
instead operate on the link itself.
.P
See
.BR openat (2)
for an explanation of the need for
.BR fchmodat ().
.SH RETURN VALUE
On success, zero is returned.
On error, \-1 is returned, and
.I errno
is set to indicate the error.
.SH ERRORS
Depending on the filesystem,
errors other than those listed below can be returned.
.P
The more general errors for
.BR chmod ()
are listed below:
.TP
.B EACCES
Search permission is denied on a component of the path prefix.
(See also
.BR path_resolution (7).)
.TP
.B EBADF
.RB ( fchmod ())
The file descriptor
.I fd
is not valid.
.TP
.B EBADF
.RB ( fchmodat ())
.I path
is relative but
.I dirfd
is neither
.B AT_FDCWD
nor a valid file descriptor.
.TP
.B EFAULT
.I path
points outside your accessible address space.
.TP
.B EINVAL
.RB ( fchmodat ())
Invalid flag specified in
.IR flags .
.TP
.B EIO
An I/O error occurred.
.TP
.B ELOOP
Too many symbolic links were encountered in resolving
.IR path .
.TP
.B ENAMETOOLONG
.I path
is too long.
.TP
.B ENOENT
The file does not exist.
.TP
.B ENOMEM
Insufficient kernel memory was available.
.TP
.B ENOTDIR
A component of the path prefix is not a directory.
.TP
.B ENOTDIR
.RB ( fchmodat ())
.I path
is relative and
.I dirfd
is a file descriptor referring to a file other than a directory.
.TP
.B ENOTSUP
.RB ( fchmodat ())
.I flags
specified
.BR AT_SYMLINK_NOFOLLOW ,
which is not supported.
.TP
.B EPERM
The effective UID does not match the owner of the file,
and the process is not privileged (Linux: it does not have the
.B CAP_FOWNER
capability).
.TP
.B EPERM
The file is marked immutable or append-only.
(See
.BR FS_IOC_SETFLAGS (2const).)
.TP
.B EROFS
The named file resides on a read-only filesystem.
.SH VERSIONS
.SS C library/kernel differences
The GNU C library
.BR fchmodat ()
wrapper function implements the POSIX-specified
interface described in this page.
This interface differs from the underlying Linux system call, which does
.I not
have a
.I flags
argument.
.SS glibc notes
On older kernels where
.BR fchmodat ()
is unavailable, the glibc wrapper function falls back to the use of
.BR chmod ().
When
.I path
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.
.SH STANDARDS
POSIX.1-2024.
.SH HISTORY
.TP
.BR chmod ()
.TQ
.BR fchmod ()
4.4BSD, SVr4, POSIX.1-2001.
.TP
.BR fchmodat ()
POSIX.1-2008.
Linux 2.6.16,
glibc 2.4.
.TP
.B AT_SYMLINK_NOFOLLOW
glibc 2.32,
Linux 6.5.
.SH SEE ALSO
.BR chmod (1),
.BR chown (2),
.BR execve (2),
.BR open (2),
.BR stat (2),
.BR inode (7),
.BR path_resolution (7),
.BR symlink (7)
|