Mercurial > hg > octave-shane > gnulib-hg
annotate lib/utimens.c @ 10133:bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
* m4/utimens.m4 (gl_UTIMENS): Check for futimens, utimensat.
* lib/utimens.c (gl_futimens): Use them for nanosecond resolution
when available.
[HAVE_BUGGY_NFS_TIME_STAMPS]: Allow C89 compilation.
Signed-off-by: Eric Blake <ebb9@byu.net>
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Wed, 28 May 2008 21:29:02 -0600 |
parents | c4fa39bf5223 |
children | 148190ed341d |
rev | line source |
---|---|
6734
3e5ad4566013
* utimens.c (futimens): glibc futimesat messes up if /proc
Paul Eggert <eggert@cs.ucla.edu>
parents:
6440
diff
changeset
|
1 /* Set file access and modification times. |
3e5ad4566013
* utimens.c (futimens): glibc futimesat messes up if /proc
Paul Eggert <eggert@cs.ucla.edu>
parents:
6440
diff
changeset
|
2 |
9613
c4fa39bf5223
Don't redefine __attribute__ without a need.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
3 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software |
7897
b7a83a69ac23
* MODULES.html.sh (Support for systems lacking POSIX:2001): New
Paul Eggert <eggert@cs.ucla.edu>
parents:
7713
diff
changeset
|
4 Foundation, Inc. |
5147 | 5 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8842
diff
changeset
|
6 This program is free software: you can redistribute it and/or modify it |
5147 | 7 under the terms of the GNU General Public License as published by the |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8842
diff
changeset
|
8 Free Software Foundation; either version 3 of the License, or any |
5147 | 9 later version. |
10 | |
11 This program is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8842
diff
changeset
|
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
5147 | 18 |
19 /* Written by Paul Eggert. */ | |
20 | |
21 /* derived from a function in touch.c */ | |
22 | |
7302
8a1a9361108c
* _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents:
6819
diff
changeset
|
23 #include <config.h> |
5147 | 24 |
25 #include "utimens.h" | |
26 | |
5589
6ddb405e16b6
(futimens): Account for the fact that futimes
Paul Eggert <eggert@cs.ucla.edu>
parents:
5485
diff
changeset
|
27 #include <errno.h> |
6283
b377d8796118
* lib/utimens.c (futimens): Use futimesat if available.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5848
diff
changeset
|
28 #include <fcntl.h> |
10133
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
29 #include <sys/stat.h> |
7897
b7a83a69ac23
* MODULES.html.sh (Support for systems lacking POSIX:2001): New
Paul Eggert <eggert@cs.ucla.edu>
parents:
7713
diff
changeset
|
30 #include <sys/time.h> |
6322 | 31 #include <unistd.h> |
5589
6ddb405e16b6
(futimens): Account for the fact that futimes
Paul Eggert <eggert@cs.ucla.edu>
parents:
5485
diff
changeset
|
32 |
5147 | 33 #if HAVE_UTIME_H |
34 # include <utime.h> | |
35 #endif | |
36 | |
37 /* Some systems (even some that do have <utime.h>) don't declare this | |
38 structure anywhere. */ | |
39 #ifndef HAVE_STRUCT_UTIMBUF | |
40 struct utimbuf | |
41 { | |
42 long actime; | |
43 long modtime; | |
44 }; | |
45 #endif | |
46 | |
6297
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
47 /* Some systems don't have ENOSYS. */ |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
48 #ifndef ENOSYS |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
49 # ifdef ENOTSUP |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
50 # define ENOSYS ENOTSUP |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
51 # else |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
52 /* Some systems don't have ENOTSUP either. */ |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
53 # define ENOSYS EINVAL |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
54 # endif |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
55 #endif |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
56 |
6819
3449832bdc37
* getdate.y (__attribute__): Don't define if already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6734
diff
changeset
|
57 #ifndef __attribute__ |
9613
c4fa39bf5223
Don't redefine __attribute__ without a need.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
58 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) |
6819
3449832bdc37
* getdate.y (__attribute__): Don't define if already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6734
diff
changeset
|
59 # define __attribute__(x) |
3449832bdc37
* getdate.y (__attribute__): Don't define if already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6734
diff
changeset
|
60 # endif |
5485
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
61 #endif |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
62 |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
63 #ifndef ATTRIBUTE_UNUSED |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
64 # define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
65 #endif |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
66 |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
67 /* Set the access and modification time stamps of FD (a.k.a. FILE) to be |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
68 TIMESPEC[0] and TIMESPEC[1], respectively. |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
69 FD must be either negative -- in which case it is ignored -- |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
70 or a file descriptor that is open on FILE. |
6297
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
71 If FD is nonnegative, then FILE can be NULL, which means |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
72 use just futimes (or equivalent) instead of utimes (or equivalent), |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
73 and fail if on an old system without futimes (or equivalent). |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
74 If TIMESPEC is null, set the time stamps to the current time. |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
75 Return 0 on success, -1 (setting errno) on failure. */ |
5147 | 76 |
77 int | |
8842
7605663b153e
* lib/utimens.c (gl_futimens): Rename from futimens,
Jim Meyering <jim@meyering.net>
parents:
7897
diff
changeset
|
78 gl_futimens (int fd ATTRIBUTE_UNUSED, |
7605663b153e
* lib/utimens.c (gl_futimens): Rename from futimens,
Jim Meyering <jim@meyering.net>
parents:
7897
diff
changeset
|
79 char const *file, struct timespec const timespec[2]) |
5147 | 80 { |
7712
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
81 /* Some Linux-based NFS clients are buggy, and mishandle time stamps |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
82 of files in NFS file systems in some cases. We have no |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
83 configure-time test for this, but please see |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
84 <http://bugs.gentoo.org/show_bug.cgi?id=132673> for references to |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
85 some of the problems with Linux 2.6.16. If this affects you, |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
86 compile with -DHAVE_BUGGY_NFS_TIME_STAMPS; this is reported to |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
87 help in some cases, albeit at a cost in performance. But you |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
88 really should upgrade your kernel to a fixed version, since the |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
89 problem affects many applications. */ |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
90 |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
91 #if HAVE_BUGGY_NFS_TIME_STAMPS |
7713
064005e1c3c3
Prefer fd < 0 to ! (0 <= fd).
Paul Eggert <eggert@cs.ucla.edu>
parents:
7712
diff
changeset
|
92 if (fd < 0) |
064005e1c3c3
Prefer fd < 0 to ! (0 <= fd).
Paul Eggert <eggert@cs.ucla.edu>
parents:
7712
diff
changeset
|
93 sync (); |
064005e1c3c3
Prefer fd < 0 to ! (0 <= fd).
Paul Eggert <eggert@cs.ucla.edu>
parents:
7712
diff
changeset
|
94 else |
7712
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
95 fsync (fd); |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
96 #endif |
aead3397193a
* lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
Paul Eggert <eggert@cs.ucla.edu>
parents:
7302
diff
changeset
|
97 |
10133
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
98 /* POSIX 200x added two interfaces to set file timestamps with |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
99 nanosecond resolution. */ |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
100 #if HAVE_UTIMENSAT |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
101 if (fd < 0) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
102 return utimensat (AT_FDCWD, file, timespec, 0); |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
103 #endif |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
104 #if HAVE_FUTIMENS |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
105 return futimens (fd, timespec); |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
106 #else |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
107 |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
108 /* The platform lacks an interface to set file timestamps with |
5147 | 109 nanosecond resolution, so do the best we can, discarding any |
110 fractional part of the timestamp. */ | |
6297
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
111 { |
10133
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
112 # if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
113 struct timeval timeval[2]; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
114 struct timeval const *t; |
6297
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
115 if (timespec) |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
116 { |
10133
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
117 timeval[0].tv_sec = timespec[0].tv_sec; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
118 timeval[0].tv_usec = timespec[0].tv_nsec / 1000; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
119 timeval[1].tv_sec = timespec[1].tv_sec; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
120 timeval[1].tv_usec = timespec[1].tv_nsec / 1000; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
121 t = timeval; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
122 } |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
123 else |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
124 t = NULL; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
125 |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
126 if (fd < 0) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
127 { |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
128 # if HAVE_FUTIMESAT |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
129 return futimesat (AT_FDCWD, file, t); |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
130 # endif |
6297
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
131 } |
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
132 else |
10133
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
133 { |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
134 /* If futimesat or futimes fails here, don't try to speed things |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
135 up by returning right away. glibc can incorrectly fail with |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
136 errno == ENOENT if /proc isn't mounted. Also, Mandrake 10.0 |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
137 in high security mode doesn't allow ordinary users to read |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
138 /proc/self, so glibc incorrectly fails with errno == EACCES. |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
139 If errno == EIO, EPERM, or EROFS, it's probably safe to fail |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
140 right away, but these cases are rare enough that they're not |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
141 worth optimizing, and who knows what other messed-up systems |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
142 are out there? So play it safe and fall back on the code |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
143 below. */ |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
144 # if HAVE_FUTIMESAT |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
145 if (futimesat (fd, NULL, t) == 0) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
146 return 0; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
147 # elif HAVE_FUTIMES |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
148 if (futimes (fd, t) == 0) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
149 return 0; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
150 # endif |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
151 } |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
152 # endif /* HAVE_FUTIMESAT || HAVE_WORKING_UTIMES */ |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
153 |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
154 if (!file) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
155 { |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
156 # if ! (HAVE_FUTIMESAT || (HAVE_WORKING_UTIMES && HAVE_FUTIMES)) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
157 errno = ENOSYS; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
158 # endif |
6297
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
159 |
10133
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
160 /* Prefer EBADF to ENOSYS if both error numbers apply. */ |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
161 if (errno == ENOSYS) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
162 { |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
163 int fd2 = dup (fd); |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
164 int dup_errno = errno; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
165 if (0 <= fd2) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
166 close (fd2); |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
167 errno = (fd2 < 0 && dup_errno == EBADF ? EBADF : ENOSYS); |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
168 } |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
169 |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
170 return -1; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
171 } |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
172 |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
173 # if HAVE_WORKING_UTIMES |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
174 return utimes (file, t); |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
175 # else |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
176 { |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
177 struct utimbuf utimbuf; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
178 struct utimbuf const *ut; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
179 if (timespec) |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
180 { |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
181 utimbuf.actime = timespec[0].tv_sec; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
182 utimbuf.modtime = timespec[1].tv_sec; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
183 ut = &utimbuf; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
184 } |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
185 else |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
186 ut = NULL; |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
187 |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
188 return utime (file, ut); |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
189 } |
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
190 # endif /* !HAVE_WORKING_UTIMES */ |
6297
10379892281e
* utimens.c (ENOSYS): Define if not already defined.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6283
diff
changeset
|
191 } |
10133
bbccff5988c3
Prefer new POSIX 200x interfaces over futimesat.
Eric Blake <ebb9@byu.net>
parents:
9613
diff
changeset
|
192 #endif /* !HAVE_FUTIMENS */ |
5147 | 193 } |
5485
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
194 |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
195 /* Set the access and modification time stamps of FILE to be |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
196 TIMESPEC[0] and TIMESPEC[1], respectively. */ |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
197 int |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
198 utimens (char const *file, struct timespec const timespec[2]) |
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
199 { |
8842
7605663b153e
* lib/utimens.c (gl_futimens): Rename from futimens,
Jim Meyering <jim@meyering.net>
parents:
7897
diff
changeset
|
200 return gl_futimens (-1, file, timespec); |
5485
863556283cee
(__attribute__, ATTRIBUTE_UNUSED): New macros.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5147
diff
changeset
|
201 } |