static int probe_viaraid(blkid_probe pr, const struct blkid_idmag *mag) { uint64_t off; struct via_metadata *v; if (pr->size < 0x10000) return -1; if (!S_ISREG(pr->mode) && !blkid_probe_is_wholedisk(pr)) return -1; off = ((pr->size / 0x200)-1) * 0x200; v = (struct via_metadata *) blkid_probe_get_buffer(pr, off, sizeof(struct via_metadata)); if (!v) return -1; if (le16_to_cpu(v->signature) != VIA_SIGNATURE) return -1; if (v->version_number > 2) return -1; if (!via_checksum(v)) return -1; if (blkid_probe_sprintf_version(pr, "%u", v->version_number) != 0) return -1; if (blkid_probe_set_magic(pr, off, sizeof(v->signature), (unsigned char *) &v->signature)) return -1; return 0; }
/* * The blkid_do_probe() backend. */ static int superblocks_probe(blkid_probe pr, struct blkid_chain *chn) { size_t i; int rc = BLKID_PROBE_NONE; if (!pr || chn->idx < -1) return -EINVAL; blkid_probe_chain_reset_values(pr, chn); if (pr->flags & BLKID_FL_NOSCAN_DEV) return BLKID_PROBE_NONE; if (pr->size <= 0 || (pr->size <= 1024 && !S_ISCHR(pr->mode))) /* Ignore very very small block devices or regular files (e.g. * extended partitions). Note that size of the UBI char devices * is 1 byte */ return BLKID_PROBE_NONE; DBG(LOWPROBE, ul_debug("--> starting probing loop [SUBLKS idx=%d]", chn->idx)); i = chn->idx < 0 ? 0 : chn->idx + 1U; for ( ; i < ARRAY_SIZE(idinfos); i++) { const struct blkid_idinfo *id; const struct blkid_idmag *mag = NULL; uint64_t off = 0; chn->idx = i; id = idinfos[i]; if (chn->fltr && blkid_bmp_get_item(chn->fltr, i)) { DBG(LOWPROBE, ul_debug("filter out: %s", id->name)); rc = BLKID_PROBE_NONE; continue; } if (id->minsz && id->minsz > pr->size) { rc = BLKID_PROBE_NONE; continue; /* the device is too small */ } /* don't probe for RAIDs, swap or journal on CD/DVDs */ if ((id->usage & (BLKID_USAGE_RAID | BLKID_USAGE_OTHER)) && blkid_probe_is_cdrom(pr)) { rc = BLKID_PROBE_NONE; continue; } /* don't probe for RAIDs on floppies */ if ((id->usage & BLKID_USAGE_RAID) && blkid_probe_is_tiny(pr)) { rc = BLKID_PROBE_NONE; continue; } DBG(LOWPROBE, ul_debug("[%zd] %s:", i, id->name)); rc = blkid_probe_get_idmag(pr, id, &off, &mag); if (rc < 0) break; if (rc != BLKID_PROBE_OK) continue; /* final check by probing function */ if (id->probefunc) { DBG(LOWPROBE, ul_debug("\tcall probefunc()")); rc = id->probefunc(pr, mag); if (rc != BLKID_PROBE_OK) { blkid_probe_chain_reset_values(pr, chn); if (rc < 0) break; continue; } } /* all cheks passed */ if (chn->flags & BLKID_SUBLKS_TYPE) rc = blkid_probe_set_value(pr, "TYPE", (unsigned char *) id->name, strlen(id->name) + 1); if (!rc) rc = blkid_probe_set_usage(pr, id->usage); if (!rc && mag) rc = blkid_probe_set_magic(pr, off, mag->len, (unsigned char *) mag->magic); if (rc) { blkid_probe_chain_reset_values(pr, chn); DBG(LOWPROBE, ul_debug("failed to set result -- ignore")); continue; } DBG(LOWPROBE, ul_debug("<-- leaving probing loop (type=%s) [SUBLKS idx=%d]", id->name, chn->idx)); return BLKID_PROBE_OK; } DBG(LOWPROBE, ul_debug("<-- leaving probing loop (failed=%d) [SUBLKS idx=%d]", rc, chn->idx)); return rc; }