Add SOURCE_DATE_EPOCH support as documented in [1].
[1] https://reproducible-builds.org/specs/source-date-epoch
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
#include <unistd.h>
#endif
#include <fcntl.h>
-#include <time.h>
#if HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#endif
#include "ext2_fs.h"
-#include "ext2fs.h"
+#include "ext2fsP.h"
struct set_badblock_record {
ext2_badblocks_iterate bb_iter;
if (retval)
goto cleanup;
- now = fs->now ? fs->now : time(0);
+ now = ext2fsP_get_time(fs);
ext2fs_inode_xtime_set(&inode, i_atime, now);
if (!ext2fs_inode_xtime_get(&inode, i_ctime))
ext2fs_inode_xtime_set(&inode, i_ctime, now);
fs_state = fs->super->s_state;
feature_incompat = fs->super->s_feature_incompat;
- ext2fs_set_tstamp(fs->super, s_wtime, fs->now ? fs->now : time(NULL));
+ ext2fs_set_tstamp(fs->super, s_wtime, ext2fsP_get_time(fs));
fs->super->s_block_group_nr = 0;
/*
#define EXT2_FLAG_IGNORE_SWAP_DIRENT 0x8000000
/*
+ * Internal flags for use by the ext2fs library only
+ */
+#define EXT2_FLAG2_USE_FAKE_TIME 0x000000001
+
+/*
* Special flag in the ext2 inode i_flag field that means that this is
* a new inode. (So that ext2_write_inode() can clear extra fields.)
*/
int cluster_ratio_bits;
__u16 default_bitmap_type;
__u16 pad;
+ __u32 flags2;
/*
* Reserved for future expansion
*/
- __u32 reserved[5];
+ __u32 reserved[4];
/*
* Reserved for the use of the calling application.
#endif
}
+static inline time_t ext2fsP_get_time(ext2_filsys fs)
+{
+ if (fs->now || (fs->flags2 & EXT2_FLAG2_USE_FAKE_TIME))
+ return fs->now;
+ return time(NULL);
+}
+
/*
* Badblocks list
*/
#include "ext2_ext_attr.h"
#include "ext4_acl.h"
-#include "ext2fs.h"
+#include "ext2fsP.h"
static errcode_t read_ea_inode_hash(ext2_filsys fs, ext2_ino_t ino, __u32 *hash)
{
goto write_out;
inode.i_links_count = 0;
- inode.i_dtime = fs->now ? fs->now : time(0);
+ inode.i_dtime = ext2fsP_get_time(fs);
ret = ext2fs_free_ext_attr(fs, ino, &inode);
if (ret)
#endif
#include "ext2_fs.h"
-#include "ext2fs.h"
+#include "ext2fsP.h"
#ifndef O_BINARY
#define O_BINARY 0
fs->flags |= EXT2_FLAG_SWAP_BYTES;
#endif
- time_env = ext2fs_safe_getenv("E2FSPROGS_FAKE_TIME");
- if (time_env)
+ time_env = ext2fs_safe_getenv("SOURCE_DATE_EPOCH");
+ if (time_env) {
fs->now = strtoul(time_env, NULL, 0);
+ fs->flags2 |= EXT2_FLAG2_USE_FAKE_TIME;
+ } else {
+ time_env = ext2fs_safe_getenv("E2FSPROGS_FAKE_TIME");
+ if (time_env)
+ fs->now = strtoul(time_env, NULL, 0);
+ }
io_flags = IO_FLAG_RW;
if (flags & EXT2_FLAG_EXCLUSIVE)
}
set_field(s_checkinterval, 0);
- ext2fs_set_tstamp(super, s_mkfs_time, fs->now ? fs->now : time(NULL));
- ext2fs_set_tstamp(super, s_lastcheck, fs->now ? fs->now : time(NULL));
+ ext2fs_set_tstamp(super, s_mkfs_time, ext2fsP_get_time(fs));
+ ext2fs_set_tstamp(super, s_lastcheck, ext2fsP_get_time(fs));
super->s_creator_os = CREATOR_OS;
int size = EXT2_INODE_SIZE(fs->super);
struct ext2_inode_large *large_inode;
errcode_t retval;
- time_t t = fs->now ? fs->now : time(NULL);
+ time_t t = ext2fsP_get_time(fs);
if (!ext2fs_inode_xtime_get(inode, i_atime))
ext2fs_inode_xtime_set(inode, i_atime, t);
#include <errno.h>
#endif
#include <fcntl.h>
-#include <time.h>
#if HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#include "ext2_fs.h"
#include "e2p/e2p.h"
-#include "ext2fs.h"
+#include "ext2fsP.h"
#include "kernel-jbd.h"
inode_size = (unsigned long long)fs->blocksize *
(jparams->num_journal_blocks + jparams->num_fc_blocks);
- now = fs->now ? fs->now : time(0);
+ now = ext2fsP_get_time(fs);
ext2fs_inode_xtime_set(&inode, i_mtime, now);
ext2fs_inode_xtime_set(&inode, i_ctime, now);
inode.i_links_count = 1;
fs->flags |= EXT2_FLAG_MASTER_SB_ONLY;
fs->umask = 022;
- time_env = ext2fs_safe_getenv("E2FSPROGS_FAKE_TIME");
- if (time_env)
+ time_env = ext2fs_safe_getenv("SOURCE_DATE_EPOCH");
+ if (time_env) {
fs->now = strtoul(time_env, NULL, 0);
+ fs->flags2 |= EXT2_FLAG2_USE_FAKE_TIME;
+ } else {
+ time_env = ext2fs_safe_getenv("E2FSPROGS_FAKE_TIME");
+ if (time_env)
+ fs->now = strtoul(time_env, NULL, 0);
+ }
retval = ext2fs_get_mem(strlen(name)+1, &fs->device_name);
if (retval)
if (err)
goto out;
ext2fs_iblk_set(fs, &inode, 0);
- now = fs->now ? fs->now : time(0);
+ now = ext2fsP_get_time(fs);
ext2fs_inode_xtime_set(&inode, i_atime, now);
ext2fs_inode_xtime_set(&inode, i_ctime, now);
ext2fs_inode_xtime_set(&inode, i_mtime, now);
#include <string.h>
#include <time.h>
#include "ext2_fs.h"
-#include "ext2fs.h"
+#include "ext2fsP.h"
/*
* Iterate through the groups which hold BACKUP superblock/GDT copies in an
retval = ext2fs_inode_size_set(fs, &inode, inode_size);
if (retval)
goto out_free;
- inode.i_ctime = fs->now ? fs->now : time(0);
+ inode.i_ctime = ext2fsP_get_time(fs);
}
for (rsv_off = 0, gdt_off = fs->desc_blocks,
EXT2_I_SIZE(&inode));
#endif
if (inode_dirty) {
- time_t now = fs->now ? fs->now : time(0);
+ time_t now = ext2fsP_get_time(fs);
ext2fs_inode_xtime_set(&inode, i_atime, now);
ext2fs_inode_xtime_set(&inode, i_mtime, now);