Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
RENAME(2)		       System Calls Manual		       RENAME(2)

NAME
     rename -- change the name of a file

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <stdio.h>

     int
     rename(const char *from, const char *to);

     int
     renameat(int fromfd, const char *from, int tofd, const char *to);

     #include <sys/fcntl.h>
     #include <stdio.h>

     int
     renameat2(int fromfd, const char *from, int tofd, const char *to,
	 unsigned int flags);

DESCRIPTION
     The  rename()  system  call causes the link named from to be renamed as to.
     If to exists, it is first removed.  Both from and to must be  of  the  same
     type  (that  is, both directories or both non-directories), and must reside
     on the same file system.

     The rename() system call guarantees that if to already exists, an	instance
     of  to  will always exist, even if the system should crash in the middle of
     the operation.

     If the final component of from is a symbolic link, the symbolic link is re-
     named, not the file or directory to which it points.

     If from and to resolve to the same directory entry, or to different  direc-
     tory  entries  for the same existing file, rename() returns success without
     taking any further action.

     The renameat() system call is equivalent to rename()  except  in  the  case
     where  either  from or to specifies a relative path.  If from is a relative
     path, the file to be renamed is located relative to the  directory  associ-
     ated  with the file descriptor fromfd instead of the current working direc-
     tory.  If the to is a relative path, the same happens only relative to  the
     directory	associated  with  tofd.  If the renameat() is passed the special
     value AT_FDCWD in the fromfd or tofd parameter, the current working  direc-
     tory is used in the determination of the file for the respective path para-
     meter.

     The  renameat2()  system call takes an additional flags argument.	If flags
     is zero, the renameat2() call operates identically  to  renameat().   Addi-
     tionally, the following flags can be specified:

     AT_RENAME_NOREPLACE  If  the  path specified by tofd and to exists, the re-
			  quest fails with the error EEXIST.

RETURN VALUES
     The rename() 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 rename() system call will fail and neither of the argument  files  will
     be affected if:

     [ENAMETOOLONG]	A  component of either pathname exceeded 255 characters,
			or the entire length of either path name  exceeded  1023
			characters.

     [ENOENT]		A  component  of the from path does not exist, or a path
			prefix of to does not exist.

     [EACCES]		A component of either path prefix denies search  permis-
			sion.

     [EACCES]		The  requested link requires writing in a directory with
			a mode that denies write permission.

     [EACCES]		The directory pointed at by  the  from	argument  denies
			write permission, and the operation would move it to an-
			other parent directory.

     [EPERM]		The  file  pointed  at	by the from argument has its im-
			mutable, undeletable or append-only flag  set,	see  the
			chflags(2) manual page for more information.

     [EPERM]		The  parent directory of the file pointed at by the from
			argument has its immutable or append-only flag set.

     [EPERM]		The parent directory of the file pointed at  by  the  to
			argument has its immutable flag set.

     [EPERM]		The directory containing from is marked sticky, and nei-
			ther  the containing directory nor from are owned by the
			effective user ID.

     [EPERM]		The file pointed at by the to argument exists,	the  di-
			rectory  containing to is marked sticky, and neither the
			containing directory nor to are owned by  the  effective
			user ID.

     [ELOOP]		Too  many symbolic links were encountered in translating
			either pathname.

     [ENOTDIR]		A component of either path prefix is not a directory.

     [ENOTDIR]		The from argument is a directory, but to is not a direc-
			tory.

     [EISDIR]		The to argument is a directory, but from is not a direc-
			tory.

     [EXDEV]		The link named by to and the file named by from  are  on
			different  logical  devices  (file  systems).  Note that
			this error code will not be returned if the  implementa-
			tion permits cross-device links.

     [ENOSPC]		The directory in which the entry for the new name is be-
			ing  placed cannot be extended because there is no space
			left on the file system containing the directory.

     [EDQUOT]		The directory in which the entry for the new name is be-
			ing placed cannot be extended because the  user's  quota
			of  disk blocks on the file system containing the direc-
			tory has been exhausted.

     [EIO]		An I/O error occurred while making or updating a  direc-
			tory entry.

     [EINTEGRITY]	Corrupted  data was detected while reading from the file
			system.

     [EROFS]		The requested link requires writing in a directory on  a
			read-only file system.

     [EFAULT]		Path  points  outside  the  process's  allocated address
			space.

     [EINVAL]		The from argument is a parent directory of to, or an at-
			tempt is made to rename `.' or `..'.

     [EINVAL]		The last component of the to path is invalid on the tar-
			get file system.

     [ENOTEMPTY]	The to argument is a directory and is not empty.

     [ECAPMODE] 	rename() was called and the  process  is  in  capability
			mode.

     In addition to the errors returned by the rename(), the renameat() may fail
     if:

     [EBADF]		The  from argument does not specify an absolute path and
			the fromfd argument is neither AT_FDCWD nor a valid file
			descriptor open for searching, or the to  argument  does
			not  specify  an  absolute path and the tofd argument is
			neither AT_FDCWD nor a valid file  descriptor  open  for
			searching.

     [ENOTDIR]		The  from argument is not an absolute path and fromfd is
			neither AT_FDCWD nor a file descriptor associated with a
			directory, or the to argument is not  an  absolute  path
			and tofd is neither AT_FDCWD nor a file descriptor asso-
			ciated with a directory.

     [ECAPMODE] 	AT_FDCWD  is  specified and the process is in capability
			mode.

     [ENOTCAPABLE]	path is an absolute path or contained a  ".."  component
			leading  to a directory outside of the directory hierar-
			chy specified by fromfd or tofd.

     [ENOTCAPABLE]	The fromfd file descriptor lacks the CAP_RENAMEAT_SOURCE
			right,	or  the   tofd	 file	descriptor   lacks   the
			CAP_RENAMEAT_TARGET right.

     In  addition  to the errors returned by the renameat() system call, the re-
     nameat2() system call may fail if:

     [EEXIST]		The AT_RENAME_NOREPLACE flag was provided,  and  a  file
			exists at the path specified by to.

     [EOPNOTSUPP]	One  of  the  flags  specified	is  not supported by the
			filesystem where the to-be renamed file is located.

CAVEATS
     If the filesystem which owns the file to be renamed does not implement  the
     AT_RENAME_NOREPLACE  flag, it is possible that due to race with target file
     creation, the error returned by the renameat2() system call would	be  non-
     deterministically either EEXIST or EOPNOTSUPP.

SEE ALSO
     chflags(2), open(2), symlink(7)

STANDARDS
     The  rename()  system  call  is  expected to conform to ISO/IEC 9945-1:1996
     ("POSIX.1").  The renameat() system call follows The  Open  Group	Extended
     API Set 2 specification.

HISTORY
     The renameat() system call appeared in FreeBSD 8.0.  The renameat2() system
     call appeared in FreeBSD 16.0.

FreeBSD ports 15.quarterly	 August 25, 2024		       RENAME(2)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=renameat2&sektion=2&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help