testdir
if (!expect_mode(testdir.dfd, "regfile", 0100640)) {
ret = sys_fchmodat2(testdir.dfd, "regfile", 0600, AT_SYMLINK_NOFOLLOW);
if (!expect_mode(testdir.dfd, "regfile", 0100600)) {
cleanup_testdir(&testdir);
struct testdir testdir;
setup_testdir(&testdir);
ret = sys_fchmodat2(testdir.dfd, "symlink", 0640, 0);
if (!expect_mode(testdir.dfd, "regfile", 0100640)) {
if (!expect_mode(testdir.dfd, "symlink", 0120777)) {
ret = sys_fchmodat2(testdir.dfd, "symlink", 0600, AT_SYMLINK_NOFOLLOW);
if (ret == 0 && !expect_mode(testdir.dfd, "symlink", 0120600)) {
if (!expect_mode(testdir.dfd, "regfile", 0100640)) {
cleanup_testdir(&testdir);
cleanup_testdir(&testdir);
static void setup_testdir(struct testdir *testdir)
testdir->dirname = strdup(dirname);
if (!testdir->dirname) {
testdir->dfd = dfd;
unlinkat(testdir->dfd, "symlink", 0);
unlinkat(testdir->dfd, "regfile", 0);
static void cleanup_testdir(struct testdir *testdir)
unlinkat(testdir->dfd, "regfile", 0);
unlinkat(testdir->dfd, "symlink", 0);
rmdir(testdir->dirname);
free(testdir->dirname);
struct testdir testdir;
setup_testdir(&testdir);
ret = sys_fchmodat2(testdir.dfd, "regfile", 0640, 0);