mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
c432589da3
Mostly scripted like all the others, manually added tags to Makefile, nsexec.c and t_mmap_writev.c. Manually touched up open_by_handle.c and t_encrypted_d_revalidate.c post script. Notes for future reference: - src/log-writes/ code has no explicit copyright or license tags, nor does the upstream repository, hence license is unknown. Need Josef to clarify the license and send a patch adding SPDX tags to those files. - src/perf code has no explicit copyright or license tags, but it was code submitted explictly for fstests so it is assumed to be GPLv2.0 and tagged as such. If this is incorrect, Josef will need to clarify copyright and the license and send patches to correct it. Signed-off-by: Dave Chinner <dchinner@redhat.com>
131 lines
2.7 KiB
C
131 lines
2.7 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Test ctime and mtime are updated on truncate(2) and ftruncate(2)
|
|
* Copyright (c) 2013 Red Hat, Inc. All Rights Reserved.
|
|
*/
|
|
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#define TEST_MSG "this is a test string"
|
|
|
|
int do_test(const char *file, int is_ftrunc)
|
|
{
|
|
int ret;
|
|
int fd;
|
|
struct stat statbuf1;
|
|
struct stat statbuf2;
|
|
|
|
ret = 0;
|
|
fd = open(file, O_RDWR | O_CREAT | O_TRUNC, 0644);
|
|
if (fd == -1) {
|
|
perror("open(2) failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
ret = write(fd, TEST_MSG, sizeof(TEST_MSG));
|
|
if (ret == -1) {
|
|
perror("write(2) failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
/* Get timestamps before [f]truncate(2) */
|
|
ret = fstat(fd, &statbuf1);
|
|
if (ret == -1) {
|
|
perror("fstat(2) failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
/* Test [f]truncate(2) down */
|
|
sleep(1);
|
|
if (is_ftrunc) {
|
|
ret = ftruncate(fd, 0);
|
|
if (ret == -1) {
|
|
perror("ftruncate(2) down failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
} else {
|
|
ret = truncate(file, 0);
|
|
if (ret == -1) {
|
|
perror("truncate(2) down failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
/* Get timestamps after [f]truncate(2) */
|
|
ret = fstat(fd, &statbuf2);
|
|
if (ret == -1) {
|
|
perror("fstat(2) failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
/* Check whether timestamps got updated on [f]truncate(2) down */
|
|
if (statbuf1.st_ctime == statbuf2.st_ctime) {
|
|
fprintf(stderr, "ctime not updated after %s\n",
|
|
is_ftrunc ? "ftruncate" : "truncate" " down");
|
|
ret++;
|
|
}
|
|
if (statbuf1.st_mtime == statbuf2.st_mtime) {
|
|
fprintf(stderr, "mtime not updated after %s\n",
|
|
is_ftrunc ? "ftruncate" : "truncate" " down");
|
|
ret++;
|
|
}
|
|
|
|
/* Test [f]truncate(2) up */
|
|
sleep(1);
|
|
if (is_ftrunc) {
|
|
ret = ftruncate(fd, 123);
|
|
if (ret == -1) {
|
|
perror("ftruncate(2) up failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
} else {
|
|
ret = truncate(file, 123);
|
|
if (ret == -1) {
|
|
perror("truncate(2) up failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
ret = fstat(fd, &statbuf1);
|
|
if (ret == -1) {
|
|
perror("fstat(2) failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
/* Check whether timestamps got updated on [f]truncate(2) up */
|
|
if (statbuf1.st_ctime == statbuf2.st_ctime) {
|
|
fprintf(stderr, "ctime not updated after %s\n",
|
|
is_ftrunc ? "ftruncate" : "truncate" " up");
|
|
ret++;
|
|
}
|
|
if (statbuf1.st_mtime == statbuf2.st_mtime) {
|
|
fprintf(stderr, "mtime not updated after %s\n",
|
|
is_ftrunc ? "ftruncate" : "truncate" " up");
|
|
ret++;
|
|
}
|
|
|
|
close(fd);
|
|
return ret;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int ret;
|
|
char *testfile;
|
|
|
|
ret = 0;
|
|
if (argc != 2) {
|
|
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
testfile = argv[1];
|
|
|
|
ret = do_test(testfile, 0);
|
|
ret += do_test(testfile, 1);
|
|
|
|
exit(ret);
|
|
}
|