+/* -------------------------- */
+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) {
+ LOG(log_debug, logtype_afpd, "of_stat('%s/%s': %s)",
+ cfrombstr(curdir->d_fullpath), path->u_name, strerror(errno));
+ path->st_errno = errno;
+ }
+
+ return ret;
+}
+
+
+#ifdef HAVE_ATFUNCS
+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_ATFUNCS */
+
+/* --------------------------
+ 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;
+ size_t len;
+ struct dir *dir;
+
+ 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 ? */
+ len = blength(path->d_dir->d_u_name);
+ if (len > (MAXPATHLEN - 3))
+ len = MAXPATHLEN - 3;
+ strncpy(pathname + 3, cfrombstr(path->d_dir->d_u_name), len + 1);
+
+ LOG(log_debug, logtype_afpd, "of_statdir: stating: '%s'", pathname);
+
+ if (!(ret = lstat(pathname, &path->st)))
+ return 0;
+
+ path->st_errno = errno;
+
+ /* hmm, can't stat curdir anymore */
+ if (errno == EACCES && (dir = dirlookup(vol, curdir->d_pdid))) {
+ if (movecwd(vol, dir))
+ return -1;
+ path->st_errno = 0;
+
+ if ((ret = lstat(cfrombstr(path->d_dir->d_u_name), &path->st)) < 0)
+ path->st_errno = errno;
+ }
+
+ return ret;
+}
+
+/* -------------------------- */
+struct ofork *of_findname(struct path *path)