All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark Hatle <mark.hatle@kernel.crashing.org>
To: yocto-patches@lists.yoctoproject.org
Subject: [pseudo][PATCH 05/34] ports: Remove PSEUDO_NO_REAL_AT_FUNCTIONS
Date: Tue, 10 Nov 2026 22:20:33 -0600	[thread overview]
Message-ID: <1794370862-30908-6-git-send-email-mark.hatle@kernel.crashing.org> (raw)
In-Reply-To: <1794370862-30908-1-git-send-email-mark.hatle@kernel.crashing.org>

From: Mark Hatle <mark.hatle@amd.com>

PSEUDO_NO_REAL_AT_FUNCTIONS was defined, along with substitute AT_FDCWD
and AT_SYMLINK_* values, when <fcntl.h> did not provide AT_FDCWD.  The
guts then used non-*at() fallbacks, or failed with ENOSYS when given a
directory descriptor.

Linux always provides the *at() functions, and pseudo.h includes
<fcntl.h>, so the macro is never defined and none of the fallbacks are
ever built.  Remove them, keeping the *at() code, and make a missing
AT_FDCWD a build error instead.

AI-Generated: Uses GitHub Copilot
Signed-off-by: Mark Hatle <mark.hatle@amd.com>
---
 ports/linux/guts/__fxstatat.c      | 12 ------------
 ports/linux/guts/__fxstatat64.c    | 14 --------------
 ports/linux/guts/__xmknodat.c      | 17 -----------------
 ports/linux/guts/openat.c          | 35 -----------------------------------
 ports/linux/openat2/guts/openat2.c | 28 ++--------------------------
 ports/unix/guts/faccessat2.c       | 12 ------------
 ports/unix/guts/fchmodat.c         | 18 ------------------
 ports/unix/guts/fchownat.c         | 12 ------------
 ports/unix/guts/linkat.c           | 11 -----------
 ports/unix/guts/mkdirat.c          | 17 -----------------
 ports/unix/guts/mkfifoat.c         | 22 ----------------------
 ports/unix/guts/mknodat.c          | 17 -----------------
 ports/unix/guts/readlinkat.c       |  8 --------
 ports/unix/guts/renameat.c         | 12 ------------
 ports/unix/guts/symlinkat.c        | 12 ------------
 ports/unix/guts/unlinkat.c         | 25 -------------------------
 pseudo.h                           | 19 ++++++-------------
 17 files changed, 8 insertions(+), 283 deletions(-)

diff --git a/ports/linux/guts/__fxstatat.c b/ports/linux/guts/__fxstatat.c
index 23dfa73..99198f7 100644
--- a/ports/linux/guts/__fxstatat.c
+++ b/ports/linux/guts/__fxstatat.c
@@ -11,19 +11,7 @@
 
 	struct stat64 buf64;
 	/* populate buffer with complete data */
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	if (flags & AT_SYMLINK_NOFOLLOW) {
-		rc = real___lxstat(ver, path, buf);
-	} else {
-		rc = real___xstat(ver, path, buf);
-	}
-#else
 	real___fxstatat(ver, dirfd, path, buf, flags);
-#endif
 	/* obtain fake data */
 	rc = wrap___fxstatat64(ver, dirfd, path, &buf64, flags);
 	/* overwrite */
