#include <xfs/libxfs.h>
#include <xfs/handle.h>
#include <xfs/jdm.h>
-#include <ext2fs/ext2_fs.h>
-
-#define XFS_XFLAG_IMMUTABLE 0x00000008
-#define XFS_XFLAG_APPEND 0x00000010
+#define EXT2_SUPER_MAGIC 0xEF53
#define EXT2_IMMUTABLE_FL 0x00000010
#define EXT2_APPEND_FL 0x00000020
+#define EXT2_IOC_SETFLAGS _IOW('f', 2, long)
extern const char *__progname;
} else if (stfs.f_type == EXT2_SUPER_MAGIC) {
if (on)
e2flags |= e2fl;
- else
+ else
e2flags &= ~e2fl;
if (ioctl(fd, EXT2_IOC_SETFLAGS, &e2flags) < 0) {
close(fd);
asprintf(&linkpath, "%s/immutable.d/file.link", dir);
errno = 0;
- if (link(path, linkpath) != -1) {
+ if (link(path, linkpath) != -1) {
fprintf(stderr, "link(%s, %s) did not fail\n", path, linkpath);
fail++;
unlink(linkpath);
fprintf(stderr, "mknod(%s, S_IFCHR|0666, %lld) did not fail\n", path, (long long int)st.st_rdev);
fail++;
unlink(path);
- } else if (errno != EACCES) {
+ } else if (errno != EACCES) {
fprintf(stderr, "mknod(%s, S_IFCHR|0666, %lld) did not set errno == EACCESS\n", path, (long long int)st.st_rdev);
fail++;
}
fprintf(stderr, "mkdir(%s, 0777) did not set errno == EACCES\n", path);
fail++;
}
-
+
free(path);
asprintf(&path, "%s/immutable.d/dir/newfile-%d", dir, getuid());
if ((fd = open(path, O_RDWR|O_CREAT, 0666)) == -1) {
} else if (errno != EPERM) {
fprintf(stderr, "rmdir(%s) did not set errno == EPERM\n", path);
fail++;
- }
+ }
free(path);
return fail;
asprintf(&linkpath, "%s/append-only.d/file.link-%d", dir, getuid());
errno = 0;
- if (link(path, linkpath) == -1) {
+ if (link(path, linkpath) == -1) {
fprintf(stderr, "link(%s, %s) failed: %s\n", path, linkpath, strerror(errno));
fail++;
} else if (unlink(linkpath) != -1) {
if (mknod(path, S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH, st.st_rdev) == -1) {
fprintf(stderr, "mknod(%s, S_IFCHR|0666, %lld) failed: %s\n", path, (long long int)st.st_rdev, strerror(errno));
fail++;
- } else if (unlink(path) != -1) {
+ } else if (unlink(path) != -1) {
fprintf(stderr, "unlink(%s) did not fail\n", path);
fail++;
}
fprintf(stderr, "rmdir(%s) did not fail\n", path);
fail++;
}
-
+
free(path);
asprintf(&path, "%s/append-only.d/newdir-%d/newfile-%d", dir, getuid(), getuid());
if ((fd = open(path, O_RDWR|O_CREAT, 0666)) == -1) {
} else
chown(path, 0, 0);
}
-
+
free(path);
asprintf(&path, "%s/append-only.d/dir/newfile-%d", dir, getuid());
if ((fd = open(path, O_RDWR|O_CREAT, 0666)) == -1) {
} else if (errno != EPERM) {
fprintf(stderr, "rmdir(%s) did not set errno == EPERM\n", path);
fail++;
- }
+ }
free(path);
return fail;
__progname, path);
return 1;
}
-
+
free(path);
asprintf(&path, "%s/append-only.d/file", dir);
if (stat(path, &st) == -1) {
if (getuid()) {
fprintf(stderr, "%s: you are not root, go away.\n", __progname);
return 1;
- }
+ }
if (stat(dir, &st) == 0) {
fprintf(stderr, "%s: Test area directory %s must not exist for test area creation.\n",
}
free(path);
- asprintf(&path, "%s/empty-immutable.d", dir);
+ asprintf(&path, "%s/empty-immutable.d", dir);
if (mkdir(path, 0777) != 0) {
fprintf(stderr, "%s: error creating directory %s: %s\n", __progname, path, strerror(errno));
return 1;
}
free(path);
- asprintf(&path, "%s/append-only.d", dir);
+ asprintf(&path, "%s/append-only.d", dir);
if (mkdir(path, 0777) != 0) {
fprintf(stderr, "%s: error creating directory %s: %s\n", __progname, path, strerror(errno));
return 1;
}
free(path);
- asprintf(&path, "%s/empty-append-only.d", dir);
+ asprintf(&path, "%s/empty-append-only.d", dir);
if (mkdir(path, 0777) != 0) {
fprintf(stderr, "%s: error creating directory %s: %s\n", __progname, path, strerror(errno));
return 1;
}
free(path);
- asprintf(&path, "%s/immutable.d/dir", dir);
+ asprintf(&path, "%s/immutable.d/dir", dir);
if (mkdir(path, 0777) != 0) {
fprintf(stderr, "%s: error creating directory %s: %s\n", __progname, path, strerror(errno));
return 1;
}
free(path);
- asprintf(&path, "%s/append-only.d/dir", dir);
+ asprintf(&path, "%s/append-only.d/dir", dir);
if (mkdir(path, 0777) != 0) {
fprintf(stderr, "%s: error creating directory %s: %s\n", __progname, path, strerror(errno));
return 1;
close(fd);
return 1;
}
- close(fd);
+ close(fd);
free(path);
asprintf(&path, "%s/append-only.f", dir);
close(fd);
free(path);
- asprintf(&path, "%s/empty-immutable.d", dir);
+ asprintf(&path, "%s/empty-immutable.d", dir);
if ((fd = open(path, O_RDONLY)) == -1) {
fprintf(stderr, "%s: error opening %s: %s\n", __progname, path, strerror(errno));
return 1;
close(fd);
return 1;
}
- close(fd);
+ close(fd);
free(path);
- asprintf(&path, "%s/append-only.d", dir);
+ asprintf(&path, "%s/append-only.d", dir);
if ((fd = open(path, O_RDONLY)) == -1) {
fprintf(stderr, "%s: error opening %s: %s\n", __progname, path, strerror(errno));
return 1;
close(fd);
return 1;
}
- close(fd);
+ close(fd);
free(path);
- asprintf(&path, "%s/empty-append-only.d", dir);
+ asprintf(&path, "%s/empty-append-only.d", dir);
if ((fd = open(path, O_RDONLY)) == -1) {
fprintf(stderr, "%s: error opening %s: %s\n", __progname, path, strerror(errno));
return 1;
close(fd);
return 1;
}
- close(fd);
+ close(fd);
free(path);
return 0;
}
if ((fd = open(path, O_RDONLY)) == -1) {
fprintf(stderr, "%s: error opening %s: %s\n", __progname, path, strerror(errno));
err = 1;
- } else {
+ } else {
if (fsetflag(path, fd, 0, 1))
perror("fsetflag");
close(fd);
}
free(path);
- asprintf(&path, "%s/empty-immutable.d", dir);
+ asprintf(&path, "%s/empty-immutable.d", dir);
if ((fd = open(path, O_RDONLY)) == -1) {
fprintf(stderr, "%s: error opening %s: %s\n", __progname, path, strerror(errno));
- err = 1;
+ err = 1;
} else {
if (fsetflag(path, fd, 0, 1))
perror("fsetflag");
-
+
close(fd);
}
free(path);
- asprintf(&path, "%s/append-only.d", dir);
+ asprintf(&path, "%s/append-only.d", dir);
if ((fd = open(path, O_RDONLY)) == -1) {
fprintf(stderr, "%s: error opening %s: %s\n", __progname, path, strerror(errno));
err = 1;
} else {
if (fsetflag(path, fd, 0, 0))
perror("fsetflag");
- close(fd);
+ close(fd);
}
free(path);
- asprintf(&path, "%s/empty-append-only.d", dir);
+ asprintf(&path, "%s/empty-append-only.d", dir);
if ((fd = open(path, O_RDONLY)) == -1) {
fprintf(stderr, "%s: error opening %s: %s\n", __progname, path, strerror(errno));
err = 1;
} else {
if (fsetflag(path, fd, 0, 0))
perror("fsetflag");
- close(fd);
+ close(fd);
}
free(path);
if (fsetflag(path, fd, 0, 0))
perror("fsetflag");
- close(fd);
+ close(fd);
}
free(path);
} else {
if (fsetflag(path, fd, 0, 1))
perror("fsetflag");
- close(fd);
+ close(fd);
}
free(path);
puts("PASS.");
if (!getuid() && !failed) {
- if (setgroups(0, NULL) != 0)
+ if (setgroups(0, NULL) != 0)
perror("setgroups");
if (setgid(65534) != 0)
perror("setgid");
failed = 1;
} else
puts("PASS.");
-
+
printf("testing append-only as non-root...");
if ((ret = test_append(argv[argc-1])) != 0) {
printf("FAILED! (%d tests failed)\n", ret);