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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
9 later version.
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
10
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
14 GNU General Public License for more details.
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
15
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
18
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
19 /* Written by Paul Eggert. */
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
20
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
21 /* derived from a function in touch.c */
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
24
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
25 #include "utimens.h"
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
716071856296 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6297
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
33 #if HAVE_UTIME_H
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
34 # include <utime.h>
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
35 #endif
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
36
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
37 /* Some systems (even some that do have <utime.h>) don't declare this
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
38 structure anywhere. */
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
39 #ifndef HAVE_STRUCT_UTIMBUF
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
40 struct utimbuf
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
41 {
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
42 long actime;
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
43 long modtime;
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
44 };
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
45 #endif
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
76
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
109 nanosecond resolution, so do the best we can, discarding any
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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
3249aec7f48c Import from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
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 }