kbuild: initramfs updates
[linux-flexiantxendom0-3.2.10.git] / usr / gen_init_cpio.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include <time.h>
8
9 static unsigned int offset;
10 static unsigned int ino = 721;
11
12 static void push_rest(const char *name)
13 {
14         unsigned int name_len = strlen(name) + 1;
15         unsigned int tmp_ofs;
16
17         fputs(name, stdout);
18         putchar(0);
19         offset += name_len;
20
21         tmp_ofs = name_len + 110;
22         while (tmp_ofs & 3) {
23                 putchar(0);
24                 offset++;
25                 tmp_ofs++;
26         }
27 }
28
29 static void push_hdr(const char *s)
30 {
31         fputs(s, stdout);
32         offset += 110;
33 }
34
35 static void cpio_trailer(void)
36 {
37         char s[256];
38         const char *name = "TRAILER!!!";
39
40         sprintf(s, "%s%08X%08X%08lX%08lX%08X%08lX"
41                "%08X%08X%08X%08X%08X%08X%08X",
42                 "070701",               /* magic */
43                 0,                      /* ino */
44                 0,                      /* mode */
45                 (long) 0,               /* uid */
46                 (long) 0,               /* gid */
47                 1,                      /* nlink */
48                 (long) 0,               /* mtime */
49                 0,                      /* filesize */
50                 0,                      /* major */
51                 0,                      /* minor */
52                 0,                      /* rmajor */
53                 0,                      /* rminor */
54                 strlen(name) + 1,       /* namesize */
55                 0);                     /* chksum */
56         push_hdr(s);
57         push_rest(name);
58
59         while (offset % 512) {
60                 putchar(0);
61                 offset++;
62         }
63 }
64
65 static void cpio_mkdir(const char *name, unsigned int mode,
66                        uid_t uid, gid_t gid)
67 {
68         char s[256];
69         time_t mtime = time(NULL);
70
71         sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
72                "%08X%08X%08X%08X%08X%08X%08X",
73                 "070701",               /* magic */
74                 ino++,                  /* ino */
75                 S_IFDIR | mode,         /* mode */
76                 (long) uid,             /* uid */
77                 (long) gid,             /* gid */
78                 2,                      /* nlink */
79                 (long) mtime,           /* mtime */
80                 0,                      /* filesize */
81                 3,                      /* major */
82                 1,                      /* minor */
83                 0,                      /* rmajor */
84                 0,                      /* rminor */
85                 strlen(name) + 1,       /* namesize */
86                 0);                     /* chksum */
87         push_hdr(s);
88         push_rest(name);
89 }
90
91 static void cpio_mknod(const char *name, unsigned int mode,
92                        uid_t uid, gid_t gid, int dev_type,
93                        unsigned int maj, unsigned int min)
94 {
95         char s[256];
96         time_t mtime = time(NULL);
97
98         if (dev_type == 'b')
99                 mode |= S_IFBLK;
100         else
101                 mode |= S_IFCHR;
102
103         sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
104                "%08X%08X%08X%08X%08X%08X%08X",
105                 "070701",               /* magic */
106                 ino++,                  /* ino */
107                 mode,                   /* mode */
108                 (long) uid,             /* uid */
109                 (long) gid,             /* gid */
110                 1,                      /* nlink */
111                 (long) mtime,           /* mtime */
112                 0,                      /* filesize */
113                 3,                      /* major */
114                 1,                      /* minor */
115                 maj,                    /* rmajor */
116                 min,                    /* rminor */
117                 strlen(name) + 1,       /* namesize */
118                 0);                     /* chksum */
119         push_hdr(s);
120         push_rest(name);
121 }
122
123 int main (int argc, char *argv[])
124 {
125         cpio_mkdir("/dev", 0700, 0, 0);
126         cpio_mknod("/dev/console", 0600, 0, 0, 'c', 5, 1);
127         cpio_mkdir("/root", 0700, 0, 0);
128         cpio_trailer();
129
130         exit(0);
131
132         /* silence compiler warnings */
133         return 0;
134         (void) argc;
135         (void) argv;
136 }
137