* 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)
if (!parent) {
const char *icwd;
- if (!_sysio_init_cwd)
+ if (!_sysio_init_cwd && !nd->nd_root)
abort();
/*
- * Finally have to set the curretn working directory. We can
+ * Finally have to set the current working directory. We can
* not tolerate errors here or else risk leaving the process
* in a very unexpected location. We abort then unless all goes
* well.
*/
icwd = _sysio_init_cwd;
_sysio_init_cwd = NULL;
- if (_sysio_namei(NULL, icwd, 0, NULL, &parent) != 0 ||
- _sysio_p_chdir(parent) != 0)
+ parent = nd->nd_root;
+ if (!parent)
+ abort();
+ (void )_sysio_namei(nd->nd_root, icwd, 0, NULL, &parent);
+ if (_sysio_p_chdir(parent) != 0)
abort();
}
#endif
&_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 &&