diff --git a/manual_tests/darwin_c.c b/manual_tests/darwin_c.c
index bcc04ef270b41bc07a222f0e62b9d91c9fe968d8..70aca67cd3bd91dc5b2e93ca5e0528ed73e5b0cf 100644
--- a/manual_tests/darwin_c.c
+++ b/manual_tests/darwin_c.c
@@ -212,6 +212,7 @@ int timespec_get = 0;
 #ifdef _SC_PHYS_PAGES
 #error _SC_PHYS_PAGES is unexpectedly defined
 #endif
+int fgetattrlist = 0;
 int fsetattrlist = 0;
 #endif /* __DARWIN_C_LEVEL < __DARWIN_C_FULL */
 
diff --git a/test/test_fgetattrlist.c b/test/test_fgetattrlist.c
new file mode 100644
index 0000000000000000000000000000000000000000..63816c2eddfcbe35da510e70521fff78933f7e25
--- /dev/null
+++ b/test/test_fgetattrlist.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2024 raf <raf@raf.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* Based on the first example in the getattrlist(2) manual entry */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/attr.h>
+#include <sys/errno.h>
+#include <sys/vnode.h>
+
+typedef struct attrlist attrlist_t;
+
+struct FInfoAttrBuf {
+    u_int32_t       length;
+    fsobj_type_t    objType;
+    char            finderInfo[32];
+}  __attribute__((aligned(4), packed));
+typedef struct FInfoAttrBuf FInfoAttrBuf;
+
+static int FInfoDemo(int fd)
+{
+    int             err;
+    attrlist_t      attrList;
+    FInfoAttrBuf    attrBuf;
+
+    memset(&attrList, 0, sizeof(attrList));
+    attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
+    attrList.commonattr  = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
+
+    err = fgetattrlist(fd, &attrList, &attrBuf, sizeof(attrBuf), 0);
+    if (err != 0)
+        err = errno;
+
+    if (err == 0)
+        assert(attrBuf.length == sizeof(attrBuf));
+
+    return err;
+}
+
+/* Note: Not an exhaustive test. Just call fgetattrlist(). */
+
+int main(int ac, char **av)
+{
+    int rc = (FInfoDemo(open(".", O_RDONLY)) == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+    if (rc != EXIT_SUCCESS)
+        printf("fgetattrlist() failed, possibly correctly due to an unexpected filesystem type\n");
+    return rc;
+}
+
+/* vi:set et ts=4 sw=4: */
diff --git a/test/test_fsetattrlist.c b/test/test_fsetattrlist.c
new file mode 100644
index 0000000000000000000000000000000000000000..741f6c905c594445cf33c486bfc041ba660fa89f
--- /dev/null
+++ b/test/test_fsetattrlist.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2024 raf <raf@raf.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* Based on the first example in the getattrlist(2) manual entry */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/attr.h>
+#include <sys/errno.h>
+#include <unistd.h>
+#include <sys/vnode.h>
+
+typedef struct attrlist attrlist_t;
+
+struct FInfoAttrBuf
+{
+    u_int32_t    length;
+    fsobj_type_t objType;
+    char         finderInfo[32];
+};
+typedef struct FInfoAttrBuf FInfoAttrBuf;
+
+static int FInfoDemo(int fd, const char *type, const char *creator)
+{
+    int          err;
+    attrlist_t   attrList;
+    FInfoAttrBuf attrBuf;
+
+    assert(strlen(type) == 4);
+    assert(strlen(creator) == 4);
+
+    memset(&attrList, 0, sizeof(attrList));
+    attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
+    attrList.commonattr  = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
+
+    err = fgetattrlist(fd, &attrList, &attrBuf, sizeof(attrBuf), 0);
+    if (err != 0)
+    {
+        err = errno;
+    }
+
+    if ((err == 0) && (attrBuf.objType != VREG))
+    {
+        fprintf(stderr, "Not a standard file.");
+        err = EINVAL;
+    }
+    else
+    {
+        memcpy(&attrBuf.finderInfo[0], type,    4);
+        memcpy(&attrBuf.finderInfo[4], creator, 4);
+
+        attrList.commonattr = ATTR_CMN_FNDRINFO;
+        err = fsetattrlist(
+            fd,
+            &attrList,
+            attrBuf.finderInfo,
+            sizeof(attrBuf.finderInfo),
+            0
+        );
+    }
+
+    return err;
+}
+
+/* Note: Not an exhaustive test. Just call fsetattrlist(). */
+
+int main(int ac, char **av)
+{
+    const char *fname = "./.jnk.tmp";
+    int fd = open(fname, O_CREAT | O_RDWR, S_IRWXU);
+    int rc = (FInfoDemo(fd, "TYPE", "CRTR") == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+    unlink(fname);
+    if (rc != EXIT_SUCCESS)
+        printf("fgetattrlist() failed, possibly correctly due to an unexpected filesystem type\n");
+    return rc;
+}
+
+/* vi:set et ts=4 sw=4: */