| 227 | #endif |
| 228 | |
| 229 | int check_MD(disk_t *disk_car, partition_t *partition, const int verbose) |
| 230 | { |
| 231 | #ifndef DISABLED_FOR_FRAMAC |
| 232 | unsigned char *buffer=(unsigned char*)MALLOC(MD_SB_BYTES); |
| 233 | /* MD version 1.1 */ |
| 234 | if(disk_car->pread(disk_car, buffer, MD_SB_BYTES, partition->part_offset) == MD_SB_BYTES) |
| 235 | { |
| 236 | const struct mdp_superblock_1 *sb1=(const struct mdp_superblock_1 *)buffer; |
| 237 | if(le32(sb1->md_magic)==(unsigned int)MD_SB_MAGIC && |
| 238 | le32(sb1->major_version)==1 && |
| 239 | le64(sb1->super_offset)==0 && |
| 240 | test_MD(disk_car, (struct mdp_superblock_s*)buffer, partition, 0)==0) |
| 241 | { |
| 242 | #ifndef DISABLED_FOR_FRAMAC |
| 243 | log_info("check_MD 1.1\n"); |
| 244 | #endif |
| 245 | set_MD_info((struct mdp_superblock_s*)buffer, partition, verbose); |
| 246 | free(buffer); |
| 247 | return 0; |
| 248 | } |
| 249 | if(be32(sb1->md_magic)==(unsigned int)MD_SB_MAGIC && |
| 250 | be32(sb1->major_version)==1 && |
| 251 | be64(sb1->super_offset)==0 && |
| 252 | test_MD_be(disk_car, (struct mdp_superblock_s*)buffer, partition, 0)==0) |
| 253 | { |
| 254 | #ifndef DISABLED_FOR_FRAMAC |
| 255 | log_info("check_MD 1.1 (BigEndian)\n"); |
| 256 | #endif |
| 257 | set_MD_info_be((struct mdp_superblock_s*)buffer, partition, verbose); |
| 258 | free(buffer); |
| 259 | return 0; |
| 260 | } |
| 261 | } |
| 262 | /* MD version 1.2 */ |
| 263 | if(disk_car->pread(disk_car, buffer, MD_SB_BYTES, partition->part_offset + 4096) == MD_SB_BYTES) |
| 264 | { |
| 265 | const struct mdp_superblock_1 *sb1=(const struct mdp_superblock_1 *)buffer; |
| 266 | if(le32(sb1->md_magic)==(unsigned int)MD_SB_MAGIC && |
| 267 | le32(sb1->major_version)==1 && |
| 268 | le64(sb1->super_offset)==8 && |
| 269 | test_MD(disk_car, (struct mdp_superblock_s*)buffer, partition, 0)==0) |
| 270 | { |
| 271 | #ifndef DISABLED_FOR_FRAMAC |
| 272 | log_info("check_MD 1.2\n"); |
| 273 | #endif |
| 274 | set_MD_info((struct mdp_superblock_s*)buffer, partition, verbose); |
| 275 | free(buffer); |
| 276 | return 0; |
| 277 | } |
| 278 | if(be32(sb1->md_magic)==(unsigned int)MD_SB_MAGIC && |
| 279 | be32(sb1->major_version)==1 && |
| 280 | be64(sb1->super_offset)==8 && |
| 281 | test_MD_be(disk_car, (struct mdp_superblock_s*)buffer, partition, 0)==0) |
| 282 | { |
| 283 | #ifndef DISABLED_FOR_FRAMAC |
| 284 | log_info("check_MD 1.2 (BigEndian)\n"); |
| 285 | #endif |
| 286 | set_MD_info_be((struct mdp_superblock_s*)buffer, partition, verbose); |
no test coverage detected