aboutsummaryrefslogtreecommitdiffstats
path: root/usr
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@redhat.com>2002-11-01 02:02:04 -0500
committerJeff Garzik <jgarzik@redhat.com>2002-11-01 02:02:04 -0500
commita06650df599e79a1330dc21eca929b4b87f803ec (patch)
treea88a8c62a5a8356d80c4a601def279b2099ef525 /usr
parent2b738648aa4bd9d99f52e01120421feef6b16eb1 (diff)
downloadhistory-a06650df599e79a1330dc21eca929b4b87f803ec.tar.gz
Minimal initramfs support (based on Al Viro's work).
Diffstat (limited to 'usr')
-rw-r--r--usr/Makefile18
-rw-r--r--usr/gen_init_cpio.c137
2 files changed, 155 insertions, 0 deletions
diff --git a/usr/Makefile b/usr/Makefile
new file mode 100644
index 00000000000000..d3c2c0bb8773b6
--- /dev/null
+++ b/usr/Makefile
@@ -0,0 +1,18 @@
+
+include arch/$(ARCH)/Makefile
+
+obj-y := initramfs_data.o
+
+host-progs := gen_init_cpio
+
+clean-files := initramfs_data.cpio.gz
+
+$(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz
+ $(OBJCOPY) $(ARCHBLOBLFLAGS) \
+ --rename-section .data=.init.initramfs \
+ $(obj)/initramfs_data.cpio.gz $(obj)/initramfs_data.o
+ $(STRIP) -s $(obj)/initramfs_data.o
+
+$(obj)/initramfs_data.cpio.gz: $(obj)/gen_init_cpio
+ ( cd $(obj) ; ./gen_init_cpio | gzip -9c > initramfs_data.cpio.gz )
+
diff --git a/usr/gen_init_cpio.c b/usr/gen_init_cpio.c
new file mode 100644
index 00000000000000..a6024faf9d02d7
--- /dev/null
+++ b/usr/gen_init_cpio.c
@@ -0,0 +1,137 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+
+static unsigned int offset;
+static unsigned int ino = 721;
+
+static void push_rest(const char *name)
+{
+ unsigned int name_len = strlen(name) + 1;
+ unsigned int tmp_ofs;
+
+ fputs(name, stdout);
+ putchar(0);
+ offset += name_len;
+
+ tmp_ofs = name_len + 110;
+ while (tmp_ofs & 3) {
+ putchar(0);
+ offset++;
+ tmp_ofs++;
+ }
+}
+
+static void push_hdr(const char *s)
+{
+ fputs(s, stdout);
+ offset += 110;
+}
+
+static void cpio_trailer(void)
+{
+ char s[256];
+ const char *name = "TRAILER!!!";
+
+ sprintf(s, "%s%08X%08X%08lX%08lX%08X%08lX"
+ "%08X%08X%08X%08X%08X%08X%08X",
+ "070701", /* magic */
+ 0, /* ino */
+ 0, /* mode */
+ (long) 0, /* uid */
+ (long) 0, /* gid */
+ 1, /* nlink */
+ (long) 0, /* mtime */
+ 0, /* filesize */
+ 0, /* major */
+ 0, /* minor */
+ 0, /* rmajor */
+ 0, /* rminor */
+ strlen(name) + 1, /* namesize */
+ 0); /* chksum */
+ push_hdr(s);
+ push_rest(name);
+
+ while (offset % 512) {
+ putchar(0);
+ offset++;
+ }
+}
+
+static void cpio_mkdir(const char *name, unsigned int mode,
+ uid_t uid, gid_t gid)
+{
+ char s[256];
+ time_t mtime = time(NULL);
+
+ sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
+ "%08X%08X%08X%08X%08X%08X%08X",
+ "070701", /* magic */
+ ino++, /* ino */
+ S_IFDIR | mode, /* mode */
+ (long) uid, /* uid */
+ (long) gid, /* gid */
+ 2, /* nlink */
+ (long) mtime, /* mtime */
+ 0, /* filesize */
+ 3, /* major */
+ 1, /* minor */
+ 0, /* rmajor */
+ 0, /* rminor */
+ strlen(name) + 1, /* namesize */
+ 0); /* chksum */
+ push_hdr(s);
+ push_rest(name);
+}
+
+static void cpio_mknod(const char *name, unsigned int mode,
+ uid_t uid, gid_t gid, int dev_type,
+ unsigned int maj, unsigned int min)
+{
+ char s[256];
+ time_t mtime = time(NULL);
+
+ if (dev_type == 'b')
+ mode |= S_IFBLK;
+ else
+ mode |= S_IFCHR;
+
+ sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
+ "%08X%08X%08X%08X%08X%08X%08X",
+ "070701", /* magic */
+ ino++, /* ino */
+ mode, /* mode */
+ (long) uid, /* uid */
+ (long) gid, /* gid */
+ 1, /* nlink */
+ (long) mtime, /* mtime */
+ 0, /* filesize */
+ 3, /* major */
+ 1, /* minor */
+ maj, /* rmajor */
+ min, /* rminor */
+ strlen(name) + 1, /* namesize */
+ 0); /* chksum */
+ push_hdr(s);
+ push_rest(name);
+}
+
+int main (int argc, char *argv[])
+{
+ cpio_mkdir("/dev", 0700, 0, 0);
+ cpio_mknod("/dev/console", 0600, 0, 0, 'c', 5, 1);
+ cpio_mkdir("/root", 0700, 0, 0);
+ cpio_trailer();
+
+ exit(0);
+
+ /* silence compiler warnings */
+ return 0;
+ (void) argc;
+ (void) argv;
+}
+