0001
0002
0003
0004
0005
0006
0007
0008 #include "check.h"
0009
0010
0011
0012
0013
0014 struct volumeid {
0015 u8 vid_unused[248];
0016 u8 vid_mac[8];
0017 };
0018
0019
0020
0021
0022
0023 struct dkconfig {
0024 u8 ios_unused0[128];
0025 __be32 ios_slcblk;
0026 __be16 ios_slccnt;
0027 u8 ios_unused1[122];
0028 };
0029
0030
0031
0032
0033
0034 struct dkblk0 {
0035 struct volumeid dk_vid;
0036 struct dkconfig dk_ios;
0037 };
0038
0039
0040
0041
0042
0043 struct slice {
0044 __be32 nblocks;
0045 __be32 blkoff;
0046 };
0047
0048
0049 int sysv68_partition(struct parsed_partitions *state)
0050 {
0051 int i, slices;
0052 int slot = 1;
0053 Sector sect;
0054 unsigned char *data;
0055 struct dkblk0 *b;
0056 struct slice *slice;
0057 char tmp[64];
0058
0059 data = read_part_sector(state, 0, §);
0060 if (!data)
0061 return -1;
0062
0063 b = (struct dkblk0 *)data;
0064 if (memcmp(b->dk_vid.vid_mac, "MOTOROLA", sizeof(b->dk_vid.vid_mac))) {
0065 put_dev_sector(sect);
0066 return 0;
0067 }
0068 slices = be16_to_cpu(b->dk_ios.ios_slccnt);
0069 i = be32_to_cpu(b->dk_ios.ios_slcblk);
0070 put_dev_sector(sect);
0071
0072 data = read_part_sector(state, i, §);
0073 if (!data)
0074 return -1;
0075
0076 slices -= 1;
0077 snprintf(tmp, sizeof(tmp), "sysV68: %s(s%u)", state->name, slices);
0078 strlcat(state->pp_buf, tmp, PAGE_SIZE);
0079 slice = (struct slice *)data;
0080 for (i = 0; i < slices; i++, slice++) {
0081 if (slot == state->limit)
0082 break;
0083 if (be32_to_cpu(slice->nblocks)) {
0084 put_partition(state, slot,
0085 be32_to_cpu(slice->blkoff),
0086 be32_to_cpu(slice->nblocks));
0087 snprintf(tmp, sizeof(tmp), "(s%u)", i);
0088 strlcat(state->pp_buf, tmp, PAGE_SIZE);
0089 }
0090 slot++;
0091 }
0092 strlcat(state->pp_buf, "\n", PAGE_SIZE);
0093 put_dev_sector(sect);
0094 return 1;
0095 }