test code v1

This commit is contained in:
2026-08-13 10:44:59 +02:00
commit f3b1165f19
301 changed files with 37885 additions and 0 deletions
+127
View File
@@ -0,0 +1,127 @@
#include <sys/param.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <err.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static uint64_t
parse_u64(const char *text)
{
char *end;
uintmax_t value;
errno = 0;
value = strtoumax(text, &end, 0);
if (errno != 0 || *text == '\0' || *end != '\0' || value > UINT64_MAX)
errx(2, "invalid integer: %s", text);
return ((uint64_t)value);
}
static void
stat_blocks(const char *path, const char *expected_text)
{
fhandle_t handle;
struct stat direct, by_handle;
uint64_t expected;
expected = parse_u64(expected_text);
if (stat(path, &direct) != 0)
err(1, "stat %s", path);
if (getfh(path, &handle) != 0)
err(1, "getfh %s", path);
if (fhstat(&handle, &by_handle) != 0)
err(1, "fhstat %s", path);
if ((uint64_t)direct.st_blocks != expected ||
(uint64_t)by_handle.st_blocks != expected)
errx(1, "st_blocks direct=%jd handle=%jd expected=%" PRIu64,
(intmax_t)direct.st_blocks, (intmax_t)by_handle.st_blocks,
expected);
printf("direct_blocks=%jd handle_blocks=%jd size=%jd expected=%" PRIu64
"\n", (intmax_t)direct.st_blocks, (intmax_t)by_handle.st_blocks,
(intmax_t)direct.st_size, expected);
}
static void
expect_stat_error(const char *path, const char *expected_text)
{
struct stat status;
int expected;
expected = (int)parse_u64(expected_text);
errno = 0;
if (stat(path, &status) != -1)
errx(1, "stat unexpectedly succeeded: %s", path);
if (errno != expected)
errx(1, "stat errno=%d expected=%d", errno, expected);
printf("stat_errno=%d path=%s\n", errno, path);
}
static void
readdir_offmax(const char *path, const char *expected_text)
{
char buffer[512];
off_t base, current;
ssize_t bytes;
int descriptor, expected;
expected = (int)parse_u64(expected_text);
descriptor = open(path, O_RDONLY | O_DIRECTORY);
if (descriptor < 0)
err(1, "open %s", path);
if (lseek(descriptor, OFF_MAX, SEEK_SET) != OFF_MAX)
err(1, "lseek OFF_MAX");
base = 0;
errno = 0;
bytes = getdirentries(descriptor, buffer, sizeof(buffer), &base);
if (bytes != -1 || errno != expected)
errx(1, "OFF_MAX getdirentries bytes=%zd errno=%d expected=%d",
bytes, errno, expected);
current = lseek(descriptor, 0, SEEK_CUR);
if (current < 0 || current != OFF_MAX)
errx(1, "negative or changed post-error offset: %jd",
(intmax_t)current);
if (lseek(descriptor, 0, SEEK_SET) != 0)
err(1, "lseek zero");
base = 0;
errno = 0;
bytes = getdirentries(descriptor, buffer, sizeof(buffer), &base);
if (bytes != -1 || errno != expected)
errx(1, "zero-offset getdirentries bytes=%zd errno=%d expected=%d",
bytes, errno, expected);
current = lseek(descriptor, 0, SEEK_CUR);
if (current < 0 || current != 0)
errx(1, "negative or changed zero offset: %jd", (intmax_t)current);
if (close(descriptor) != 0)
err(1, "close %s", path);
printf("offmax_errno=%d offmax_offset=%jd zero_errno=%d zero_offset=%jd\n",
expected, (intmax_t)OFF_MAX, expected, (intmax_t)current);
}
int
main(int argc, char **argv)
{
if (argc == 4 && strcmp(argv[1], "stat-blocks") == 0) {
stat_blocks(argv[2], argv[3]);
return (0);
}
if (argc == 4 && strcmp(argv[1], "expect-stat-error") == 0) {
expect_stat_error(argv[2], argv[3]);
return (0);
}
if (argc == 4 && strcmp(argv[1], "readdir-offmax") == 0) {
readdir_offmax(argv[2], argv[3]);
return (0);
}
errx(2, "usage: %s stat-blocks PATH EXPECTED | "
"expect-stat-error PATH ERRNO | readdir-offmax PATH ERRNO", argv[0]);
}