summaryrefslogtreecommitdiffstats
path: root/man-pages-posix-2017/man3p/unlink.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man-pages-posix-2017/man3p/unlink.3p')
-rw-r--r--man-pages-posix-2017/man3p/unlink.3p455
1 files changed, 455 insertions, 0 deletions
diff --git a/man-pages-posix-2017/man3p/unlink.3p b/man-pages-posix-2017/man3p/unlink.3p
new file mode 100644
index 0000000..ee7069a
--- /dev/null
+++ b/man-pages-posix-2017/man3p/unlink.3p
@@ -0,0 +1,455 @@
+'\" et
+.TH UNLINK "3P" 2017 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\"
+.SH PROLOG
+This manual page is part of the POSIX Programmer's Manual.
+The Linux implementation of this interface may differ (consult
+the corresponding Linux manual page for details of Linux behavior),
+or the interface may not be implemented on Linux.
+.\"
+.SH NAME
+unlink, unlinkat
+\(em remove a directory entry
+.SH SYNOPSIS
+.LP
+.nf
+#include <unistd.h>
+.P
+int unlink(const char *\fIpath\fP);
+.P
+#include <fcntl.h>
+.P
+int unlinkat(int \fIfd\fP, const char *\fIpath\fP, int \fIflag\fP);
+.fi
+.SH DESCRIPTION
+The
+\fIunlink\fR()
+function shall remove a link to a file. If
+.IR path
+names a symbolic link,
+\fIunlink\fR()
+shall remove the symbolic link named by
+.IR path
+and shall not affect any file or directory named by the contents of the
+symbolic link. Otherwise,
+\fIunlink\fR()
+shall remove the link named by the pathname pointed to by
+.IR path
+and shall decrement the link count of the file referenced by the link.
+.P
+When the file's link count becomes 0 and no process has the file open,
+the space occupied by the file shall be freed and the file shall no
+longer be accessible. If one or more processes have the file open when
+the last link is removed, the link shall be removed before
+\fIunlink\fR()
+returns, but the removal of the file contents shall be postponed until
+all references to the file are closed.
+.P
+The
+.IR path
+argument shall not name a directory unless the process has appropriate
+privileges and the implementation supports using
+\fIunlink\fR()
+on directories.
+.P
+Upon successful completion,
+\fIunlink\fR()
+shall mark for update the last data modification and last file status
+change timestamps of the parent directory. Also, if the file's link
+count is not 0, the last file status change timestamp of the file shall
+be marked for update.
+.P
+The
+\fIunlinkat\fR()
+function shall be equivalent to the
+\fIunlink\fR()
+or
+\fIrmdir\fR()
+function except in the case where
+.IR path
+specifies a relative path. In this case the directory entry to be
+removed is determined relative to the directory associated with the
+file descriptor
+.IR fd
+instead of the current working directory. If the access mode of the
+open file description associated with the file descriptor is not
+O_SEARCH, the function shall check whether directory searches are
+permitted using the current permissions of the directory underlying
+the file descriptor. If the access mode is O_SEARCH, the function
+shall not perform the check.
+.P
+Values for
+.IR flag
+are constructed by a bitwise-inclusive OR of flags from the following
+list, defined in
+.IR <fcntl.h> :
+.IP AT_REMOVEDIR 6
+.br
+Remove the directory entry specified by
+.IR fd
+and
+.IR path
+as a directory, not a normal file.
+.P
+If
+\fIunlinkat\fR()
+is passed the special value AT_FDCWD in the
+.IR fd
+parameter, the current working directory shall be used and the behavior
+shall be identical to a call to
+\fIunlink\fR()
+or
+\fIrmdir\fR()
+respectively, depending on whether or not the AT_REMOVEDIR bit is set in
+.IR flag .
+.SH "RETURN VALUE"
+Upon successful completion, these functions shall return 0. Otherwise,
+these functions shall return \-1 and set
+.IR errno
+to indicate the error. If \-1 is returned, the named file shall not
+be changed.
+.SH ERRORS
+These functions shall fail and shall not unlink the file if:
+.TP
+.BR EACCES
+Search permission is denied for a component of the path prefix, or
+write permission is denied on the directory containing the directory
+entry to be removed.
+.TP
+.BR EBUSY
+The file named by the
+.IR path
+argument cannot be unlinked because it is being used by the system or
+another process and the implementation considers this an error.
+.TP
+.BR ELOOP
+A loop exists in symbolic links encountered during resolution of the
+.IR path
+argument.
+.TP
+.BR ENAMETOOLONG
+.br
+The length of a component of a pathname is longer than
+{NAME_MAX}.
+.TP
+.BR ENOENT
+A component of
+.IR path
+does not name an existing file or
+.IR path
+is an empty string.
+.TP
+.BR ENOTDIR
+A component of the path prefix names an existing file that is neither
+a directory nor a symbolic link to a directory, or the
+.IR path
+argument contains at least one non-\c
+<slash>
+character and ends with one or more trailing
+<slash>
+characters and the last pathname component names an existing file
+that is neither a directory nor a symbolic link to a directory.
+.TP
+.BR EPERM
+The file named by
+.IR path
+is a directory, and either the calling process does not have
+appropriate privileges, or the implementation prohibits using
+\fIunlink\fR()
+on directories.
+.TP
+.BR EPERM " or " EACCES
+.br
+The S_ISVTX flag is set on the directory containing the file referred
+to by the
+.IR path
+argument and the process does not satisfy the criteria specified in the Base Definitions volume of POSIX.1\(hy2017,
+.IR "Section 4.3" ", " "Directory Protection".
+.TP
+.BR EROFS
+The directory entry to be unlinked is part of a read-only file system.
+.P
+The
+\fIunlinkat\fR()
+function shall fail if:
+.TP
+.BR EACCES
+The access mode of the open file description associated with
+.IR fd
+is not O_SEARCH and the permissions of the directory underlying
+.IR fd
+do not permit directory searches.
+.TP
+.BR EBADF
+The
+.IR path
+argument does not specify an absolute path and the
+.IR fd
+argument is neither AT_FDCWD nor a valid file descriptor open for reading
+or searching.
+.TP
+.BR ENOTDIR
+The
+.IR path
+argument is not an absolute path and
+.IR fd
+is a file descriptor associated with a non-directory file.
+.TP
+.BR EEXIST " or " ENOTEMPTY
+.br
+The
+.IR flag
+parameter has the AT_REMOVEDIR bit set and the
+.IR path
+argument names a directory that is not an empty directory, or there are
+hard links to the directory other than dot or a single entry in dot-dot.
+.TP
+.BR ENOTDIR
+The
+.IR flag
+parameter has the AT_REMOVEDIR bit set and
+.IR path
+does not name a directory.
+.P
+These functions may fail and not unlink the file if:
+.TP
+.BR EBUSY
+The file named by
+.IR path
+is a named STREAM.
+.TP
+.BR ELOOP
+More than
+{SYMLOOP_MAX}
+symbolic links were encountered during resolution of the
+.IR path
+argument.
+.TP
+.BR ENAMETOOLONG
+.br
+The length of a pathname exceeds
+{PATH_MAX},
+or pathname resolution of a symbolic link produced an intermediate
+result with a length that exceeds
+{PATH_MAX}.
+.TP
+.BR ETXTBSY
+The entry to be unlinked is the last directory entry to a pure
+procedure (shared text) file that is being executed.
+.br
+.P
+The
+\fIunlinkat\fR()
+function may fail if:
+.TP
+.BR EINVAL
+The value of the
+.IR flag
+argument is not valid.
+.LP
+.IR "The following sections are informative."
+.SH EXAMPLES
+.SS "Removing a Link to a File"
+.P
+The following example shows how to remove a link to a file named
+.BR /home/cnd/mod1
+by removing the entry named
+.BR /modules/pass1 .
+.sp
+.RS 4
+.nf
+
+#include <unistd.h>
+.P
+char *path = "/modules/pass1";
+int status;
+\&...
+status = unlink(path);
+.fi
+.P
+.RE
+.SS "Checking for an Error"
+.P
+The following example fragment creates a temporary password lock file
+named
+.BR LOCKFILE ,
+which is defined as
+.BR /etc/ptmp ,
+and gets a file descriptor for it. If the file cannot be opened for
+writing,
+\fIunlink\fR()
+is used to remove the link between the file descriptor and
+.BR LOCKFILE .
+.sp
+.RS 4
+.nf
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/stat.h>
+.P
+#define LOCKFILE "/etc/ptmp"
+.P
+int pfd; /* Integer for file descriptor returned by open call. */
+FILE *fpfd; /* File pointer for use in putpwent(). */
+\&...
+/* Open password Lock file. If it exists, this is an error. */
+if ((pfd = open(LOCKFILE, O_WRONLY| O_CREAT | O_EXCL, S_IRUSR
+ | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
+ fprintf(stderr, "Cannot open /etc/ptmp. Try again later.\en");
+ exit(1);
+}
+.P
+/* Lock file created; proceed with fdopen of lock file so that
+ putpwent() can be used.
+ */
+if ((fpfd = fdopen(pfd, "w")) == NULL) {
+ close(pfd);
+ unlink(LOCKFILE);
+ exit(1);
+}
+.fi
+.P
+.RE
+.SS "Replacing Files"
+.P
+The following example fragment uses
+\fIunlink\fR()
+to discard links to files, so that they can be replaced with new
+versions of the files. The first call removes the link to
+.BR LOCKFILE
+if an error occurs. Successive calls remove the links to
+.BR SAVEFILE
+and
+.BR PASSWDFILE
+so that new links can be created, then removes the link to
+.BR LOCKFILE
+when it is no longer needed.
+.sp
+.RS 4
+.nf
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/stat.h>
+.P
+#define LOCKFILE "/etc/ptmp"
+#define PASSWDFILE "/etc/passwd"
+#define SAVEFILE "/etc/opasswd"
+\&...
+/* If no change was made, assume error and leave passwd unchanged. */
+if (!valid_change) {
+ fprintf(stderr, "Could not change password for user %s\en", user);
+ unlink(LOCKFILE);
+ exit(1);
+}
+.P
+/* Change permissions on new password file. */
+chmod(LOCKFILE, S_IRUSR | S_IRGRP | S_IROTH);
+.P
+/* Remove saved password file. */
+unlink(SAVEFILE);
+.P
+/* Save current password file. */
+link(PASSWDFILE, SAVEFILE);
+.P
+/* Remove current password file. */
+unlink(PASSWDFILE);
+.P
+/* Save new password file as current password file. */
+link(LOCKFILE,PASSWDFILE);
+.P
+/* Remove lock file. */
+unlink(LOCKFILE);
+.P
+exit(0);
+.fi
+.P
+.RE
+.SH "APPLICATION USAGE"
+Applications should use
+\fIrmdir\fR()
+to remove a directory.
+.SH RATIONALE
+Unlinking a directory is restricted to the superuser
+in many historical implementations for reasons given in
+\fIlink\fR()
+(see also
+\fIrename\fR()).
+.P
+The meaning of
+.BR [EBUSY]
+in historical implementations is ``mount point busy''. Since this volume of POSIX.1\(hy2017 does
+not cover the system administration concepts of mounting and unmounting,
+the description of the error was changed to ``resource busy''. (This
+meaning is used by some device drivers when a second process tries to
+open an exclusive use device.) The wording is also intended to allow
+implementations to refuse to remove a directory if it is the root or
+current working directory of any process.
+.P
+The standard developers reviewed TR 24715\(hy2006 and noted that
+LSB-conforming implementations may return
+.BR [EISDIR]
+instead of
+.BR [EPERM]
+when unlinking a directory. A change to permit this behavior by
+changing the requirement for
+.BR [EPERM]
+to
+.BR [EPERM]
+or
+.BR [EISDIR]
+was considered, but decided against since it would break existing
+strictly conforming and conforming applications. Applications written
+for portability to both POSIX.1\(hy2008 and the LSB should be prepared to
+handle either error code.
+.P
+The purpose of the
+\fIunlinkat\fR()
+function is to remove directory entries in directories other than the
+current working directory without exposure to race conditions. Any part
+of the path of a file could be changed in parallel to a call to
+\fIunlink\fR(),
+resulting in unspecified behavior. By opening a file descriptor for
+the target directory and using the
+\fIunlinkat\fR()
+function it can be guaranteed that the removed directory entry is
+located relative to the desired directory.
+.SH "FUTURE DIRECTIONS"
+None.
+.SH "SEE ALSO"
+.IR "\fIclose\fR\^(\|)",
+.IR "\fIlink\fR\^(\|)",
+.IR "\fIremove\fR\^(\|)",
+.IR "\fIrename\fR\^(\|)",
+.IR "\fIrmdir\fR\^(\|)",
+.IR "\fIsymlink\fR\^(\|)"
+.P
+The Base Definitions volume of POSIX.1\(hy2017,
+.IR "Section 4.3" ", " "Directory Protection",
+.IR "\fB<fcntl.h>\fP",
+.IR "\fB<unistd.h>\fP"
+.\"
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1-2017, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 7, 2018 Edition,
+Copyright (C) 2018 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group.
+In the event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
+.PP
+Any typographical or formatting errors that appear
+in this page are most likely
+to have been introduced during the conversion of the source files to
+man page format. To report such errors, see
+https://www.kernel.org/doc/man-pages/reporting_bugs.html .