blob: 2dc0c2683f1035f6d5939908d498c31dc96eb39a [file] [log] [blame]
<html lang="en">
<head>
<title>Testing File Access - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="File-Attributes.html#File-Attributes" title="File Attributes">
<link rel="prev" href="Setting-Permissions.html#Setting-Permissions" title="Setting Permissions">
<link rel="next" href="File-Times.html#File-Times" title="File Times">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Testing-File-Access"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="File-Times.html#File-Times">File Times</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Setting-Permissions.html#Setting-Permissions">Setting Permissions</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="File-Attributes.html#File-Attributes">File Attributes</a>
<hr>
</div>
<h4 class="subsection">14.9.8 Testing Permission to Access a File</h4>
<p><a name="index-testing-access-permission-1571"></a><a name="index-access_002c-testing-for-1572"></a><a name="index-setuid-programs-and-file-access-1573"></a>
In some situations it is desirable to allow programs to access files or
devices even if this is not possible with the permissions granted to the
user. One possible solution is to set the setuid-bit of the program
file. If such a program is started the <em>effective</em> user ID of the
process is changed to that of the owner of the program file. So to
allow write access to files like <samp><span class="file">/etc/passwd</span></samp>, which normally can
be written only by the super-user, the modifying program will have to be
owned by <code>root</code> and the setuid-bit must be set.
<p>But beside the files the program is intended to change the user should
not be allowed to access any file to which s/he would not have access
anyway. The program therefore must explicitly check whether <em>the
user</em> would have the necessary access to a file, before it reads or
writes the file.
<p>To do this, use the function <code>access</code>, which checks for access
permission based on the process's <em>real</em> user ID rather than the
effective user ID. (The setuid feature does not alter the real user ID,
so it reflects the user who actually ran the program.)
<p>There is another way you could check this access, which is easy to
describe, but very hard to use. This is to examine the file mode bits
and mimic the system's own access computation. This method is
undesirable because many systems have additional access control
features; your program cannot portably mimic them, and you would not
want to try to keep track of the diverse features that different systems
have. Using <code>access</code> is simple and automatically does whatever is
appropriate for the system you are using.
<p><code>access</code> is <em>only</em> only appropriate to use in setuid programs.
A non-setuid program will always use the effective ID rather than the
real ID.
<p><a name="index-unistd_002eh-1574"></a>The symbols in this section are declared in <samp><span class="file">unistd.h</span></samp>.
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Function: int <b>access</b> (<var>const char *filename, int how</var>)<var><a name="index-access-1575"></a></var><br>
<blockquote><p>The <code>access</code> function checks to see whether the file named by
<var>filename</var> can be accessed in the way specified by the <var>how</var>
argument. The <var>how</var> argument either can be the bitwise OR of the
flags <code>R_OK</code>, <code>W_OK</code>, <code>X_OK</code>, or the existence test
<code>F_OK</code>.
<p>This function uses the <em>real</em> user and group IDs of the calling
process, rather than the <em>effective</em> IDs, to check for access
permission. As a result, if you use the function from a <code>setuid</code>
or <code>setgid</code> program (see <a href="How-Change-Persona.html#How-Change-Persona">How Change Persona</a>), it gives
information relative to the user who actually ran the program.
<p>The return value is <code>0</code> if the access is permitted, and <code>-1</code>
otherwise. (In other words, treated as a predicate function,
<code>access</code> returns true if the requested access is <em>denied</em>.)
<p>In addition to the usual file name errors (see <a href="File-Name-Errors.html#File-Name-Errors">File Name Errors</a>), the following <code>errno</code> error conditions are defined for
this function:
<dl>
<dt><code>EACCES</code><dd>The access specified by <var>how</var> is denied.
<br><dt><code>ENOENT</code><dd>The file doesn't exist.
<br><dt><code>EROFS</code><dd>Write permission was requested for a file on a read-only file system.
</dl>
</p></blockquote></div>
<p>These macros are defined in the header file <samp><span class="file">unistd.h</span></samp> for use
as the <var>how</var> argument to the <code>access</code> function. The values
are integer constants.
<a name="index-unistd_002eh-1576"></a>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Macro: int <b>R_OK</b><var><a name="index-R_005fOK-1577"></a></var><br>
<blockquote><p>Flag meaning test for read permission.
</p></blockquote></div>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Macro: int <b>W_OK</b><var><a name="index-W_005fOK-1578"></a></var><br>
<blockquote><p>Flag meaning test for write permission.
</p></blockquote></div>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Macro: int <b>X_OK</b><var><a name="index-X_005fOK-1579"></a></var><br>
<blockquote><p>Flag meaning test for execute/search permission.
</p></blockquote></div>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Macro: int <b>F_OK</b><var><a name="index-F_005fOK-1580"></a></var><br>
<blockquote><p>Flag meaning test for existence of the file.
</p></blockquote></div>
</body></html>