int main(void) { getparts("ican.hascheez.com/tags/dogs"); getparts("yep.net/path/path2/test.html"); getparts("google.com/index.html"); getparts("test.php"); getparts("folder/folded.html"); getparts("test.com/folder"); getparts("folder2/newfile.txt"); getparts("/folder3/newerfile.txt"); getparts("../newfolder/horiz.php"); getparts("/../../upone.php"); }
static int dkwedge_discover_mbr(struct disk *pdk, struct vnode *vp) { mbr_args_t a; a.pdk = pdk; a.secsize = DEV_BSIZE << pdk->dk_blkshift; a.vp = vp; a.buf = malloc(a.secsize, M_DEVBUF, M_WAITOK); a.error = 0; a.mbr_count = 0; getparts(&a, MBR_BBSECTOR, 0); if (a.mbr_count != 0) a.error = 0; /* found it, wedges installed */ else if (a.error == 0) a.error = ESRCH; /* no MBRs found */ free(a.buf, M_DEVBUF); return (a.error); }
int main(int argc, char **argv) { int sd, ch, changed; char name[MAXPATHLEN]; int force; /* force label update */ int raw; /* update on-disk label as well */ int verbose; /* verbose output */ int write_it; /* update in-core label if changed */ force = 0; raw = 0; verbose = 1; write_it = 0; while ((ch = getopt(argc, argv, "fqrw")) != -1) { switch (ch) { case 'f': force = 1; break; case 'q': verbose = 0; break; case 'r': raw = 1; break; case 'w': write_it = 1; break; default: usage(); } } argc -= optind; argv += optind; if (argc != 1) usage(); rawpart = getrawpartition(); if (rawpart < 0) err(EXIT_FAILURE, "getrawpartition"); if ((sd = opendisk(argv[0], write_it ? O_RDWR : O_RDONLY, name, (size_t)MAXPATHLEN, 1)) < 0) { perror(argv[0]); exit(1); } getlabel(sd); changed = getparts(sd, verbose); if (verbose) { putchar('\n'); showpartitions(stdout, &label, 0); putchar('\n'); } if (write_it) { if (! changed && ! force) printf("No change; not updating disk label.\n"); else { if (verbose) printf("Updating in-core %sdisk label.\n", raw ? "and on-disk " : ""); raw = 0; /* XXX */ setlabel(sd, raw); } } else { printf("Not updating disk label.\n"); } close(sd); return (0); }
static void getparts(mbr_args_t *a, uint32_t off, uint32_t extoff) { struct dkwedge_info dkw; struct mbr_partition *dp; struct mbr_sector *mbr; const char *ptype; int i, error; error = dkwedge_read(a->pdk, a->vp, off, a->buf, a->secsize); if (error) { aprint_error("%s: unable to read MBR @ %u/%u, " "error = %d\n", a->pdk->dk_name, off, a->secsize, a->error); a->error = error; return; } mbr = a->buf; if (mbr->mbr_magic != htole16(MBR_MAGIC)) return; dp = mbr->mbr_parts; for (i = 0; i < MBR_PART_COUNT; i++) { /* Extended partitions are handled below. */ if (dp[i].mbrp_type == 0 || MBR_IS_EXTENDED(dp[i].mbrp_type)) continue; if ((ptype = mbr_ptype_to_str(dp[i].mbrp_type)) == NULL) { /* * XXX Should probably just add these... * XXX maybe just have an empty ptype? */ aprint_verbose("%s: skipping partition %d, " "type 0x%02x\n", a->pdk->dk_name, i, dp[i].mbrp_type); continue; } strcpy(dkw.dkw_ptype, ptype); strcpy(dkw.dkw_parent, a->pdk->dk_name); dkw.dkw_offset = le32toh(dp[i].mbrp_start); dkw.dkw_size = le32toh(dp[i].mbrp_size); /* * These get historical disk naming style * wedge names. We start at 'e', and reserve * 4 slots for each MBR we parse. * * XXX For FAT, we should extract the FAT volume * XXX name. */ snprintf(dkw.dkw_wname, sizeof(dkw.dkw_wname), "%s%c", a->pdk->dk_name, 'e' + (a->mbr_count * MBR_PART_COUNT) + i); error = dkwedge_add(&dkw); if (error == EEXIST) aprint_error("%s: wedge named '%s' already " "exists, manual intervention required\n", a->pdk->dk_name, dkw.dkw_wname); else if (error) aprint_error("%s: error %d adding partition " "%d type 0x%02x\n", a->pdk->dk_name, error, (a->mbr_count * MBR_PART_COUNT) + i, dp[i].mbrp_type); } /* We've parsed one MBR. */ a->mbr_count++; /* Recursively scan extended partitions. */ for (i = 0; i < MBR_PART_COUNT; i++) { uint32_t poff; if (MBR_IS_EXTENDED(dp[i].mbrp_type)) { poff = le32toh(dp[i].mbrp_start) + extoff; getparts(a, poff, extoff ? extoff : poff); } } }