[klibc] [PATCH 2.5.69 3/3] Bandaids for gen_init_cpio and initramfs

Bryan O'Sullivan bos at serpentine.com
Fri May 23 00:36:16 PDT 2003


Last patch for now.  This gets gen_init_cpio into a state where it can
pick up a "kinit" binary from usr and stuff it into the cpio archive as
/sbin/init.  This is obviously a crock, but it suffices for testing
until something sane is done about integrating klibc into the kernel
tree.

The patch also adds a bit of instrumentation to initramfs.c, to try to
help flush out bug 740.

 init/do_mounts.c    |    2 +-
 init/initramfs.c    |   18 +++++++-----------
 usr/Makefile        |    2 +-
 usr/gen_init_cpio.c |   26 +++++++++++++++++++++++---
 4 files changed, 32 insertions(+), 16 deletions(-)

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1234  -> 1.1236 
#	    init/initramfs.c	1.6     -> 1.7    
#	    init/do_mounts.c	1.50    -> 1.51   
#	        usr/Makefile	1.6     -> 1.7    
#	 usr/gen_init_cpio.c	1.3     -> 1.5    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/05/22	bos at serpentine.internal.keyresearch.com	1.1235
# Add /sbin/init to cpio archive.
# --------------------------------------------
# 03/05/22	bos at serpentine.internal.keyresearch.com	1.1236
# More small fixes to get initramfs closer to working.
# --------------------------------------------
#
diff -Nru a/init/do_mounts.c b/init/do_mounts.c
--- a/init/do_mounts.c	Thu May 22 15:40:19 2003
+++ b/init/do_mounts.c	Thu May 22 15:40:19 2003
@@ -123,7 +123,7 @@
 	int part;
 
 	if (strncmp(name, "initramfs", 9) == 0 || strcmp(name, "/dev/nfs") == 0) {
-		ROOT_DEV = Root_InitRamFS;
+		res = Root_InitRamFS;
 		goto nada;
 	}
 
diff -Nru a/init/initramfs.c b/init/initramfs.c
--- a/init/initramfs.c	Thu May 22 15:40:19 2003
+++ b/init/initramfs.c	Thu May 22 15:40:19 2003
@@ -8,10 +8,7 @@
 #include <linux/delay.h>
 #include <linux/string.h>
 
-static void __init error(char *x)
-{
-	panic("populate_root: %s\n", x);
-}
+#define error(x...) panic("populate_root: " x)
 
 static void __init *malloc(int size)
 {
@@ -63,7 +60,7 @@
 	}
 	q = (struct hash *)malloc(sizeof(struct hash));
 	if (!q)
-		error("can't allocate link hash entry");
+		error("can't allocate link hash entry\n");
 	q->ino = ino;
 	q->minor = minor;
 	q->major = major;
@@ -223,7 +220,7 @@
 	while(count && *victim == '\0')
 		eat(1);
 	if (count && (this_header & 3))
-		error("broken padding");
+		error("broken padding\n");
 	return 1;
 }
 
@@ -330,7 +327,7 @@
 			state = Start;
 			continue;
 		} else
-			error("junk in compressed archive");
+			error("junk in compressed archive\n");
 	}
 }
 
@@ -372,7 +369,6 @@
 #define STATIC static
 
 static void flush_window(void);
-static void error(char *m);
 static void gzip_mark(void **);
 static void gzip_release(void **);
 
@@ -415,7 +411,7 @@
 	name_buf = malloc(N_ALIGN(PATH_MAX));
 	window = malloc(WSIZE);
 	if (!window || !header_buf || !symlink_buf || !name_buf)
-		error("can't allocate buffers");
+		error("can't allocate buffers\n");
 	state = Start;
 	this_header = 0;
 	while (len) {
@@ -441,9 +437,9 @@
 		crc = (ulg)0xffffffffL; /* shift register contents */
 		makecrc();
 		if (gunzip())
-			error("ungzip failed");
+			error("ungzip failed\n");
 		if (state != Reset)
-			error("junk in gzipped archive");
+			error("junk in gzipped archive: state %d\n", state);
 		this_header = saved_offset + inptr;
 		buf += inptr;
 		len -= inptr;
diff -Nru a/usr/Makefile b/usr/Makefile
--- a/usr/Makefile	Thu May 22 15:40:19 2003
+++ b/usr/Makefile	Thu May 22 15:40:19 2003
@@ -20,7 +20,7 @@
 # initramfs-y := $(obj)/root/hello
 
 quiet_cmd_cpio = CPIO    $@
-      cmd_cpio = ./$< > $@
+      cmd_cpio = ./$< $(obj) > $@
 
 $(obj)/initramfs_data.cpio: $(obj)/gen_init_cpio $(initramfs-y) FORCE
 	$(call if_changed,cpio)
diff -Nru a/usr/gen_init_cpio.c b/usr/gen_init_cpio.c
--- a/usr/gen_init_cpio.c	Thu May 22 15:40:19 2003
+++ b/usr/gen_init_cpio.c	Thu May 22 15:40:19 2003
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
@@ -138,8 +139,7 @@
 	push_rest(name);
 }
 
-/* Not marked static to keep the compiler quiet, as no one uses this yet... */
-void cpio_mkfile(const char *filename, const char *location,
+static void cpio_mkfile(const char *filename, const char *location,
 			unsigned int mode, uid_t uid, gid_t gid)
 {
 	char s[256];
@@ -201,7 +201,7 @@
 	free(filebuf);
 	push_pad();
 	return;
-	
+
 error_free:
 	free(filebuf);
 error_close:
@@ -212,9 +212,29 @@
 
 int main (int argc, char *argv[])
 {
+	struct stat st;
+	char *objdir;
+	char *kinit;
+
+	if (argc != 2) {
+		fprintf(stderr, "usage: %s objdir\n", argv[0]);
+		exit(1);
+	}
+
+	objdir = argv[1];
+
 	cpio_mkdir("/dev", 0700, 0, 0);
 	cpio_mknod("/dev/console", 0600, 0, 0, 'c', 5, 1);
+	cpio_mkdir("/proc", 0700, 0, 0);
 	cpio_mkdir("/root", 0700, 0, 0);
+	cpio_mkdir("/sys", 0700, 0, 0);
+	cpio_mkdir("/sbin", 0700, 0, 0);
+	if (asprintf(&kinit, "%s/kinit", objdir) == -1) {
+		perror("asprintf");
+		exit(1);
+	}
+	if (stat(kinit, &st) == 0)
+		cpio_mkfile(kinit, "/sbin/init", 0700, 0, 0);
 	cpio_trailer();
 
 	exit(0);





More information about the klibc mailing list