70 lines
1.7 KiB
C
70 lines
1.7 KiB
C
#include <stdio.h>
|
|
#include <time.h> /* time_t */
|
|
#include <sys/types.h>
|
|
#include "partx.h"
|
|
|
|
#define SOLARIS_X86_NUMSLICE 8
|
|
#define SOLARIS_X86_VTOC_SANE (0x600DDEEEUL)
|
|
|
|
struct solaris_x86_slice {
|
|
unsigned short s_tag; /* ID tag of partition */
|
|
unsigned short s_flag; /* permision flags */
|
|
daddr_t s_start; /* start sector no of partition */
|
|
long s_size; /* # of blocks in partition */
|
|
};
|
|
|
|
struct solaris_x86_vtoc {
|
|
unsigned long v_bootinfo[3]; /* info for mboot */
|
|
unsigned long v_sanity; /* to verify vtoc sanity */
|
|
unsigned long v_version; /* layout version */
|
|
char v_volume[8]; /* volume name */
|
|
unsigned short v_sectorsz; /* sector size in bytes */
|
|
unsigned short v_nparts; /* number of partitions */
|
|
unsigned long v_reserved[10]; /* free space */
|
|
struct solaris_x86_slice
|
|
v_slice[SOLARIS_X86_NUMSLICE]; /* slice headers */
|
|
time_t timestamp[SOLARIS_X86_NUMSLICE]; /* timestamp */
|
|
char v_asciilabel[128]; /* for compatibility */
|
|
};
|
|
|
|
int
|
|
read_solaris_pt(int fd, struct slice all, struct slice *sp, int ns) {
|
|
struct solaris_x86_vtoc *v;
|
|
struct solaris_x86_slice *s;
|
|
unsigned int offset = all.start;
|
|
int i, n;
|
|
unsigned char *bp;
|
|
|
|
bp = getblock(fd, offset+1); /* 1 sector suffices */
|
|
if (bp == NULL)
|
|
return -1;
|
|
|
|
v = (struct solaris_x86_vtoc *) bp;
|
|
if(v->v_sanity != SOLARIS_X86_VTOC_SANE)
|
|
return -1;
|
|
|
|
if(v->v_version != 1) {
|
|
fprintf(stderr, "Cannot handle solaris version %ld vtoc\n",
|
|
v->v_version);
|
|
return 0;
|
|
}
|
|
|
|
for(i=0, n=0; i<SOLARIS_X86_NUMSLICE; i++) {
|
|
s = &v->v_slice[i];
|
|
|
|
if (s->s_size == 0)
|
|
continue;
|
|
if (n < ns) {
|
|
sp[n].start = offset + s->s_start;
|
|
sp[n].size = s->s_size;
|
|
n++;
|
|
} else {
|
|
fprintf(stderr,
|
|
"solaris_x86_partition: too many slices\n");
|
|
break;
|
|
}
|
|
}
|
|
return n;
|
|
}
|
|
|