diff --git a/ports/linux/guts/__fxstatat64.c b/ports/linux/guts/__fxstatat64.c
index ecf2952..6f58aa2 100644
--- a/ports/linux/guts/__fxstatat64.c
+++ b/ports/linux/guts/__fxstatat64.c
@@ -11,27 +11,13 @@
 	pseudo_msg_t *msg;
 	int save_errno;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-#endif
 	if (flags & AT_SYMLINK_NOFOLLOW) {
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		rc = real___lxstat64(ver, path, buf);
-#else
 		rc = real___fxstatat64(ver, dirfd, path, buf, flags);
-#endif
 		if (rc == -1) {
 			return rc;
 		}
 	} else {
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		rc = real___xstat64(ver, path, buf);
-#else
 		rc = real___fxstatat64(ver, dirfd, path, buf, flags);
-#endif
 		if (rc == -1) {
 			return rc;
 		}
diff --git a/ports/linux/guts/__xmknodat.c b/ports/linux/guts/__xmknodat.c
index 8c34427..84d535b 100644
--- a/ports/linux/guts/__xmknodat.c
+++ b/ports/linux/guts/__xmknodat.c
@@ -23,15 +23,7 @@
 	/* we don't use underlying call, so _ver is irrelevant to us */
 	(void) ver;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	rc = real___xstat64(_STAT_VER, path, &buf);
-#else
 	rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
-#endif
 	if (rc != -1) {
 		/* if we can stat the file, you can't mknod it */
 		errno = EEXIST;
@@ -41,13 +33,8 @@
 		errno = EINVAL;
 		return -1;
 	}
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	rc = real_open(path, O_CREAT | O_WRONLY | O_EXCL,
-		PSEUDO_FS_MODE(mode, 0));
-#else
 	rc = real_openat(dirfd, path, O_CREAT | O_WRONLY | O_EXCL,
 		PSEUDO_FS_MODE(mode, 0));
-#endif
 	if (rc == -1) {
 		return -1;
 	}
@@ -73,11 +60,7 @@
 	}
 	if (rc == -1) {
 		int save_errno = errno;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		real_unlink(path);
-#else
 		real_unlinkat(dirfd, path, AT_SYMLINK_NOFOLLOW);
-#endif
 		errno = save_errno;
 	}
 
diff --git a/ports/linux/guts/openat.c b/ports/linux/guts/openat.c
index 4fd83dd..f5469e6 100644
--- a/ports/linux/guts/openat.c
+++ b/ports/linux/guts/openat.c
@@ -17,13 +17,6 @@
 	/* mask out mode bits appropriately */
 	mode = mode & ~pseudo_umask;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-#endif
