summaryrefslogtreecommitdiff
path: root/test/stat/stat-time64.c
blob: 03d207f63035f1131b698dd8a30eb29761c0f366 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* Test for stat() after 2038 year.  */

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <time.h>

#define assert(x) \
  if (!(x)) \
    { \
      fputs ("test failed: " #x "\n", stderr); \
      retval = 1; \
      goto the_end; \
    }

int
main (int argc, char *argv[])
{
#if defined(__arc__) || defined(__arm__) || defined(__i386__) || defined(__microblaze__) || defined(__mips__) || defined(__or1k__) || defined(__powerpc__) || defined(__sh__) || defined(__sparc__) || defined(__xtensa__)
  char name[PATH_MAX];
  int retval = 0;
  int fd;
  struct stat st;

  if (sizeof(time_t) == 8) {

    memset(name, 0, PATH_MAX);

    struct timespec y2090_ts = {
      .tv_sec = 3786962400,
      .tv_nsec = 0
    };

    assert(clock_settime (CLOCK_REALTIME, &y2090_ts) == 0);

    /* hack to get a tempfile name w/out using tmpname()
     * as that func causes a link time warning */
    sprintf(name, "%s-uClibc-test.XXXXXX", __FILE__);
    fd = mkstemp(name);

    assert(stat (name, &st) == 0)
    assert(st.st_atime >= 3786962400);
    assert(st.st_mtime >= 3786962400);
    assert(st.st_ctime >= 3786962400);

    assert(fstat (fd, &st) == 0)
    assert(st.st_atime >= 3786962400);
    assert(st.st_mtime >= 3786962400);
    assert(st.st_ctime >= 3786962400);

    assert(lstat (name, &st) == 0)
    assert(st.st_atime >= 3786962400);
    assert(st.st_mtime >= 3786962400);
    assert(st.st_ctime >= 3786962400);

    close(fd);
    retval = 0;

the_end:
    unlink (name);

    return retval;
  }
  else {
    printf("Nothing to test.\n");
  }
#else
  printf("Nothing to test.\n");
  return 0;
#endif
}