95 lines
1.8 KiB
C
95 lines
1.8 KiB
C
/* ----------------------------------------------------------------------- *
|
|
*
|
|
* Copyright 2010 Gene Cumm
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, Inc., 53 Temple Place Ste 330,
|
|
* Boston MA 02111-1307, USA; either version 2 of the License, or
|
|
* (at your option) any later version; incorporated herein by reference.
|
|
*
|
|
* ----------------------------------------------------------------------- */
|
|
|
|
/*
|
|
* mk-lba-img.c
|
|
*
|
|
* Makes an image that contains the LBA in every *word of every sector
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#define NUM_SECT (256*63+1)
|
|
#define BPS (512)
|
|
#define SECT_INT (BPS / sizeof(unsigned int))
|
|
|
|
typedef unsigned char uint8_t;
|
|
typedef unsigned int uint32_t;
|
|
|
|
const char DEF_FN[] = "-";
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int i, rv = 0, one = 0;
|
|
unsigned int lba, b[SECT_INT];
|
|
int len;
|
|
FILE *f;
|
|
uint8_t tt = 0;
|
|
const char *fn;
|
|
|
|
if (argc >= 2) {
|
|
if (argc >= 3) {
|
|
if (strcasecmp("-1", argv[1]) == 0) {
|
|
fn = argv[2];
|
|
one = 1;
|
|
} else {
|
|
fn = argv[1];
|
|
}
|
|
} else {
|
|
fn = argv[1];
|
|
}
|
|
} else {
|
|
fn = DEF_FN;
|
|
}
|
|
|
|
if (!strcmp(fn, "-"))
|
|
f = stdout;
|
|
else
|
|
f = fopen(fn, "w");
|
|
|
|
if (!f) {
|
|
fprintf(stderr, "%s: %s: unable to open for writing: %s\n",
|
|
argv[0], fn, strerror(errno));
|
|
return 1;
|
|
}
|
|
|
|
lba = 0;
|
|
while ((len = fread(b, 1, BPS, stdin))) {
|
|
if (len < BPS)
|
|
memset((char *)b + len, 0, BPS - len);
|
|
fwrite(b, 1, BPS, f);
|
|
lba++;
|
|
}
|
|
|
|
memset(b, 0, sizeof b);
|
|
|
|
while (lba < NUM_SECT) {
|
|
if (one) {
|
|
b[0] = lba;
|
|
} else {
|
|
for (i = 0; i < SECT_INT; i++)
|
|
b[i] = lba;
|
|
}
|
|
fwrite(b, 1, BPS, f);
|
|
lba++;
|
|
}
|
|
|
|
if (f != stdout)
|
|
fclose(f);
|
|
|
|
return rv;
|
|
}
|