URL
https://opencores.org/ocsvn/eco32/eco32/trunk
Subversion Repositories eco32
Compare Revisions
- This comparison shows the changes necessary to convert path
/eco32/tags/eco32-0.24/disk/tools/shpart
- from Rev 24 to Rev 211
- ↔ Reverse comparison
Rev 24 → Rev 211
/Makefile
0,0 → 1,36
# |
# Makefile for shpart utility |
# |
|
BUILD = ../../../build |
|
CC = gcc -m32 |
CFLAGS = -g -Wall |
LDFLAGS = -g |
LDLIBS = -lm |
|
SRCS = shpart.c |
OBJS = $(patsubst %.c,%.o,$(SRCS)) |
BIN = shpart |
|
.PHONY: all install clean |
|
all: $(BIN) |
|
install: $(BIN) |
mkdir -p $(BUILD)/bin |
cp $(BIN) $(BUILD)/bin |
|
$(BIN): $(OBJS) |
$(CC) $(LDFLAGS) -o $(BIN) $(OBJS) $(LDLIBS) |
|
%.o: %.c |
$(CC) $(CFLAGS) -o $@ -c $< |
|
depend.mak: |
$(CC) -MM -MG $(CFLAGS) $(SRCS) >depend.mak |
|
-include depend.mak |
|
clean: |
rm -f *~ $(OBJS) $(BIN) depend.mak |
/shpart.c
0,0 → 1,143
/* |
* shpart.c -- show partitions on a disk |
*/ |
|
|
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <stdarg.h> |
|
|
#define SECTOR_SIZE 512 |
#define NPE (SECTOR_SIZE / sizeof(PartEntry)) |
#define DESCR_SIZE 20 |
|
|
typedef struct { |
unsigned long type; |
unsigned long start; |
unsigned long size; |
char descr[DESCR_SIZE]; |
} PartEntry; |
|
PartEntry ptr[NPE]; |
|
|
/**************************************************************/ |
|
|
void error(char *fmt, ...) { |
va_list ap; |
|
va_start(ap, fmt); |
printf("Error: "); |
vprintf(fmt, ap); |
printf("\n"); |
va_end(ap); |
exit(1); |
} |
|
|
/**************************************************************/ |
|
|
unsigned long getNumber(unsigned char *p) { |
return (unsigned long) *(p + 0) << 24 | |
(unsigned long) *(p + 1) << 16 | |
(unsigned long) *(p + 2) << 8 | |
(unsigned long) *(p + 3) << 0; |
} |
|
|
void convertPartitionTable(PartEntry *e, int n) { |
int i; |
unsigned char *p; |
|
for (i = 0; i < n; i++) { |
p = (unsigned char *) &e[i]; |
e[i].type = getNumber(p + 0); |
e[i].start = getNumber(p + 4); |
e[i].size = getNumber(p + 8); |
} |
} |
|
|
/**************************************************************/ |
|
|
int main(int argc, char *argv[]) { |
char *diskName; |
FILE *disk; |
unsigned long diskSize; |
unsigned long numSectors; |
unsigned long partLast; |
int i, j; |
char c; |
|
/* check command line arguments */ |
if (argc != 2) { |
printf("Usage: %s <disk image file>\n", argv[0]); |
exit(1); |
} |
diskName = argv[1]; |
/* determine disk size */ |
disk = fopen(diskName, "rb"); |
if (disk == NULL) { |
error("cannot open disk image '%s'", diskName); |
} |
fseek(disk, 0, SEEK_END); |
diskSize = ftell(disk); |
numSectors = diskSize / SECTOR_SIZE; |
fclose(disk); |
printf("Disk '%s' has %lu (0x%lX) sectors.\n", |
diskName, numSectors, numSectors); |
if (numSectors < 32) { |
error("disk is too small"); |
} |
if (diskSize % SECTOR_SIZE != 0) { |
printf("Warning: disk size is not a multiple of sector size!\n"); |
} |
/* read partition table record */ |
disk = fopen(diskName, "rb"); |
if (disk == NULL) { |
error("cannot open disk image '%s'", diskName); |
} |
fseek(disk, 1 * SECTOR_SIZE, SEEK_SET); |
if (fread(ptr, 1, SECTOR_SIZE, disk) != SECTOR_SIZE) { |
error("cannot read partition table from disk image '%s'", diskName); |
} |
fclose(disk); |
convertPartitionTable(ptr, NPE); |
/* show partition table */ |
printf("Partitions:\n"); |
printf(" # b type start last size description\n"); |
for (i = 0; i < NPE; i++) { |
if (ptr[i].type != 0) { |
partLast = ptr[i].start + ptr[i].size - 1; |
} else { |
partLast = 0; |
} |
printf("%2d %s 0x%08lX 0x%08lX 0x%08lX 0x%08lX ", |
i, |
ptr[i].type & 0x80000000 ? "*" : " ", |
ptr[i].type & 0x7FFFFFFF, |
ptr[i].start, |
partLast, |
ptr[i].size); |
for (j = 0; j < DESCR_SIZE; j++) { |
c = ptr[i].descr[j]; |
if (c == '\0') { |
break; |
} |
if (c >= 0x20 && c < 0x7F) { |
printf("%c", c); |
} else { |
printf("."); |
} |
} |
printf("\n"); |
} |
/* done */ |
return 0; |
} |