* terms of the GNU Lesser General Public License
* (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
*
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
+ * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the US Government.
* Export of this program may require a license from the United States
* lee@sandia.gov
*/
-#if defined(AUTOMOUNT_FILE_NAME) && defined(__linux__)
-#define _BSD_SOURCE
-#endif
-
#include <stdlib.h>
#include <string.h>
#include <errno.h>
struct qstr *name,
struct pnode **pnop,
struct intent *intnt,
- const char *path)
+ const char *path,
+ int check_permissions)
{
int err;
struct pnode *pno;
if (!parent->p_base->pb_ino)
return -ENOTDIR;
- err = _sysio_permitted(parent->p_base->pb_ino, X_OK);
- if (err)
- return err;
+ /*
+ * Sometimes we don't want to check permissions. At initialization
+ * time, for instance.
+ */
+ if (check_permissions) {
+ err = _sysio_permitted(parent, X_OK);
+ if (err)
+ return err;
+ }
/*
* Short-circuit `.' and `..'; We don't cache those.
* ND_NOFOLLOW symbolic links are not followed
* ND_NEGOK if terminal/leaf does not exist, return
* path node (alias) anyway.
+ * ND_NOPERMCHECK do not check permissions
*/
int
_sysio_path_walk(struct pnode *parent, struct nameidata *nd)
parent = nd->nd_root;
}
-#if DEFER_INIT_CWD
+#ifdef DEFER_INIT_CWD
if (!parent) {
const char *icwd;
* except the last component.
*/
ND_INIT(&nameidata,
- (nd->nd_flags | ND_NEGOK),
+ nd->nd_flags,
lpath,
nd->nd_root,
!next.len ? nd->nd_intent : NULL);
&_sysio_mount_file_name,
&pno,
NULL,
- NULL);
+ NULL,
+ 1);
if (pno)
P_RELE(pno);
if (!err && _sysio_automount(pno) == 0) {
(path || !next.len)
? nd->nd_intent
: NULL,
- (path && next.len) ? path : NULL);
+ (path && next.len) ? path : NULL,
+ !(nd->nd_flags & ND_NOPERMCHECK));
if (err) {
if (err == -ENOENT &&
!next.len &&