View Source Document

amalgam8.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PAGESIZE    2048
#define PAGECOUNT    720

void write_block(FILE *, char *, int);
void make_bootable(FILE *);

char page[PAGESIZE];

/*
 * amalgam8 - take the various BefOS program binary files
 * and create a bootable disk image containing them.
 */
int
main(int argc, char **argv)
{
    int i = 1;
    FILE *outfile;

    if ((outfile = fopen(argv[1], "w")) == NULL)
        errx(1, "cannot create `%s'", argv[1]);

    /* blank out f by writing n number of blocks of zeroes to it */
    bzero(page, PAGESIZE);
    for (i = 0; i < PAGECOUNT; i++)
        fwrite(page, PAGESIZE, 1, outfile);

    for (i = 2; i < (argc-1); i += 2)
        write_block(outfile, argv[i], atoi(argv[i+1]));

    make_bootable(outfile);

    fclose(outfile);
}

void
write_block(FILE *outfile, char *filename, int pagepos)
{
    FILE *infile;
    int pos = pagepos * PAGESIZE;
    int block = 1;

    printf("writing %s at page %d...\n", filename, pagepos);
    if ((infile = fopen(filename, "r")) == NULL)
        errx(1, "cannot read `%s'", filename);

    while(!feof(infile)) {
        printf("\twriting block %d...\n", block++);
        bzero(page, PAGESIZE);
        fread(page, PAGESIZE, 1, infile);
        fseek(outfile, pos, SEEK_SET);
        fwrite(page, PAGESIZE, 1, outfile);
        pos += PAGESIZE;
    }
}

void
make_bootable(FILE *outfile)
{
    fseek(outfile, 510, SEEK_SET);
    fwrite("\x55\xaa", 2, 1, outfile);
}