Commit a8b8017c authored by Michal Marek's avatar Michal Marek

initramfs: Use KBUILD_BUILD_TIMESTAMP for generated entries

gen_init_cpio gets the current time and uses it for each symlink,
special file, and directory.  Grab the current time once and make it
possible to override it with the KBUILD_BUILD_TIMESTAMP variable for
reproducible builds.
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent 53e6892c
...@@ -205,7 +205,8 @@ gcc -W... options for more extensive build-time checking. ...@@ -205,7 +205,8 @@ gcc -W... options for more extensive build-time checking.
KBUILD_BUILD_TIMESTAMP KBUILD_BUILD_TIMESTAMP
-------------------------------------------------- --------------------------------------------------
Setting this to a date string overrides the timestamp used in the Setting this to a date string overrides the timestamp used in the
UTS_VERSION definition (uname -v in the running kernel). The default value UTS_VERSION definition (uname -v in the running kernel). The value has to
be a string that can be passed to date -d. The default value
is the output of the date command at one point during build. is the output of the date command at one point during build.
KBUILD_BUILD_USER, KBUILD_BUILD_HOST KBUILD_BUILD_USER, KBUILD_BUILD_HOST
......
...@@ -287,8 +287,15 @@ done ...@@ -287,8 +287,15 @@ done
# we are carefull to delete tmp files # we are carefull to delete tmp files
if [ ! -z ${output_file} ]; then if [ ! -z ${output_file} ]; then
if [ -z ${cpio_file} ]; then if [ -z ${cpio_file} ]; then
timestamp=
if test -n "$KBUILD_BUILD_TIMESTAMP"; then
timestamp="$(date -d"$KBUILD_BUILD_TIMESTAMP" +%s || :)"
if test -n "$timestamp"; then
timestamp="-t $timestamp"
fi
fi
cpio_tfile="$(mktemp ${TMPDIR:-/tmp}/cpiofile.XXXXXX)" cpio_tfile="$(mktemp ${TMPDIR:-/tmp}/cpiofile.XXXXXX)"
usr/gen_init_cpio ${cpio_list} > ${cpio_tfile} usr/gen_init_cpio $timestamp ${cpio_list} > ${cpio_tfile}
else else
cpio_tfile=${cpio_file} cpio_tfile=${cpio_file}
fi fi
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
static unsigned int offset; static unsigned int offset;
static unsigned int ino = 721; static unsigned int ino = 721;
static time_t default_mtime;
struct file_handler { struct file_handler {
const char *type; const char *type;
...@@ -102,7 +103,6 @@ static int cpio_mkslink(const char *name, const char *target, ...@@ -102,7 +103,6 @@ static int cpio_mkslink(const char *name, const char *target,
unsigned int mode, uid_t uid, gid_t gid) unsigned int mode, uid_t uid, gid_t gid)
{ {
char s[256]; char s[256];
time_t mtime = time(NULL);
if (name[0] == '/') if (name[0] == '/')
name++; name++;
...@@ -114,7 +114,7 @@ static int cpio_mkslink(const char *name, const char *target, ...@@ -114,7 +114,7 @@ static int cpio_mkslink(const char *name, const char *target,
(long) uid, /* uid */ (long) uid, /* uid */
(long) gid, /* gid */ (long) gid, /* gid */
1, /* nlink */ 1, /* nlink */
(long) mtime, /* mtime */ (long) default_mtime, /* mtime */
(unsigned)strlen(target)+1, /* filesize */ (unsigned)strlen(target)+1, /* filesize */
3, /* major */ 3, /* major */
1, /* minor */ 1, /* minor */
...@@ -152,7 +152,6 @@ static int cpio_mkgeneric(const char *name, unsigned int mode, ...@@ -152,7 +152,6 @@ static int cpio_mkgeneric(const char *name, unsigned int mode,
uid_t uid, gid_t gid) uid_t uid, gid_t gid)
{ {
char s[256]; char s[256];
time_t mtime = time(NULL);
if (name[0] == '/') if (name[0] == '/')
name++; name++;
...@@ -164,7 +163,7 @@ static int cpio_mkgeneric(const char *name, unsigned int mode, ...@@ -164,7 +163,7 @@ static int cpio_mkgeneric(const char *name, unsigned int mode,
(long) uid, /* uid */ (long) uid, /* uid */
(long) gid, /* gid */ (long) gid, /* gid */
2, /* nlink */ 2, /* nlink */
(long) mtime, /* mtime */ (long) default_mtime, /* mtime */
0, /* filesize */ 0, /* filesize */
3, /* major */ 3, /* major */
1, /* minor */ 1, /* minor */
...@@ -242,7 +241,6 @@ static int cpio_mknod(const char *name, unsigned int mode, ...@@ -242,7 +241,6 @@ static int cpio_mknod(const char *name, unsigned int mode,
unsigned int maj, unsigned int min) unsigned int maj, unsigned int min)
{ {
char s[256]; char s[256];
time_t mtime = time(NULL);
if (dev_type == 'b') if (dev_type == 'b')
mode |= S_IFBLK; mode |= S_IFBLK;
...@@ -259,7 +257,7 @@ static int cpio_mknod(const char *name, unsigned int mode, ...@@ -259,7 +257,7 @@ static int cpio_mknod(const char *name, unsigned int mode,
(long) uid, /* uid */ (long) uid, /* uid */
(long) gid, /* gid */ (long) gid, /* gid */
1, /* nlink */ 1, /* nlink */
(long) mtime, /* mtime */ (long) default_mtime, /* mtime */
0, /* filesize */ 0, /* filesize */
3, /* major */ 3, /* major */
1, /* minor */ 1, /* minor */
...@@ -460,7 +458,7 @@ static int cpio_mkfile_line(const char *line) ...@@ -460,7 +458,7 @@ static int cpio_mkfile_line(const char *line)
static void usage(const char *prog) static void usage(const char *prog)
{ {
fprintf(stderr, "Usage:\n" fprintf(stderr, "Usage:\n"
"\t%s <cpio_list>\n" "\t%s [-t <timestamp>] <cpio_list>\n"
"\n" "\n"
"<cpio_list> is a file containing newline separated entries that\n" "<cpio_list> is a file containing newline separated entries that\n"
"describe the files to be included in the initramfs archive:\n" "describe the files to be included in the initramfs archive:\n"
...@@ -491,7 +489,11 @@ static void usage(const char *prog) ...@@ -491,7 +489,11 @@ static void usage(const char *prog)
"nod /dev/console 0600 0 0 c 5 1\n" "nod /dev/console 0600 0 0 c 5 1\n"
"dir /root 0700 0 0\n" "dir /root 0700 0 0\n"
"dir /sbin 0755 0 0\n" "dir /sbin 0755 0 0\n"
"file /sbin/kinit /usr/src/klibc/kinit/kinit 0755 0 0\n", "file /sbin/kinit /usr/src/klibc/kinit/kinit 0755 0 0\n"
"\n"
"<timestamp> is time in seconds since Epoch that will be used\n"
"as mtime for symlinks, special files and directories. The default\n"
"is to use the current time for these entries.\n",
prog); prog);
} }
...@@ -529,17 +531,42 @@ int main (int argc, char *argv[]) ...@@ -529,17 +531,42 @@ int main (int argc, char *argv[])
char *args, *type; char *args, *type;
int ec = 0; int ec = 0;
int line_nr = 0; int line_nr = 0;
const char *filename;
default_mtime = time(NULL);
while (1) {
int opt = getopt(argc, argv, "t:h");
char *invalid;
if (2 != argc) { if (opt == -1)
break;
switch (opt) {
case 't':
default_mtime = strtol(optarg, &invalid, 10);
if (!*optarg || *invalid) {
fprintf(stderr, "Invalid timestamp: %s\n",
optarg);
usage(argv[0]);
exit(1);
}
break;
case 'h':
case '?':
usage(argv[0]);
exit(opt == 'h' ? 0 : 1);
}
}
if (argc - optind != 1) {
usage(argv[0]); usage(argv[0]);
exit(1); exit(1);
} }
filename = argv[optind];
if (!strcmp(argv[1], "-")) if (!strcmp(filename, "-"))
cpio_list = stdin; cpio_list = stdin;
else if (! (cpio_list = fopen(argv[1], "r"))) { else if (!(cpio_list = fopen(filename, "r"))) {
fprintf(stderr, "ERROR: unable to open '%s': %s\n\n", fprintf(stderr, "ERROR: unable to open '%s': %s\n\n",
argv[1], strerror(errno)); filename, strerror(errno));
usage(argv[0]); usage(argv[0]);
exit(1); exit(1);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment