Loading...
#include <unistd.h>
#include <fts.h>

#include <sys/stat.h>
#include <sys/types.h>

#include <darwintest.h>

T_DECL(fts_read_eperm_directory, "Check that fts_read does not crash on a directory that cannot be read",
		T_META_ASROOT(false),
		T_META_CHECK_LEAKS(false) /* needs leak check to be off to run as non-root */)
{
	FTS *fts;
	FTSENT *ftse;
	char tmpdir[] = "/tmp/temp.XXXXXX";
	char *args[] = {".", NULL};

	T_ASSERT_NOTNULL(mkdtemp(tmpdir), "mkdrtmp");

	T_EXPECT_POSIX_SUCCESS(chdir(tmpdir), "chdir");

	fts = fts_open(args, FTS_PHYSICAL, NULL);
	T_EXPECT_NOTNULL(fts, "fts_open");

	T_EXPECT_POSIX_SUCCESS(chmod(tmpdir, 000), "chmod");

	while ((ftse = fts_read(fts)) != NULL);

	T_EXPECT_POSIX_FAILURE(fts_close(fts), EACCES, "fts_close");

	T_EXPECT_POSIX_SUCCESS(rmdir(tmpdir), "rmdir");
}