]> git.ipfire.org Git - thirdparty/glibc.git/blame - io/test-utime.c
build-many-glibcs.py: Add openrisc hard float glibc variant
[thirdparty/glibc.git] / io / test-utime.c
CommitLineData
dff8da6b 1/* Copyright (C) 1994-2024 Free Software Foundation, Inc.
c84142e8 2 This file is part of the GNU C Library.
28f540f4 3
c84142e8 4 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
28f540f4 8
c84142e8
UD
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
28f540f4 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6 15 License along with the GNU C Library; if not, see
5a82c748 16 <https://www.gnu.org/licenses/>. */
28f540f4 17
11336c16 18#include <fcntl.h>
ceaa9889 19#include <stdint.h>
28f540f4 20#include <stdio.h>
3e1f480e 21#include <stdlib.h>
28f540f4
RM
22#include <sys/stat.h>
23#include <unistd.h>
11336c16 24#include <utime.h>
274aead3 25#include <time.h>
28f540f4
RM
26
27int
cccda09f 28main (int argc, char *argv[])
28f540f4 29{
5c112f1b 30 char file[] = "/tmp/test-utime.XXXXXX";
28f540f4
RM
31 struct utimbuf ut;
32 struct stat st;
274aead3
GM
33 struct stat stnow;
34 time_t now1, now2;
28f540f4
RM
35 int fd;
36
5c112f1b 37 fd = mkstemp (file);
28f540f4
RM
38 if (fd < 0)
39 {
5c112f1b 40 perror ("mkstemp");
bf4de8f3 41 return 1;
28f540f4
RM
42 }
43 close (fd);
44
274aead3 45 /* Test utime with arg */
28f540f4
RM
46 ut.actime = 500000000;
47 ut.modtime = 500000001;
48 if (utime (file, &ut))
49 {
50 perror ("utime");
51 remove (file);
bf4de8f3 52 return 1;
28f540f4
RM
53 }
54
55 if (stat (file, &st))
56 {
57 perror ("stat");
58 remove (file);
bf4de8f3 59 return 1;
28f540f4
RM
60 }
61
274aead3
GM
62 /* Test utime with NULL.
63 Since there's a race condition possible here, we check
64 the time before and after the call to utime. */
65 now1 = time (NULL);
66 if (now1 == (time_t)-1)
67 {
68 perror ("time");
69 remove (file);
bf4de8f3 70 return 1;
274aead3
GM
71 }
72
dade1ade
UD
73 /* The clocks used to set the modification time and that used in the
74 time() call need not be the same. They need not have the same
75 precision. Therefore we delay the following operation by one
76 second which makes sure we can compare with second precision. */
77 sleep (1);
78
274aead3
GM
79 if (utime (file, NULL))
80 {
81 perror ("utime NULL");
82 remove (file);
bf4de8f3 83 return 1;
274aead3
GM
84 }
85
dade1ade
UD
86 sleep (1);
87
274aead3
GM
88 now2 = time (NULL);
89 if (now2 == (time_t)-1)
90 {
91 perror ("time");
92 remove (file);
bf4de8f3 93 return 1;
274aead3
GM
94 }
95
96 if (stat (file, &stnow))
97 {
98 perror ("stat");
99 remove (file);
bf4de8f3 100 return 1;
274aead3
GM
101 }
102
28f540f4
RM
103 remove (file);
104
105 if (st.st_mtime != ut.modtime)
106 {
8d2b2763
L
107 printf ("modtime %jd != %jd\n",
108 (intmax_t) st.st_mtime, (intmax_t) ut.modtime);
bf4de8f3 109 return 1;
28f540f4
RM
110 }
111
112 if (st.st_atime != ut.actime)
113 {
8d2b2763
L
114 printf ("actime %jd != %jd\n",
115 (intmax_t) st.st_atime, (intmax_t) ut.actime);
bf4de8f3 116 return 1;
28f540f4
RM
117 }
118
dade1ade 119 if (stnow.st_mtime < now1 || stnow.st_mtime > now2)
274aead3 120 {
8d2b2763
L
121 printf ("modtime %jd <%jd >%jd\n",
122 (intmax_t) stnow.st_mtime, (intmax_t) now1, (intmax_t) now2);
bf4de8f3 123 return 1;
274aead3
GM
124 }
125
126 if (stnow.st_atime < now1 || stnow.st_atime > now2)
127 {
8d2b2763
L
128 printf ("actime %jd <%jd >%jd\n",
129 (intmax_t) stnow.st_atime, (intmax_t) now1, (intmax_t) now2);
bf4de8f3 130 return 1;
274aead3
GM
131 }
132
28f540f4 133 puts ("Test succeeded.");
bf4de8f3 134 return 0;
28f540f4 135}