16 static void write_cpio_record(const char *ptr, const char *data, struct stat *st)
23 data_start = size = pad(sizeof(*hdr) + strlen(ptr) + 1);
25 size += pad(strlen(data)+1);
28 cpio_rec = (char *)hdr;
31 sprintf(hdr->c_magic, "%6.6s", CPIO_MAGIC);
32 sprintf(hdr->c_ino, "%8.8x", 0);
33 sprintf(hdr->c_mode, "%8.8x", st->st_mode);
34 sprintf(hdr->c_uid, "%8.8x", 0);
35 sprintf(hdr->c_gid, "%8.8x", 0);
36 sprintf(hdr->c_nlink, "%8.8x", 0);
37 sprintf(hdr->c_mtime, "%8.8x", 0);
38 sprintf(hdr->c_filesize, "%8.8x", data ? strlen(data)+1 : 0);
39 sprintf(hdr->c_devmajor, "%8.8x", 0);
40 sprintf(hdr->c_devminor, "%8.8x", 0);
41 sprintf(hdr->c_rdevmajor, "%8.8x", major(st->st_rdev));
42 sprintf(hdr->c_rdevminor, "%8.8x", minor(st->st_rdev));
43 sprintf(hdr->c_namesize, "%8.8x", strlen(ptr)+1);
44 sprintf(hdr->c_checksum, "%8.8x", 0);
45 memcpy(hdr+1, ptr, strlen(ptr));
47 memcpy(cpio_rec+data_start, data, strlen(data));
49 fprintf(stderr, "got size %d\n", size);
51 write(STDOUT_FILENO, cpio_rec, size);
54 static int parse_rwx(char thing)
65 static int parse_rwx_group(char **data, int mult)
68 int x = parse_rwx(*ptr++) + parse_rwx(*ptr++) + parse_rwx(*ptr++);
73 static int parse_mode(char **data, unsigned int *mode)
79 *mode |= S_IFCHR; break;
81 *mode |= S_IFLNK; break;
83 *mode |= S_IFDIR; break;
85 *mode |= S_IFBLK; break;
87 *mode |= S_IFREG; break;
89 fprintf(stderr, "unknown mode %c\n", *ptr);
93 *mode |= (parse_rwx_group(data, 8*8) + parse_rwx_group(data, 8) + parse_rwx_group(data, 1));
97 void parse_major_minor(char **data, struct stat *st)
99 char *ptr = *data, *end;
102 if (S_ISDIR(st->st_mode)) {
104 } else if (S_ISLNK(st->st_mode)) {
105 strtoul(ptr, &end, 10);
110 maj = strtoul(ptr, &end, 10);
115 min = strtoul(ptr, &end, 10);
118 st->st_rdev = makedev(maj, min);
128 /** chomp whitespace from the end of the string */
132 while ((len > 0) && isspace(str[len-1]))
138 static void parse_link_name(char *ptr, char **data)
140 char *arrow = strstr(ptr, " -> ");
147 fprintf(stderr, "got name '%s' and link '%s'\n", ptr, *data);
151 int main(int argc, char **argv) {
156 fprintf(stderr, "%s\n", argv[0]);
160 while ((fgets(buf, sizeof(buf), stdin))) {
165 memset(&st, 0, sizeof(st));
166 fprintf(stderr, "\ngot line '%s'\n", buf);
168 parse_mode(&ptr, &st.st_mode);
169 fprintf(stderr, "got st_mode %o\n", st.st_mode);
172 parse_major_minor(&ptr, &st);
173 fprintf(stderr, "got maj %d min %d\n", major(st.st_rdev), minor(st.st_rdev));
174 fprintf(stderr, "got name '%s'\n", ptr);
176 if (S_ISLNK(st.st_mode))
177 parse_link_name(ptr, &data);
178 write_cpio_record(ptr, data, &st);
181 memset(&st, 0, sizeof(st));
182 write_cpio_record("TRAILER!!!", NULL, &st);