summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2005-09-16 07:50:33 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2005-09-16 07:50:33 +0000
commit158d982669d3d05079da2b9cc8d8fcd8adf35a4b (patch)
tree038bcb1def910a55323b86f5ee12bad2839161a5
parent3ecd35f56fbb7f9b3f43cd12f862336acf7dca56 (diff)
downloadcoreutils-158d982669d3d05079da2b9cc8d8fcd8adf35a4b.tar.xz
Include stat-time.h, and use its functions instead of the obsolete
TIMESPEC_NS macro.
-rw-r--r--src/copy.c7
-rw-r--r--src/cp.c7
-rw-r--r--src/date.c6
-rw-r--r--src/du.c48
-rw-r--r--src/install.c7
-rw-r--r--src/ls.c27
-rw-r--r--src/pr.c16
-rw-r--r--src/stat.c20
-rw-r--r--src/tail.c14
-rw-r--r--src/touch.c29
10 files changed, 79 insertions, 102 deletions
diff --git a/src/copy.c b/src/copy.c
index b19a8d871..ba6ce4860 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -45,6 +45,7 @@
#include "quote.h"
#include "same.h"
#include "savedir.h"
+#include "stat-time.h"
#include "utimecmp.h"
#include "utimens.h"
#include "xreadlink.h"
@@ -1567,10 +1568,8 @@ copy_internal (char const *src_name, char const *dst_name,
{
struct timespec timespec[2];
- timespec[0].tv_sec = src_sb.st_atime;
- timespec[0].tv_nsec = TIMESPEC_NS (src_sb.st_atim);
- timespec[1].tv_sec = src_sb.st_mtime;
- timespec[1].tv_nsec = TIMESPEC_NS (src_sb.st_mtim);
+ timespec[0] = get_stat_atime (&src_sb);
+ timespec[1] = get_stat_mtime (&src_sb);
if (utimens (dst_name, timespec) != 0)
{
diff --git a/src/cp.c b/src/cp.c
index 6605ebcf8..4e08612a0 100644
--- a/src/cp.c
+++ b/src/cp.c
@@ -33,6 +33,7 @@
#include "filenamecat.h"
#include "quote.h"
#include "quotearg.h"
+#include "stat-time.h"
#include "utimens.h"
#define ASSIGN_BASENAME_STRDUPA(Dest, File_name) \
@@ -304,10 +305,8 @@ re_protect (char const *const_dst_name, size_t src_offset,
{
struct timespec timespec[2];
- timespec[0].tv_sec = src_sb.st_atime;
- timespec[0].tv_nsec = TIMESPEC_NS (src_sb.st_atim);
- timespec[1].tv_sec = src_sb.st_mtime;
- timespec[1].tv_nsec = TIMESPEC_NS (src_sb.st_mtim);
+ timespec[0] = get_stat_atime (&src_sb);
+ timespec[1] = get_stat_mtime (&src_sb);
if (utimens (dst_name, timespec))
{
diff --git a/src/date.c b/src/date.c
index ebe63ac39..af9485b74 100644
--- a/src/date.c
+++ b/src/date.c
@@ -33,6 +33,7 @@
#include "inttostr.h"
#include "posixtm.h"
#include "quote.h"
+#include "stat-time.h"
#include "fprintftime.h"
/* The official name of this program (e.g., no `g' prefix). */
@@ -493,10 +494,9 @@ main (int argc, char **argv)
/* (option_specified_date || set_date) */
if (reference != NULL)
{
- if (stat (reference, &refstats))
+ if (stat (reference, &refstats) != 0)
error (EXIT_FAILURE, errno, "%s", reference);
- when.tv_sec = refstats.st_mtime;
- when.tv_nsec = TIMESPEC_NS (refstats.st_mtim);
+ when = get_stat_mtime (&refstats);
}
else
{
diff --git a/src/du.c b/src/du.c
index 08d29d241..84c9b4aad 100644
--- a/src/du.c
+++ b/src/du.c
@@ -41,6 +41,7 @@
#include "quotearg.h"
#include "readtokens0.h"
#include "same.h"
+#include "stat-time.h"
#include "strftime.h"
#include "xanstrftime.h"
#include "xfts.h"
@@ -84,10 +85,9 @@ struct duinfo
/* Size of files in directory. */
uintmax_t size;
- /* Latest time stamp found. If dmax == TYPE_MINIMUM (time_t) && nsec < 0,
- no time stamp has been found. */
- time_t dmax;
- int nsec;
+ /* Latest time stamp found. If tmax.tv_sec == TYPE_MINIMUM (time_t)
+ && tmax.tv_nsec < 0, no time stamp has been found. */
+ struct timespec tmax;
};
/* Initialize directory data. */
@@ -95,17 +95,16 @@ static inline void
duinfo_init (struct duinfo *a)
{
a->size = 0;
- a->dmax = TYPE_MINIMUM (time_t);
- a->nsec = -1;
+ a->tmax.tv_sec = TYPE_MINIMUM (time_t);
+ a->tmax.tv_nsec = -1;
}
/* Set directory data. */
static inline void
-duinfo_set (struct duinfo *a, uintmax_t size, time_t dmax, int nsec)
+duinfo_set (struct duinfo *a, uintmax_t size, struct timespec tmax)
{
a->size = size;
- a->dmax = dmax;
- a->nsec = nsec;
+ a->tmax = tmax;
}
/* Accumulate directory data. */
@@ -113,12 +112,8 @@ static inline void
duinfo_add (struct duinfo *a, struct duinfo const *b)
{
a->size += b->size;
- if (a->dmax < b->dmax
- || (a->dmax == b->dmax && a->nsec < b->nsec))
- {
- a->dmax = b->dmax;
- a->nsec = b->nsec;
- }
+ if (timespec_cmp (a->tmax, b->tmax) < 0)
+ a->tmax = b->tmax;
}
/* A structure for per-directory level information. */
@@ -406,27 +401,27 @@ hash_init (void)
}
/* FIXME: this code is nearly identical to code in date.c */
-/* Display the date and time in WHEN/NSEC according to the format specified
+/* Display the date and time in WHEN according to the format specified
in TIME_FORMAT. If TIME_FORMAT is NULL, use the standard output format.
Return zero if successful. */
static void
-show_date (const char *format, time_t when, int nsec)
+show_date (const char *format, struct timespec when)
{
char *out;
- struct tm *tm = localtime (&when);
+ struct tm *tm = localtime (&when.tv_sec);
if (! tm)
{
char buf[INT_BUFSIZE_BOUND (intmax_t)];
error (0, 0, _("time %s is out of range"),
(TYPE_SIGNED (time_t)
- ? imaxtostr (when, buf)
- : umaxtostr (when, buf)));
+ ? imaxtostr (when.tv_sec, buf)
+ : umaxtostr (when.tv_sec, buf)));
fputs (buf, stdout);
return;
}
- out = xanstrftime (format, tm, 0, nsec);
+ out = xanstrftime (format, tm, 0, when.tv_nsec);
fputs (out, stdout);
free (out);
}
@@ -450,7 +445,7 @@ print_size (const struct duinfo *pdui, const char *string)
if (opt_time)
{
putchar ('\t');
- show_date (time_format, pdui->dmax, pdui->nsec);
+ show_date (time_format, pdui->tmax);
}
printf ("\t%s%c", string, opt_nul_terminate_output ? '\0' : '\n');
fflush (stdout);
@@ -539,12 +534,9 @@ process_file (FTS *fts, FTSENT *ent)
(apparent_size
? sb->st_size
: ST_NBLOCKS (*sb) * ST_NBLOCKSIZE),
- (time_type == time_ctime ? sb->st_ctime
- : time_type == time_atime ? sb->st_atime
- : sb->st_mtime),
- (time_type == time_ctime ? TIMESPEC_NS (sb->st_ctim)
- : time_type == time_atime ? TIMESPEC_NS (sb->st_atim)
- : TIMESPEC_NS (sb->st_mtim)));
+ (time_type == time_mtime ? get_stat_mtime (sb)
+ : time_type == time_atime ? get_stat_atime (sb)
+ : get_stat_ctime (sb)));
}
level = ent->fts_level;
diff --git a/src/install.c b/src/install.c
index 49cc8d0ea..4925dc6f8 100644
--- a/src/install.c
+++ b/src/install.c
@@ -35,6 +35,7 @@
#include "mkdir-p.h"
#include "modechange.h"
#include "quote.h"
+#include "stat-time.h"
#include "utimens.h"
#include "xstrtol.h"
@@ -536,10 +537,8 @@ change_timestamps (const char *from, const char *to)
return false;
}
- timespec[0].tv_sec = stb.st_atime;
- timespec[0].tv_nsec = TIMESPEC_NS (stb.st_atim);
- timespec[1].tv_sec = stb.st_mtime;
- timespec[1].tv_nsec = TIMESPEC_NS (stb.st_mtim);
+ timespec[0] = get_stat_atime (&stb);
+ timespec[1] = get_stat_mtime (&stb);
if (utimens (to, timespec))
{
error (0, errno, _("cannot set time stamps for %s"), quote (to));
diff --git a/src/ls.c b/src/ls.c
index bd648dcce..298cf3dd3 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -123,6 +123,7 @@ int wcwidth ();
#include "quote.h"
#include "quotearg.h"
#include "same.h"
+#include "stat-time.h"
#include "strftime.h"
#include "strverscmp.h"
#include "xstrtol.h"
@@ -2855,7 +2856,8 @@ static inline int
cmp_ctime (struct fileinfo const *a, struct fileinfo const *b,
int (*cmp) (char const *, char const *))
{
- int diff = CTIME_CMP (b->stat, a->stat);
+ int diff = timespec_cmp (get_stat_ctime (&b->stat),
+ get_stat_ctime (&a->stat));
return diff ? diff : cmp (a->name, b->name);
}
static int compare_ctime (V a, V b) { return cmp_ctime (a, b, xstrcoll); }
@@ -2867,7 +2869,8 @@ static inline int
cmp_mtime (struct fileinfo const *a, struct fileinfo const *b,
int (*cmp) (char const *, char const *))
{
- int diff = MTIME_CMP (b->stat, a->stat);
+ int diff = timespec_cmp (get_stat_mtime (&b->stat),
+ get_stat_mtime (&a->stat));
return diff ? diff : cmp (a->name, b->name);
}
static int compare_mtime (V a, V b) { return cmp_mtime (a, b, xstrcoll); }
@@ -2879,7 +2882,8 @@ static inline int
cmp_atime (struct fileinfo const *a, struct fileinfo const *b,
int (*cmp) (char const *, char const *))
{
- int diff = ATIME_CMP (b->stat, a->stat);
+ int diff = timespec_cmp (get_stat_atime (&b->stat),
+ get_stat_atime (&a->stat));
return diff ? diff : cmp (a->name, b->name);
}
static int compare_atime (V a, V b) { return cmp_atime (a, b, xstrcoll); }
@@ -3231,7 +3235,8 @@ print_long_format (const struct fileinfo *f)
size_t s;
char *p;
time_t when;
- int when_ns IF_LINT (= 0);
+ int when_ns;
+ struct timespec when_timespec;
struct tm *when_local;
/* Compute mode string. On most systems, it's based on st_mode.
@@ -3245,19 +3250,19 @@ print_long_format (const struct fileinfo *f)
switch (time_type)
{
case time_ctime:
- when = f->stat.st_ctime;
- when_ns = TIMESPEC_NS (f->stat.st_ctim);
+ when_timespec = get_stat_ctime (&f->stat);
break;
case time_mtime:
- when = f->stat.st_mtime;
- when_ns = TIMESPEC_NS (f->stat.st_mtim);
+ when_timespec = get_stat_mtime (&f->stat);
break;
case time_atime:
- when = f->stat.st_atime;
- when_ns = TIMESPEC_NS (f->stat.st_atim);
+ when_timespec = get_stat_atime (&f->stat);
break;
}
+ when = when_timespec.tv_sec;
+ when_ns = when_timespec.tv_nsec;
+
p = buf;
if (print_inode)
@@ -3337,7 +3342,7 @@ print_long_format (const struct fileinfo *f)
p[-1] = ' ';
}
- when_local = localtime (&when);
+ when_local = localtime (&when_timespec.tv_sec);
s = 0;
*p = '\1';
diff --git a/src/pr.c b/src/pr.c
index 67ac6fe1a..4be18e307 100644
--- a/src/pr.c
+++ b/src/pr.c
@@ -319,6 +319,7 @@
#include "inttostr.h"
#include "mbswidth.h"
#include "quote.h"
+#include "stat-time.h"
#include "stdio--.h"
#include "strftime.h"
#include "xstrtol.h"
@@ -1656,7 +1657,7 @@ init_header (char *filename, int desc)
{
char *buf = NULL;
struct stat st;
- time_t s;
+ struct timespec t;
int ns;
struct tm *tm;
@@ -1664,25 +1665,22 @@ init_header (char *filename, int desc)
if (STREQ (filename, "-"))
desc = -1;
if (0 <= desc && fstat (desc, &st) == 0)
- {
- s = st.st_mtime;
- ns = TIMESPEC_NS (st.st_mtim);
- }
+ t = get_stat_mtime (&st);
else
{
static struct timespec timespec;
if (! timespec.tv_sec)
gettime (&timespec);
- s = timespec.tv_sec;
- ns = timespec.tv_nsec;
+ t = timespec;
}
- tm = localtime (&s);
+ ns = t.tv_nsec;
+ tm = localtime (&t.tv_sec);
if (tm == NULL)
{
buf = xmalloc (INT_BUFSIZE_BOUND (long int)
+ MAX (10, INT_BUFSIZE_BOUND (int)));
- sprintf (buf, "%ld.%09d", (long int) s, ns);
+ sprintf (buf, "%ld.%09d", (long int) t.tv_sec, ns);
}
else
{
diff --git a/src/stat.c b/src/stat.c
index 90f02bf27..c9c71c555 100644
--- a/src/stat.c
+++ b/src/stat.c
@@ -52,6 +52,7 @@
#include "inttostr.h"
#include "quote.h"
#include "quotearg.h"
+#include "stat-time.h"
#include "strftime.h"
#include "xreadlink.h"
@@ -280,18 +281,18 @@ human_access (struct stat const *statbuf)
}
static char *
-human_time (time_t t, int t_ns)
+human_time (struct timespec t)
{
static char str[MAX (INT_BUFSIZE_BOUND (intmax_t),
(INT_STRLEN_BOUND (int) /* YYYY */
+ 1 /* because YYYY might equal INT_MAX + 1900 */
+ sizeof "-MM-DD HH:MM:SS.NNNNNNNNN +ZZZZ"))];
- struct tm const *tm = localtime (&t);
+ struct tm const *tm = localtime (&t.tv_sec);
if (tm == NULL)
return (TYPE_SIGNED (time_t)
- ? imaxtostr (t, str)
- : umaxtostr (t, str));
- nstrftime (str, sizeof str, "%Y-%m-%d %H:%M:%S.%N %z", tm, 0, t_ns);
+ ? imaxtostr (t.tv_sec, str)
+ : umaxtostr (t.tv_sec, str));
+ nstrftime (str, sizeof str, "%Y-%m-%d %H:%M:%S.%N %z", tm, 0, t.tv_nsec);
return str;
}
@@ -506,8 +507,7 @@ print_stat (char *pformat, size_t buf_len, char m,
break;
case 'x':
xstrcat (pformat, buf_len, "s");
- printf (pformat, human_time (statbuf->st_atime,
- TIMESPEC_NS (statbuf->st_atim)));
+ printf (pformat, human_time (get_stat_atime (statbuf)));
break;
case 'X':
xstrcat (pformat, buf_len, TYPE_SIGNED (time_t) ? "ld" : "lu");
@@ -515,8 +515,7 @@ print_stat (char *pformat, size_t buf_len, char m,
break;
case 'y':
xstrcat (pformat, buf_len, "s");
- printf (pformat, human_time (statbuf->st_mtime,
- TIMESPEC_NS (statbuf->st_mtim)));
+ printf (pformat, human_time (get_stat_mtime (statbuf)));
break;
case 'Y':
xstrcat (pformat, buf_len, TYPE_SIGNED (time_t) ? "ld" : "lu");
@@ -524,8 +523,7 @@ print_stat (char *pformat, size_t buf_len, char m,
break;
case 'z':
xstrcat (pformat, buf_len, "s");
- printf (pformat, human_time (statbuf->st_ctime,
- TIMESPEC_NS (statbuf->st_ctim)));
+ printf (pformat, human_time (get_stat_ctime (statbuf)));
break;
case 'Z':
xstrcat (pformat, buf_len, TYPE_SIGNED (time_t) ? "ld" : "lu");
diff --git a/src/tail.c b/src/tail.c
index d6cdc8689..19b4992e1 100644
--- a/src/tail.c
+++ b/src/tail.c
@@ -40,6 +40,7 @@
#include "posixver.h"
#include "quote.h"
#include "safe-read.h"
+#include "stat-time.h"
#include "xnanosleep.h"
#include "xstrtol.h"
#include "xstrtod.h"
@@ -327,8 +328,7 @@ record_open_fd (struct File_spec *f, int fd,
{
f->fd = fd;
f->size = size;
- f->mtime.tv_sec = st->st_mtime;
- f->mtime.tv_nsec = TIMESPEC_NS (st->st_mtim);
+ f->mtime = get_stat_mtime (st);
f->dev = st->st_dev;
f->ino = st->st_ino;
f->mode = st->st_mode;
@@ -1039,10 +1039,9 @@ tail_forever (struct File_spec *f, int nfiles, double sleep_interval)
continue;
}
- if ((! S_ISREG (stats.st_mode) || f[i].size == stats.st_size)
- && f[i].mtime.tv_sec == stats.st_mtime
- && f[i].mtime.tv_nsec == TIMESPEC_NS (stats.st_mtim)
- && f[i].mode == stats.st_mode)
+ if (f[i].mode == stats.st_mode
+ && (! S_ISREG (stats.st_mode) || f[i].size == stats.st_size)
+ && timespec_cmp (f[i].mtime, get_stat_mtime (&stats)) == 0)
{
if ((max_n_unchanged_stats_between_opens
<= f[i].n_unchanged_stats++)
@@ -1057,8 +1056,7 @@ tail_forever (struct File_spec *f, int nfiles, double sleep_interval)
/* This file has changed. Print out what we can, and
then keep looping. */
- f[i].mtime.tv_sec = stats.st_mtime;
- f[i].mtime.tv_nsec = TIMESPEC_NS (stats.st_mtim);
+ f[i].mtime = get_stat_mtime (&stats);
f[i].mode = stats.st_mode;
/* reset counter */
diff --git a/src/touch.c b/src/touch.c
index c7d5c009c..1eaf8fa88 100644
--- a/src/touch.c
+++ b/src/touch.c
@@ -32,6 +32,7 @@
#include "posixver.h"
#include "quote.h"
#include "safe-read.h"
+#include "stat-time.h"
#include "utimens.h"
/* The official name of this program (e.g., no `g' prefix). */
@@ -170,22 +171,12 @@ touch (const char *file)
}
else
{
- if (change_times & CH_ATIME)
- timespec[0] = newtime[0];
- else
- {
- timespec[0].tv_sec = sbuf.st_atime;
- timespec[0].tv_nsec = TIMESPEC_NS (sbuf.st_atim);
- }
-
- if (change_times & CH_MTIME)
- timespec[1] = newtime[1];
- else
- {
- timespec[1].tv_sec = sbuf.st_mtime;
- timespec[1].tv_nsec = TIMESPEC_NS (sbuf.st_mtim);
- }
-
+ timespec[0] = (change_times & CH_ATIME
+ ? newtime[0]
+ : get_stat_atime (&sbuf));
+ timespec[1] = (change_times & CH_MTIME
+ ? newtime[1]
+ : get_stat_mtime (&sbuf));
t = timespec;
}
@@ -342,10 +333,8 @@ main (int argc, char **argv)
if (stat (ref_file, &ref_stats))
error (EXIT_FAILURE, errno,
_("failed to get attributes of %s"), quote (ref_file));
- newtime[0].tv_sec = ref_stats.st_atime;
- newtime[0].tv_nsec = TIMESPEC_NS (ref_stats.st_atim);
- newtime[1].tv_sec = ref_stats.st_mtime;
- newtime[1].tv_nsec = TIMESPEC_NS (ref_stats.st_mtim);
+ newtime[0] = get_stat_atime (&ref_stats);
+ newtime[1] = get_stat_mtime (&ref_stats);
date_set = true;
if (flex_date)
{