]>
git.saurik.com Git - apple/file_cmds.git/blob - gzip/futimens.c
2 * Copyright (c) 2015 Jilles Tjoelker
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
44 int futimens(int fd
, const struct timespec times
[2]);
47 futimens(int fd
, const struct timespec times
[2])
49 struct timeval now
, tv
[2], *tvp
;
52 if (times
== NULL
|| (times
[0].tv_nsec
== UTIME_NOW
&&
53 times
[1].tv_nsec
== UTIME_NOW
))
55 else if (times
[0].tv_nsec
== UTIME_OMIT
&&
56 times
[1].tv_nsec
== UTIME_OMIT
)
59 if ((times
[0].tv_nsec
< 0 || times
[0].tv_nsec
> 999999999) &&
60 times
[0].tv_nsec
!= UTIME_NOW
&&
61 times
[0].tv_nsec
!= UTIME_OMIT
) {
65 if ((times
[1].tv_nsec
< 0 || times
[1].tv_nsec
> 999999999) &&
66 times
[1].tv_nsec
!= UTIME_NOW
&&
67 times
[1].tv_nsec
!= UTIME_OMIT
) {
71 tv
[0].tv_sec
= times
[0].tv_sec
;
72 tv
[0].tv_usec
= times
[0].tv_nsec
/ 1000;
73 tv
[1].tv_sec
= times
[1].tv_sec
;
74 tv
[1].tv_usec
= times
[1].tv_nsec
/ 1000;
76 if (times
[0].tv_nsec
== UTIME_OMIT
||
77 times
[1].tv_nsec
== UTIME_OMIT
) {
78 if (fstat(fd
, &sb
) == -1)
80 if (times
[0].tv_nsec
== UTIME_OMIT
) {
81 tv
[0].tv_sec
= sb
.st_atimespec
.tv_sec
;
82 tv
[0].tv_usec
= sb
.st_atimespec
.tv_nsec
/ 1000;
84 if (times
[1].tv_nsec
== UTIME_OMIT
) {
85 tv
[1].tv_sec
= sb
.st_mtimespec
.tv_sec
;
86 tv
[1].tv_usec
= sb
.st_mtimespec
.tv_nsec
/ 1000;
89 if (times
[0].tv_nsec
== UTIME_NOW
||
90 times
[1].tv_nsec
== UTIME_NOW
) {
91 if (gettimeofday(&now
, NULL
) == -1)
93 if (times
[0].tv_nsec
== UTIME_NOW
)
95 if (times
[1].tv_nsec
== UTIME_NOW
)
99 return (futimes(fd
, tvp
));