Skip to content
Permalink
56606ab3b8
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
127 lines (108 sloc) 2.19 KB
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <stdbool.h>
#include <string.h>
#ifndef O_NOATIME
# define O_NOATIME 0
#endif
static int
do_test (void)
{
char fname[] = "/tmp/jXXXXXX";
int fd = mkstemp (fname);
if (fd == -1)
{
puts ("mkstemp failed");
return 1;
}
write (fd, "hello", 5);
close (fd);
struct stat64 st;
if (stat64 (fname, &st) == -1)
{
puts ("first stat failed");
return 0;
}
/* Make sure there is enough time between the creation and the access. */
sleep (2);
fd = open (fname, O_RDONLY | O_NOATIME);
if (fd == -1)
{
puts ("first open failed");
return 1;
}
char buf[5];
read(fd, buf, sizeof (buf));
close(fd);
struct stat64 st2;
if (stat64 (fname, &st2) == -1)
{
puts ("second stat failed");
return 0;
}
bool no_noatime = false;
#ifdef _STATBUF_ST_NSEC
if (st.st_atim.tv_sec != st2.st_atim.tv_sec
|| st.st_atim.tv_nsec != st2.st_atim.tv_nsec)
#else
if (st.st_atime != st2.st_atime)
#endif
{
puts ("file atime changed");
no_noatime = true;
}
unlink(fname);
strcpy(fname, "/tmp/dXXXXXX");
char *d = mkdtemp (fname);
if (d == NULL)
{
puts ("mkdtemp failed");
return 1;
}
if (stat64 (d, &st) == -1)
{
puts ("third stat failed");
return 0;
}
sleep (2);
fd = open64 (d, O_RDONLY|O_NDELAY|O_DIRECTORY|O_NOATIME);
if (fd == -1)
{
puts ("second open failed");
return 1;
}
DIR *dir = fdopendir (fd);
if (dir == NULL)
{
puts ("fdopendir failed");
return 1;
}
struct dirent *de;
while ((de = readdir (dir)) != NULL)
;
closedir (dir);
if (stat64 (d, &st2) == -1)
{
puts ("fourth stat failed");
return 0;
}
#ifdef _STATBUF_ST_NSEC
if (!no_noatime
&& (st.st_atim.tv_sec != st2.st_atim.tv_sec
|| st.st_atim.tv_nsec != st2.st_atim.tv_nsec))
#else
if (!no_noatime && st.st_atime != st2.st_atime)
#endif
{
puts ("directory atime changed");
return 1;
}
rmdir(fname);
return 0;
}
#define TIMEOUT 6
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"