projects
/
gnulib.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Enclose definitions in #if for POSIX-draft like API.
[gnulib.git]
/
lib
/
utime.c
diff --git
a/lib/utime.c
b/lib/utime.c
index
dafa364
..
9ddb8b8
100644
(file)
--- a/
lib/utime.c
+++ b/
lib/utime.c
@@
-1,8
+1,9
@@
-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2001, 2002, 2003, 2004, 2006 Free Software
+ Foundation, Inc.
- This program is free software
;
you can redistribute it and/or modify it
+ This program is free software
:
you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
under the terms of the GNU General Public License as published by the
- Free Software Foundation; either version
2, or (at your option)
any
+ Free Software Foundation; either version
3 of the License, or
any
later version.
This program is distributed in the hope that it will be useful,
later version.
This program is distributed in the hope that it will be useful,
@@
-11,14
+12,11
@@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* derived from a function in touch.c */
/* derived from a function in touch.c */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include <config.h>
#undef utime
#include <sys/types.h>
#undef utime
#include <sys/types.h>
@@
-27,6
+25,15
@@
# include <utime.h>
#endif
# include <utime.h>
#endif
+#if !HAVE_UTIMES_NULL
+# include <sys/stat.h>
+# include <fcntl.h>
+#endif
+
+#include <unistd.h>
+#include <errno.h>
+
+#include "full-write.h"
#include "safe-read.h"
/* Some systems (even some that do have <utime.h>) don't declare this
#include "safe-read.h"
/* Some systems (even some that do have <utime.h>) don't declare this
@@
-39,6
+46,11
@@
struct utimbuf
};
#endif
};
#endif
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
/* Emulate utime (file, NULL) for systems (like 4.3BSD) that do not
interpret it to set the access and modification times of FILE to
the current time. Return 0 if successful, -1 if not. */
/* Emulate utime (file, NULL) for systems (like 4.3BSD) that do not
interpret it to set the access and modification times of FILE to
the current time. Return 0 if successful, -1 if not. */
@@
-52,21
+64,36
@@
utime_null (const char *file)
int fd;
char c;
int status = 0;
int fd;
char c;
int status = 0;
- struct stat sb;
+ struct stat st;
+ int saved_errno = 0;
fd = open (file, O_RDWR);
if (fd < 0
fd = open (file, O_RDWR);
if (fd < 0
- || fstat (fd, &s
b
) < 0
- || safe_read (fd, &c, sizeof
(char)) < 0
+ || fstat (fd, &s
t
) < 0
+ || safe_read (fd, &c, sizeof
c) == SAFE_READ_ERROR
|| lseek (fd, (off_t) 0, SEEK_SET) < 0
|| lseek (fd, (off_t) 0, SEEK_SET) < 0
- || full_write (fd, &c, sizeof
(char)) < 0
- /* Maybe do this -- it's necessary on SunOS4.1.3 with some combination
+ || full_write (fd, &c, sizeof
c) != sizeof c
+ /* Maybe do this -- it's necessary on SunOS
4.1.3 with some combination
of patches, but that system doesn't use this code: it has utimes.
|| fsync (fd) < 0
*/
of patches, but that system doesn't use this code: it has utimes.
|| fsync (fd) < 0
*/
- || ftruncate (fd, st.st_size) < 0
- || close (fd) < 0)
- status = -1;
+ || (st.st_size == 0 && ftruncate (fd, st.st_size) < 0))
+ {
+ saved_errno = errno;
+ status = -1;
+ }
+
+ if (0 <= fd)
+ {
+ if (close (fd) < 0)
+ status = -1;
+
+ /* If there was a prior failure, use the saved errno value.
+ But if the only failure was in the close, don't change errno. */
+ if (saved_errno)
+ errno = saved_errno;
+ }
+
return status;
#endif
}
return status;
#endif
}