1 #ifndef TIMESTAMP_H 2 #define TIMESTAMP_H 3 4 /* $OpenPackages$ */ 5 /* $OpenBSD: timestamp.h,v 1.1 2001/05/23 12:34:51 espie Exp $ */ 6 7 /* 8 * Copyright (c) 2001 Marc Espie. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD 23 * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* This module handles time stamps on files in a relatively high-level way. 33 * Most of the interface is achieved through inlineable code. 34 * 35 * TIMESTAMP: opaque data type to store a date. 36 * ts_set_out_of_date(t): set up t so that it is out-of-date. 37 * b = is_out_of_date(t): check whether t is out-of-date. 38 * ts_set_from_stat(s, t): grab date out of stat(2) buffer. 39 * b = is_strictly_before(t1, t2): 40 * check whether t1 is before t2. 41 * stamp = timestamp2time_t(t): extract time_t from timestamp. 42 * ts_set_from_time_t(d, t): create timestamp from time_t. 43 * ts_set_from_now(n): grab current date. 44 */ 45 46 /* sysresult = set_times(name): set modification times on a file. 47 * system call results. 48 */ 49 50 #define Init_Timestamp() ts_set_from_now(now) 51 52 #ifndef TIMESTAMP_TYPE 53 #include "timestamp_t.h" 54 #endif 55 #ifdef USE_TIMESPEC 56 #define ts_set_out_of_date(t) (t).tv_sec = INT_MIN, (t).tv_nsec = 0 57 #define is_out_of_date(t) ((t).tv_sec == INT_MIN && (t).tv_nsec == 0) 58 #define ts_set_from_stat(s, t) \ 59 do { \ 60 (t).tv_sec = (s).st_mtime; \ 61 (t).tv_nsec = (s).st_mtimensec; \ 62 if (is_out_of_date(t)) \ 63 (t).tv_nsec++; \ 64 } while (0) 65 #define is_strictly_before(t1, t2) timespeccmp(&(t1), &(t2), <) 66 #define ts_set_from_time_t(d, t) \ 67 do { \ 68 (t).tv_sec = d; \ 69 (t).tv_nsec = 0; \ 70 if (is_out_of_date(t)) \ 71 (t).tv_nsec++; \ 72 } while (0) 73 #define ts_set_from_now(n) \ 74 do { \ 75 struct timeval tv; \ 76 gettimeofday(&tv, NULL); \ 77 TIMEVAL_TO_TIMESPEC(&(tv), &n); \ 78 } while (0) 79 #define timestamp2time_t(t) ((t).tv_sec) 80 #else 81 #define is_out_of_date(t) ((t) == INT_MIN) 82 #define ts_set_out_of_date(t) (t) = INT_MIN 83 #define ts_set_from_stat(s, t) \ 84 do { \ 85 (t) = (s).st_mtime; \ 86 if (is_out_of_date(t)) \ 87 (t)++; \ 88 } while (0) 89 #define is_strictly_before(t1, t2) ((t1) < (t2)) 90 #define ts_set_from_time_t(d, t) \ 91 do { \ 92 (t) = d; \ 93 if (is_out_of_date(t)) \ 94 (t)++; \ 95 } while (0) 96 #define ts_set_from_now(n) time(&(n)) 97 #define timestamp2time_t(t) (t) 98 #endif 99 100 extern int set_times(const char *); 101 102 extern TIMESTAMP now; /* The time at the start of this whole 103 * process */ 104 105 #endif 106