forked from mirrors/linux
		
	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: Michal Marek <mmarek@suse.cz>
This commit is contained in:
		
							parent
							
								
									53e6892c04
								
							
						
					
					
						commit
						a8b8017c34
					
				
					 3 changed files with 50 additions and 15 deletions
				
			
		|  | @ -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 | ||||||
| # 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 @@ | ||||||
| 
 | 
 | ||||||
| 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, | ||||||
| 			 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, | ||||||
| 		(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, | ||||||
| 		       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, | ||||||
| 		(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, | ||||||
| 		       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, | ||||||
| 		(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) | ||||||
| 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) | ||||||
| 		"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[]) | ||||||
| 	char *args, *type; | 	char *args, *type; | ||||||
| 	int ec = 0; | 	int ec = 0; | ||||||
| 	int line_nr = 0; | 	int line_nr = 0; | ||||||
|  | 	const char *filename; | ||||||
| 
 | 
 | ||||||
| 	if (2 != argc) { | 	default_mtime = time(NULL); | ||||||
|  | 	while (1) { | ||||||
|  | 		int opt = getopt(argc, argv, "t:h"); | ||||||
|  | 		char *invalid; | ||||||
|  | 
 | ||||||
|  | 		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); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Michal Marek
						Michal Marek