-
 #ifdef PSEUDO_FORCE_ASYNC
         /* Yes, I'm aware that every Linux system I've seen has
          * DSYNC and RSYNC being the same value as SYNC.
@@ -54,15 +47,7 @@
 	/* note "else" in #ifdef O_TMPFILE above */
 	if (flags & O_CREAT) {
 		save_errno = errno;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		if (flags & O_NOFOLLOW) {
-			rc = real___lxstat64(_STAT_VER, path, &buf);
-		} else {
-			rc = real___xstat64(_STAT_VER, path, &buf);
-		}
-#else
 		rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf, (flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
-#endif
 		existed = (rc != -1);
 		if (!existed)
 			pseudo_debug(PDBGF_FILE, "openat_creat: %s -> 0%o\n", path, mode);
@@ -75,15 +60,7 @@
 	 */
 	if (!(flags & O_NONBLOCK) && ((flags & (O_WRONLY | O_RDONLY | O_RDWR)) != O_RDWR)) {
 		save_errno = errno;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		if (flags & O_NOFOLLOW) {
-			rc = real___lxstat64(_STAT_VER, path, &buf);
-		} else {
-			rc = real___xstat64(_STAT_VER, path, &buf);
-		}
-#else
 		rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf, (flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
-#endif
 		if (rc != -1 && S_ISFIFO(buf.st_mode)) {
 			overly_magic_nonblocking = 1;
 		}
@@ -99,11 +76,7 @@
 	 * is if a file is going to be created, in which case it's
 	 * not a directory.
 	 */
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	rc = real_open(path, flags, PSEUDO_FS_MODE(mode, 0));
-#else
 	rc = real_openat(dirfd, path, flags, PSEUDO_FS_MODE(mode, 0));
-#endif
 	if (overly_magic_nonblocking) {
 		save_errno = errno;
 		sigprocmask(SIG_SETMASK, &local_saved_sigmask, NULL);
@@ -132,15 +105,7 @@
 			return rc;
 		}
 #endif
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		if (flags & O_NOFOLLOW) {
-			stat_rc = real___lxstat64(_STAT_VER, path, &buf);
-		} else {
-			stat_rc = real___xstat64(_STAT_VER, path, &buf);
-		}
-#else
 		stat_rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf, (flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
-#endif
 
 		pseudo_debug(PDBGF_FILE, "openat(path %s), flags %o, stat rc %d, stat mode %o\n",
 			path, flags, stat_rc, buf.st_mode);
diff --git a/ports/linux/openat2/guts/openat2.c b/ports/linux/openat2/guts/openat2.c
index 06fcec8..5171647 100644
--- a/ports/linux/openat2/guts/openat2.c
+++ b/ports/linux/openat2/guts/openat2.c
@@ -44,7 +44,7 @@
 	/* mask out mode bits appropriately */
 	my_how.mode = my_how.mode & ~pseudo_umask;
 
-#if defined(PSEUDO_NO_REAL_AT_FUNCTIONS) || ! defined(SYS_openat2)
+#ifndef SYS_openat2
 	if (dirfd != AT_FDCWD) {
 		errno = ENOSYS;
 		return -1;
@@ -81,15 +81,7 @@
 	/* note "else" in #ifdef O_TMPFILE above */
 	if (my_how.flags & O_CREAT) {
 		save_errno = errno;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		if (my_how.flags & O_NOFOLLOW) {
-			rc = real___lxstat64(_STAT_VER, pseudo_path, &buf);
-		} else {
-			rc = real___xstat64(_STAT_VER, pseudo_path, &buf);
-		}
-#else
 		rc = real___fxstatat64(_STAT_VER, dirfd, pseudo_path, &buf, (my_how.flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
-#endif
 		existed = (rc != -1);
 		if (!existed)
 			pseudo_debug(PDBGF_FILE, "openat2_creat: %s -> 0%lld\n", pseudo_path, my_how.mode);
@@ -102,15 +94,7 @@
 	 */
 	if (!(my_how.flags & O_NONBLOCK) && ((my_how.flags & (O_WRONLY | O_RDONLY | O_RDWR)) != O_RDWR)) {
 		save_errno = errno;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		if (my_how.flags & O_NOFOLLOW) {
-			rc = real___lxstat64(_STAT_VER, pseudo_path, &buf);
-		} else {
-			rc = real___xstat64(_STAT_VER, pseudo_path, &buf);
-		}
-#else
 		rc = real___fxstatat64(_STAT_VER, dirfd, pseudo_path, &buf, (my_how.flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
-#endif
 		if (rc != -1 && S_ISFIFO(buf.st_mode)) {
 			overly_magic_nonblocking = 1;
 		}
@@ -126,7 +110,7 @@
 	 * is if a file is going to be created, in which case it's
 	 * not a directory.
 	 */
-#if defined(PSEUDO_NO_REAL_AT_FUNCTIONS) || ! defined(SYS_openat2)
+#ifndef SYS_openat2
 	pseudo_debug(PDBGF_SYSCALL, "openat2, calling open.\n");
 	rc = real_open(path, my_how.flags, PSEUDO_FS_MODE(my_how.mode, 0));
 #else
@@ -167,15 +151,7 @@
 			return rc;
 		}
 #endif
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		if (my_how.flags & O_NOFOLLOW) {
-			stat_rc = real___lxstat64(_STAT_VER, pseudo_path, &buf);
-		} else {
-			stat_rc = real___xstat64(_STAT_VER, pseudo_path, &buf);
-		}
-#else
 		stat_rc = real___fxstatat64(_STAT_VER, dirfd, pseudo_path, &buf, (my_how.flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
-#endif
 
 		pseudo_debug(PDBGF_FILE, "openat2(path %s), flags %lld, stat rc %d, stat mode %o\n",
 			pseudo_path, my_how.flags, stat_rc, buf.st_mode);
diff --git a/ports/unix/guts/faccessat2.c b/ports/unix/guts/faccessat2.c
index 1283cc6..d4a2a42 100644
--- a/ports/unix/guts/faccessat2.c
+++ b/ports/unix/guts/faccessat2.c
@@ -10,19 +10,7 @@
  */
 	PSEUDO_STATBUF buf;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	if (flags & AT_SYMLINK_NOFOLLOW) {
-		rc = base_lstat(path, &buf);
-	} else {
-		rc = base_stat(path, &buf);
-	}
-#else
 	rc = base_fstatat(dirfd, path, &buf, flags & AT_SYMLINK_NOFOLLOW);
-#endif
 	if (rc == -1)
 		return rc;
 
diff --git a/ports/unix/guts/fchmodat.c b/ports/unix/guts/fchmodat.c
index 5a31151..12dc9e3 100644
--- a/ports/unix/guts/fchmodat.c
+++ b/ports/unix/guts/fchmodat.c
@@ -11,19 +11,7 @@
 	PSEUDO_STATBUF buf;
 	int save_errno = errno;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	if (flags & AT_SYMLINK_NOFOLLOW) {
-	    rc = base_lstat(path, &buf);
-	} else {
-	    rc = base_stat(path, &buf);
-	}
-#else
 	rc = base_fstatat(dirfd, path, &buf, flags);
-#endif
 	if (rc == -1) {
 		return rc;
 	}
@@ -50,13 +38,7 @@
 #endif
 
 	/* user bits added so "root" can always access files. */
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	/* note:  if path was a symlink, and AT_SYMLINK_NOFOLLOW was
-	 * specified, we already bailed previously. */
-	real_chmod(path, PSEUDO_FS_MODE(mode, S_ISDIR(buf.st_mode)));
-#else
 	rc = real_fchmodat(dirfd, path, PSEUDO_FS_MODE(mode, S_ISDIR(buf.st_mode)), flags);
-#endif
 	/* we otherwise ignore failures from underlying fchmod, because pseudo
 	 * may believe you are permitted to change modes that the filesystem
 	 * doesn't. Note that we also don't need to know whether the
diff --git a/ports/unix/guts/fchownat.c b/ports/unix/guts/fchownat.c
index 76d276a..3af774f 100644
--- a/ports/unix/guts/fchownat.c
+++ b/ports/unix/guts/fchownat.c
@@ -12,19 +12,7 @@
 	PSEUDO_STATBUF buf;
 	int save_errno = errno;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	if (flags & AT_SYMLINK_NOFOLLOW) {
-		rc = base_lstat(path, &buf);
-	} else {
-		rc = base_stat(path, &buf);
-	}
-#else
 	rc = base_fstatat(dirfd, path, &buf, flags);
-#endif
 	if (rc == -1) {
 		return rc;
 	}
diff --git a/ports/unix/guts/linkat.c b/ports/unix/guts/linkat.c
index f0cedd4..e22d66a 100644
--- a/ports/unix/guts/linkat.c
+++ b/ports/unix/guts/linkat.c
@@ -27,12 +27,6 @@
 	
 	rflags = (flags & AT_SYMLINK_FOLLOW) ? 0 : AT_SYMLINK_NOFOLLOW;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (olddirfd != AT_FDCWD || newdirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-#endif
 	oldpath = oldname;
 	if (oldpath && *oldpath && pseudo_chroot_len && !strncmp(oldpath, pseudo_chroot, pseudo_chroot_len) &&
 		oldpath[pseudo_chroot_len] == '/') {
@@ -54,11 +48,6 @@
 	 */
 #ifdef O_TMPFILE
 	if (!strncmp(oldpath, "/proc/self/fd/", 14) && (flags & AT_SYMLINK_FOLLOW)) {
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		/* only linkat() lets you do this horrible thing */
-		errno = ENOSYS;
-		return -1;
-#endif
 		tmpfile_fd = pseudo_atoi_wrapper(oldpath + 14);
 		// call actual link
 		rc = real_linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, AT_SYMLINK_FOLLOW);
diff --git a/ports/unix/guts/mkdirat.c b/ports/unix/guts/mkdirat.c
index f66e99a..4db3826 100644
--- a/ports/unix/guts/mkdirat.c
+++ b/ports/unix/guts/mkdirat.c
@@ -10,34 +10,17 @@
  */
 	/* mask out mode bits appropriately */
 	mode = mode & ~pseudo_umask;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-
-	rc = real_mkdir(path, PSEUDO_FS_MODE(mode, 1));
-#else
 	rc = real_mkdirat(dirfd, path, PSEUDO_FS_MODE(mode, 1));
-#endif
 	if (rc != -1) {
 		PSEUDO_STATBUF buf;
 		int stat_rc;
 		int save_errno = errno;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		stat_rc = base_lstat(path, &buf);
-#else
 		stat_rc = base_fstatat(dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
-#endif
 		if (stat_rc != -1) {
 			buf.st_mode = PSEUDO_DB_MODE(buf.st_mode, mode);
 			pseudo_client_op(OP_MKDIR, 0, -1, dirfd, path, &buf);
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-			real_fchmod(path, PSEUDO_FS_MODE(mode, 1));
-#else
 			real_fchmodat(dirfd, path, PSEUDO_FS_MODE(mode, 1), 0);
-#endif
 		} else {
 			pseudo_debug(PDBGF_OP, "mkdir of %s succeeded, but stat failed: %s\n",
 				path, strerror(errno));
diff --git a/ports/unix/guts/mkfifoat.c b/ports/unix/guts/mkfifoat.c
index bc547eb..c068841 100644
--- a/ports/unix/guts/mkfifoat.c
+++ b/ports/unix/guts/mkfifoat.c
@@ -16,29 +16,12 @@
 	/* mask out mode bits appropriately */
 	mode = mode & ~pseudo_umask;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	rc = base_stat(path, &buf);
-#else
 	rc = base_fstatat(dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
-#endif
 	if (rc != -1) {
 		/* if we can stat the file, you can't mkfifo it */
 		errno = EEXIST;
 		return -1;
 	}
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	rc = real_mkfifo(path, PSEUDO_FS_MODE(mode, 0));
-	if (rc == -1) {
-		return -1;
-	}
-	save_errno = errno;
-	rc = base_stat(path, &buf);
-	real_chmod(path, PSEUDO_FS_MODE(mode, 0));
-#else
 	rc = real_mkfifoat(dirfd, path, PSEUDO_FS_MODE(mode, 0));
 	if (rc == -1) {
 		return -1;
@@ -46,7 +29,6 @@
 	save_errno = errno;
 	rc = base_fstatat(dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
 	real_fchmodat(dirfd, path, PSEUDO_FS_MODE(mode, 0), 0);
-#endif
 	/* if the stat failed, we are going to give up and nuke
 	 * any file we may have created, and hope for the best.
 	 */
@@ -67,11 +49,7 @@
 	}
 	if (rc == -1) {
                 save_errno = errno;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		real_unlink(path);
-#else
 		real_unlinkat(dirfd, path, AT_SYMLINK_NOFOLLOW);
-#endif
 		errno = save_errno;
 	}
 
diff --git a/ports/unix/guts/mknodat.c b/ports/unix/guts/mknodat.c
index 9e86c93..3e8b207 100644
--- a/ports/unix/guts/mknodat.c
+++ b/ports/unix/guts/mknodat.c
@@ -21,27 +21,14 @@
         pseudo_debug(PDBGF_FILE, "mknodat creating '%s', mode 0%o\n",
                 path ? path : "<no name>", (int) mode);
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	rc = base_stat(path, &buf);
-#else
 	rc = base_fstatat(dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
-#endif
 	if (rc != -1) {
 		/* if we can stat the file, you can't mknod it */
 		errno = EEXIST;
 		return -1;
 	}
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	rc = real_open(path, O_CREAT | O_WRONLY | O_EXCL,
-		PSEUDO_FS_MODE(mode, 0));
-#else
 	rc = real_openat(dirfd, path, O_CREAT | O_WRONLY | O_EXCL,
 		PSEUDO_FS_MODE(mode, 0));
-#endif
 	if (rc == -1) {
 		return -1;
 	}
@@ -68,11 +55,7 @@
 	}
 	if (rc == -1) {
                 save_errno = errno;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-		real_unlink(path);
-#else
 		real_unlinkat(dirfd, path, AT_SYMLINK_NOFOLLOW);
-#endif
 		errno = save_errno;
 	}
 
diff --git a/ports/unix/guts/readlinkat.c b/ports/unix/guts/readlinkat.c
index 86832da..2d1bce0 100644
--- a/ports/unix/guts/readlinkat.c
+++ b/ports/unix/guts/readlinkat.c
@@ -8,15 +8,7 @@
  * wrap_readlinkat(int dirfd, const char *path, char *buf, size_t bufsiz) {
  *	ssize_t rc = -1;
  */
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	rc = real_readlink(path, buf, bufsiz);
-#else
 	rc = real_readlinkat(dirfd, path, buf, bufsiz);
-#endif
 
 	if (rc > 0) {
 		rc = pseudo_dechroot(buf, rc);
diff --git a/ports/unix/guts/renameat.c b/ports/unix/guts/renameat.c
index 69130c6..98391dd 100644
--- a/ports/unix/guts/renameat.c
+++ b/ports/unix/guts/renameat.c
@@ -20,13 +20,6 @@
 		olddirfd, oldpath ? oldpath : "<nil>",
 		newdirfd, newpath ? newpath : "<nil>");
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (olddirfd != AT_FDCWD || newdirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-#endif
-
 	if (!oldpath || !newpath) {
 		errno = EFAULT;
 		return -1;
@@ -34,13 +27,8 @@
 
 	save_errno = errno;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	newrc = base_lstat(newpath, &newbuf);
-	oldrc = base_lstat(oldpath, &oldbuf);
-#else
 	oldrc = base_fstatat(olddirfd, oldpath, &oldbuf, AT_SYMLINK_NOFOLLOW);
 	newrc = base_fstatat(newdirfd, newpath, &newbuf, AT_SYMLINK_NOFOLLOW);
-#endif
 
 	/* nothing to do for a "rename" of a link to itself */
 	if (newrc != -1 && oldrc != -1 &&
diff --git a/ports/unix/guts/symlinkat.c b/ports/unix/guts/symlinkat.c
index 5673912..0efe4d1 100644
--- a/ports/unix/guts/symlinkat.c
+++ b/ports/unix/guts/symlinkat.c
@@ -17,25 +17,13 @@
 		snprintf(roldname, len, "%s%s", pseudo_chroot, oldname);
 	}
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	rc = real_symlink(roldname ? roldname : oldname, newpath);
-#else
 	rc = real_symlinkat(roldname ? roldname : oldname, dirfd, newpath);
-#endif
 
 	if (rc == -1) {
 		free(roldname);
 		return rc;
 	}
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	rc = base_lstat(newpath, &buf);
-#else
 	rc = base_fstatat(dirfd, newpath, &buf, AT_SYMLINK_NOFOLLOW);
-#endif
 	if (rc == -1) {
 		int save_errno = errno;
 		pseudo_warning("symlinkat: couldn't stat '%s' even though symlink creation succeeded (%s).\n",
diff --git a/ports/unix/guts/unlinkat.c b/ports/unix/guts/unlinkat.c
index 9889b2e..d0f795b 100644
--- a/ports/unix/guts/unlinkat.c
+++ b/ports/unix/guts/unlinkat.c
@@ -13,39 +13,14 @@
 	PSEUDO_STATBUF buf;
 	int old_db_entry = 0;
 
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	if (dirfd != AT_FDCWD) {
-		errno = ENOSYS;
-		return -1;
-	}
-	if (rflags) {
-		/* the only supported flag is AT_REMOVEDIR.  We'd never call
-		 * with that flag unless the real AT functions exist, so 
-		 * something must have gone horribly wrong....
-		 */
-		pseudo_info("wrap_unlinkat called with flags (0x%x), path '%s'\n",
-			rflags, path ? path : "<nil>");
-		errno = ENOSYS;
-		return -1;
-	}
-#endif
-
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	rc = base_lstat(path, &buf);
-#else
 	rc = base_fstatat(dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
-#endif
 	if (rc == -1) {
 		return rc;
 	}
 	msg = pseudo_client_op(OP_MAY_UNLINK, 0, -1, dirfd, path, &buf);
 	if (msg && msg->result == RESULT_SUCCEED)
 		old_db_entry = 1;
-#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
-	rc = real_unlink(path);
-#else
 	rc = real_unlinkat(dirfd, path, rflags);
-#endif
 	if (old_db_entry) {
 		if (rc == -1) {
 			save_errno = errno;
diff --git a/pseudo.h b/pseudo.h
index 6d50b77..53bf13f 100644
--- a/pseudo.h
+++ b/pseudo.h
@@ -135,23 +135,16 @@ extern char *pseudo_version;
 
 #define PSEUDO_SEVERITY_DEFAULT "info,warn,error"
 
-/* some systems might not have *at().  We like to define operations in
- * terms of each other, and for instance, open(...) is the same as
- * openat(AT_FDCWD, ...).  If no AT_FDCWD is provided, any value that can't
- * be a valid file descriptor will do.  Using -2 because -1 could be
- * mistaken for a failed syscall return.  AT_SYMLINK_NOFOLLOW has to be
- * non-zero; AT_SYMLINK_FOLLOW has to be non-zero and different.  Finally,
- * if this happened, we set our own flag we can use to indicate that dummy
- * implementations of the _at functions are needed.
+/* pseudo defines operations in terms of each other; for instance,
+ * open(...) is the same as openat(AT_FDCWD, ...).  This requires the *at()
+ * functions and AT_FDCWD, AT_SYMLINK_NOFOLLOW and AT_SYMLINK_FOLLOW from
+ * <fcntl.h>.
  */
 #ifndef AT_FDCWD
-#define AT_FDCWD -2
-#define AT_SYMLINK_NOFOLLOW 1
-#define AT_SYMLINK_FOLLOW 2
-#define PSEUDO_NO_REAL_AT_FUNCTIONS
+#error "pseudo requires *at() function support (AT_FDCWD, AT_SYMLINK_NOFOLLOW, AT_SYMLINK_FOLLOW)"
 #endif
 
-/* Likewise, someone might not have O_LARGEFILE (the flag equivalent to
+/* Someone might not have O_LARGEFILE (the flag equivalent to
  * using open64()).  Since open64() is the same as O_LARGEFILE in flags,
  * we implement it that way... If the system has no O_LARGEFILE, we'll
  * just call open() with nothing special.
-- 
1.8.3.1


  parent reply	other threads:[~2026-11-11  4:21 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-11  4:20 [pseudo][PATCH 00/34] Various fixes Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 01/34] pseudo_client: serialize path changes across clients Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 02/34] ports: hold the path lock in create and metadata wrappers Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 03/34] ports: check created files under the path lock before recording them Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 04/34] test-parallel-ops: Add a parallel create/rename/link/chmod test Mark Hatle
2026-11-11  4:20 ` Mark Hatle [this message]
2026-11-11  4:20 ` [pseudo][PATCH 06/34] ports/unix: Remove guts overridden by the Linux port Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 07/34] ports: Let the port define how pseudo stats files Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 08/34] patches/yocto-older-glibc-symbols.patch: Update to latest YP version Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 09/34] Remove unused #if 0 debug code Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 10/34] Replace #if 0 strerror() debug messages with a comment Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 11/34] pseudo_util: Remove stale with_libpseudo() comment Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 12/34] ports/common/subports: Show the unknown OS name in the error Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 13/34] ports/linux: Drop redundant PSEUDO_LINK_SYMLINK_BEHAVIOR override Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 14/34] pseudo_server: Skip events for clients closed earlier in the batch Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 15/34] pseudo_server: Drop an idle client when out of file descriptors Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 16/34] pseudo_server: Always use epoll Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 17/34] configure: Fix --disable-* options Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 18/34] pseudo_server: Lower highest_client when the highest client closes Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 19/34] pseudo_server: Set highest_client to the new client when growing Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 20/34] pseudo_util: Store PSEUDO_SEVERITY as severity names Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 21/34] pseudo: Fix the -k severity option Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 22/34] pseudo_util: Make -v and numeric PSEUDO_DEBUG add debug flags Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 23/34] AGENTS.md: Add to assist future developers Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 24/34] pseudo_util: Fix the date format in the event log dump Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 25/34] pseudo: List -p in the usage message Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 26/34] pseudo_util: Write the event log to PSEUDO_EVLOG_FILE Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 27/34] pseudo.1: Update to match the current code Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 28/34] ports/linux: Don't require <linux/mount.h> Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 29/34] configure: Require GCC 5 or later Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 30/34] doc: Update README and doc/ to match the code Mark Hatle
2026-11-11  4:20 ` [pseudo][PATCH 31/34] configure: Fix the --enable-profiling default Mark Hatle
2026-11-11  4:21 ` [pseudo][PATCH 32/34] pseudo_util: Skip unneeded lstat calls when canonicalizing paths Mark Hatle
2026-11-11  4:21 ` [pseudo][PATCH 33/34] wrappers: Don't re-block signals in nested wrapper calls Mark Hatle
2026-11-11  4:21 ` [pseudo][PATCH 34/34] Wrap execvpe(), fexecve() and execveat() Mark Hatle

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1794370862-30908-6-git-send-email-mark.hatle@kernel.crashing.org \
    --to=mark.hatle@kernel.crashing.org \
    --cc=yocto-patches@lists.yoctoproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.