chmod(2)
NAME
chmod, fchmod, lchmod - change mode of file
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <sys/stat.h> int chmod(const char *path, modet_mode); int fchmod(int fd, modet_mode); int lchmod(const char *path, modet_mode);
DESCRIPTION
- The file permission bits of the file named specified by path
- or referenced by the file descriptor fd are changed to mode. The
- chmod() system
call verifies that the process owner (user) either owns the - file specified by path (or fd), or is the super-user. The chmod()
- system call follows symbolic links to operate on the target of the link
- rather than the
link itself. - The lchmod() system call is similar to chmod() but does not
- follow symbolic links.
- A mode is created from or'd permission bit masks defined in
#define S_IRWXU 0000700 /* RWX mask for owner */
#define S_IRUSR 0000400 /* R for owner */
#define S_IWUSR 0000200 /* W for owner */
#define S_IXUSR 0000100 /* X for owner */- #define S_IRWXG 0000070 /* RWX mask for group */
#define S_IRGRP 0000040 /* R for group */
#define S_IWGRP 0000020 /* W for group */
#define S_IXGRP 0000010 /* X for group */ - #define S_IRWXO 0000007 /* RWX mask for other */
#define S_IROTH 0000004 /* R for other */
#define S_IWOTH 0000002 /* W for other */
#define S_IXOTH 0000001 /* X for other */ - #define S_ISUID 0004000 /* set user id on execution
- */
#define S_ISGID 0002000 /* set group id on execu - tion */
#ifndef BSD_VISIBLE
#define S_ISTXT 0001000 /* sticky bit */
#endif - The FreeBSD VM system totally ignores the sticky bit (ISTXT)
- for executables. On UFS-based file systems (FFS, LFS) the sticky bit
- may only be
set upon directories. - If mode ISTXT (the `sticky bit') is set on a directory, an
- unprivileged
user may not delete or rename files of other users in that - directory.
The sticky bit may be set by any user on a directory which - the user owns
or has appropriate permissions. For more details of the - properties of
the sticky bit, see sticky(8). - If mode ISUID (set UID) is set on a directory, and the
- MNT_SUIDDIR option
was used in the mount of the file system, then the owner of - any new files
and sub-directories created within this directory are set to - be the same
as the owner of that directory. If this function is en - abled, new directories will inherit the bit from their parents. Execute
- bits are removed
from the file, and it will not be given to root. This be - havior does not
change the requirements for the user to be allowed to write - the file, but
only the eventual owner after it has been created. Group - inheritance is
not affected. - This feature is designed for use on fileservers serving PC
- users via ftp,
SAMBA, or netatalk. It provides security holes for shell - users and as
such should not be used on shell machines, especially on - home directories. This option requires the SUIDDIR option in the kernel
- to work.
Only UFS file systems support this option. For more details - of the suiddir mount option, see mount(8).
- Writing or changing the owner of a file turns off the set
- user-id and
set-group-id bits unless the user is the super-user. This - makes the system somewhat more secure by protecting set-user-id (set
- group-id) files
from remaining set-user-id (set-group-id) if they are modi - fied, at the
expense of a degree of compatibility.
RETURN VALUES
- The function returns the value 0 if successful; otherwise
- the value -1 is
returned and the global variable errno is set to indicate - the error.
ERRORS
- The chmod() system call will fail and the file mode will be
- unchanged if:
- [ENOTDIR] A component of the path prefix is not a
- directory.
- [ENAMETOOLONG] A component of a pathname exceeded 255
- characters, or
- an entire path name exceeded 1023 charac
- ters.
- [ENOENT] The named file does not exist.
- [EACCES] Search permission is denied for a compo
- nent of the
- path prefix.
- [ELOOP] Too many symbolic links were encountered
- in translat
- ing the pathname.
- [EPERM] The effective user ID does not match the
- owner of the
- file and the effective user ID is not the
- super-user.
- [EROFS] The named file resides on a read-only
- file system.
- [EFAULT] The path argument points outside the pro
- cess's allo
- cated address space.
- [EIO] An I/O error occurred while reading from
- or writing to
- the file system.
- [EFTYPE] An attempt was made to set the sticky bit
- upon an exe
- cutable.
- The fchmod() system call will fail if:
- [EBADF] The descriptor is not valid.
- [EINVAL] The fd argument refers to a socket, not
- to a file.
- [EROFS] The file resides on a read-only file sys
- tem.
- [EIO] An I/O error occurred while reading from
- or writing to
- the file system.
SEE ALSO
chmod(1), chown(2), open(2), stat(2), sticky(8)
STANDARDS
- The chmod() system call is expected to conform to ISO/IEC
- 9945-1:1990
(``POSIX.1''), except for the return of EFTYPE and the use - of S_ISTXT.
HISTORY
- The chmod() function appeared in Version 7 AT&T UNIX. The
- fchmod() system call appeared in 4.2BSD. The lchmod() system call ap
- peared in
FreeBSD 3.0. - BSD December 29, 2004