* tests/test-fchmod.c: Include <fcntl.h>.
(BASE): New macro.
(main): Add more tests.
* tests/test-fchmodat.c (main): Add more tests.
* tests/test-lchmod.c (main): Likewise.
+2021-01-09 Bruno Haible <bruno@clisp.org>
+
+ fchmod-tests, fchmodat tests, lchmod tests: Add more tests.
+ * tests/test-fchmod.c: Include <fcntl.h>.
+ (BASE): New macro.
+ (main): Add more tests.
+ * tests/test-fchmodat.c (main): Add more tests.
+ * tests/test-lchmod.c (main): Likewise.
+
2021-01-09 Bruno Haible <bruno@clisp.org>
utimensat: Fix typo in last commit.
SIGNATURE_CHECK (fchmod, int, (int, mode_t));
#include <errno.h>
+#include <fcntl.h>
#include <unistd.h>
#include "macros.h"
+#define BASE "test-fchmod."
+
int
main (void)
{
ASSERT (errno == EBADF);
}
+ /* Test that fchmod works on regular files. */
+ {
+ struct stat statbuf;
+ int fd;
+
+ unlink (BASE "file");
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ fd = open (BASE "file", O_RDWR);
+ ASSERT (fd >= 0);
+ ASSERT (fchmod (fd, 0400) == 0);
+ ASSERT (stat (BASE "file", &statbuf) >= 0);
+ ASSERT ((statbuf.st_mode & 0700) == 0400);
+ ASSERT (close (fd) == 0);
+
+ /* Clean up. */
+ ASSERT (chmod (BASE "file", 0600) == 0);
+ ASSERT (unlink (BASE "file") == 0);
+ }
+
return 0;
}
ASSERT (errno == EBADF);
}
+ /* Test that fchmodat works on regular files. */
+ {
+ struct stat statbuf;
+
+ unlink (BASE "file");
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ ASSERT (fchmodat (AT_FDCWD, BASE "file", 0400, 0) == 0);
+ ASSERT (stat (BASE "file", &statbuf) >= 0);
+ ASSERT ((statbuf.st_mode & 0700) == 0400);
+
+ errno = 0;
+ ASSERT (fchmodat (AT_FDCWD, BASE "file/", 0600, 0) == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Clean up. */
+ ASSERT (chmod (BASE "file", 0600) == 0);
+ ASSERT (unlink (BASE "file") == 0);
+ }
+
+ /* Test that fchmodat works on directories. */
+ {
+ struct stat statbuf;
+ rmdir (BASE "dir");
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (fchmodat (AT_FDCWD, BASE "dir", 0500, 0) == 0);
+ ASSERT (stat (BASE "dir", &statbuf) >= 0);
+ ASSERT ((statbuf.st_mode & 0700) == 0500);
+ ASSERT (fchmodat (AT_FDCWD, BASE "dir/", 0700, 0) == 0);
+
+ /* Clean up. */
+ ASSERT (rmdir (BASE "dir") == 0);
+ }
+
/* Test that fchmodat works on non-symlinks, when given
the AT_SYMLINK_NOFOLLOW flag. */
{
int
main (void)
{
- /* Test that lchmod works on non-symlinks. */
+ /* Test that lchmod works on regular files. */
{
struct stat statbuf;
unlink (BASE "file");
ASSERT (lchmod (BASE "file", 0400) == 0);
ASSERT (stat (BASE "file", &statbuf) >= 0);
ASSERT ((statbuf.st_mode & 0700) == 0400);
+
+ errno = 0;
+ ASSERT (lchmod (BASE "file/", 0600) == -1);
+ ASSERT (errno == ENOTDIR);
+
/* Clean up. */
ASSERT (chmod (BASE "file", 0600) == 0);
ASSERT (unlink (BASE "file") == 0);
}
+ /* Test that lchmod works on directories. */
+ {
+ struct stat statbuf;
+
+ rmdir (BASE "dir");
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (lchmod (BASE "dir", 0500) == 0);
+ ASSERT (stat (BASE "dir", &statbuf) >= 0);
+ ASSERT ((statbuf.st_mode & 0700) == 0500);
+ ASSERT (lchmod (BASE "dir/", 0700) == 0);
+
+ /* Clean up. */
+ ASSERT (rmdir (BASE "dir") == 0);
+ }
+
/* Test that lchmod on symlinks does not modify the symlink target. */
{
unlink (BASE "file");