static void test_birthtime (const struct stat *statinfo, const struct timespec *modtimes, struct timespec *birthtimes) { int i; /* Collect the birth times.. */ for (i = 0; i < NFILES; ++i) { birthtimes[i] = get_stat_birthtime (&statinfo[i]); if (birthtimes[i].tv_nsec < 0) return; } ASSERT (modtimes[0].tv_sec < birthtimes[1].tv_sec); /* mtime(stamp1) < birthtime(renamed) */ ASSERT (birthtimes[1].tv_sec < modtimes[2].tv_sec); /* birthtime(renamed) < mtime(stamp2) */ }
bool pred_fprintf (const char *pathname, struct stat *stat_buf, struct predicate *pred_ptr) { struct format_val *dest = &pred_ptr->args.printf_vec; struct segment *segment; for (segment = dest->segment; segment; segment = segment->next) { if ( (KIND_FORMAT == segment->segkind) && segment->format_char[1]) /* Component of date. */ { struct timespec ts; int valid = 0; switch (segment->format_char[0]) { case 'A': ts = get_stat_atime (stat_buf); valid = 1; break; case 'B': ts = get_stat_birthtime (stat_buf); if ('@' == segment->format_char[1]) valid = 1; else valid = (ts.tv_nsec >= 0); break; case 'C': ts = get_stat_ctime (stat_buf); valid = 1; break; case 'T': ts = get_stat_mtime (stat_buf); valid = 1; break; default: assert (0); abort (); } /* We trust the output of format_date not to contain * nasty characters, though the value of the date * is itself untrusted data. */ if (valid) { /* trusted */ checked_fprintf (dest, segment->text, format_date (ts, segment->format_char[1])); } else { /* The specified timestamp is not available, output * nothing for the timestamp, but use the rest (so that * for example find foo -printf '[%Bs] %p\n' can print * "[] foo"). */ /* trusted */ checked_fprintf (dest, segment->text, ""); } } else { /* Print a segment which is not a date. */ do_fprintf (dest, segment, pathname, stat_buf); } } return true; }