/* * linux/zBoot/piggyback.c * * (C) 1993 Hannu Savolainen */ /* * This program reads the compressed system image from stdin and * encapsulates it into an object file written to the stdout. */ #include #include #include int main(int argc, char *argv[]) { int c, n=0, len=0; char tmp_buf[512*1024]; struct exec obj = {0x00640107}; /* object header */ char string_names[] = {"_input_data\0_input_len\0"}; struct nlist var_names[2] = /* Symbol table */ { { /* _input_data */ (char *)4, 7, 0, 0, 0 }, { /* _input_len */ (char *)16, 7, 0, 0, 0 } }; len = 0; while ((n = read(0, &tmp_buf[len], sizeof(tmp_buf)-len+1)) > 0) len += n; if (n==-1) { perror("stdin"); exit(-1); } if (len >= sizeof(tmp_buf)) { fprintf(stderr, "%s: Input too large\n", argv[0]); exit(-1); } fprintf(stderr, "Compressed size %d.\n", len); /* * Output object header */ obj.a_data = len + sizeof(long); obj.a_syms = sizeof(var_names); write(1, (char *)&obj, sizeof(obj)); /* * Output data segment (compressed system & len) */ write(1, tmp_buf, len); write(1, (char *)&len, sizeof(len)); /* * Output symbol table */ var_names[1].n_value = len; write(1, (char *)&var_names, sizeof(var_names)); /* * Output string table */ len = sizeof(string_names) + sizeof(len); write(1, (char *)&len, sizeof(len)); write(1, string_names, sizeof(string_names)); exit(0); }