+/* -------------------------- */
+int of_stat (struct path *path)
+{
+int ret;
+ path->st_errno = 0;
+ path->st_valid = 1;
+ if ((ret = lstat(path->u_name, &path->st)) < 0)
+ path->st_errno = errno;
+ return ret;
+}
+
+#ifdef HAVE_RENAMEAT
+int of_fstatat(int dirfd, struct path *path)
+{
+ int ret;
+
+ path->st_errno = 0;
+ path->st_valid = 1;
+
+ if ((ret = fstatat(dirfd, path->u_name, &path->st, AT_SYMLINK_NOFOLLOW)) < 0)
+ path->st_errno = errno;
+
+ return ret;
+}
+#endif /* HAVE_RENAMEAT */
+
+/* --------------------------
+ stat the current directory.
+ stat(".") works even if "." is deleted thus
+ we have to stat ../name because we want to know if it's there
+*/
+int of_statdir (struct vol *vol, struct path *path)
+{
+static char pathname[ MAXPATHLEN + 1] = "../";
+int ret;
+
+ if (*path->m_name) {
+ /* not curdir */
+ return of_stat (path);
+ }
+ path->st_errno = 0;
+ path->st_valid = 1;
+ /* FIXME, what about: we don't have r-x perm anymore ? */
+ strlcpy(pathname +3, path->d_dir->d_u_name, sizeof (pathname) -3);
+
+ if (!(ret = lstat(pathname, &path->st)))
+ return 0;
+
+ path->st_errno = errno;
+ /* hmm, can't stat curdir anymore */
+ if (errno == EACCES && curdir->d_parent ) {
+ if (movecwd(vol, curdir->d_parent))
+ return -1;
+ path->st_errno = 0;
+ if ((ret = lstat(path->d_dir->d_u_name, &path->st)) < 0)
+ path->st_errno = errno;
+ }
+ return ret;
+}
+
+/* -------------------------- */
+struct ofork *of_findname(struct path *path)