From 07f99f1eae030e0ec6fb2d825b8e736786070e03 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 19 Aug 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-08-19 --- pc/devhard.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/pc/devhard.c b/pc/devhard.c index 0d324957632c8b125fd930a4fe9cfd89efb7da0b..7872f3325eb7fdc67b4bb04713b68cf345d37370 100644 --- a/pc/devhard.c +++ b/pc/devhard.c @@ -154,7 +154,7 @@ hardgen(Chan *c, Dirtab *tab, long ntab, long s, Dir *dirp) { Qid qid; int drive; - char name[NAMELEN]; + char name[NAMELEN+4]; Drive *dp; Partition *pp; ulong l; @@ -169,6 +169,7 @@ hardgen(Chan *c, Dirtab *tab, long ntab, long s, Dir *dirp) if(s < dp->npart){ pp = &dp->p[s]; sprint(name, "hd%d%s", drive, pp->name); + name[NAMELEN] = 0; qid.path = MKQID(drive, s); l = (pp->end - pp->start) * dp->bytes; } else @@ -472,8 +473,8 @@ hardxfer(Drive *dp, Partition *pp, int cmd, long start, long len) cp->cmd = cmd; cp->dp = dp; cp->sofar = 0; -print("xfer:\ttcyl %d, tsec %d, thead %d\n", cp->tcyl, cp->tsec, cp->thead); -print("\tnsecs %d, sofar %d\n", cp->nsecs, cp->sofar); +/*print("xfer:\ttcyl %d, tsec %d, thead %d\n", cp->tcyl, cp->tsec, cp->thead); +print("\tnsecs %d, sofar %d\n", cp->nsecs, cp->sofar);/**/ outb(cp->pbase+Pcount, cp->nsecs); outb(cp->pbase+Psector, cp->tsec); outb(cp->pbase+Pdh, (dp->drive<<4) | cp->thead); @@ -582,6 +583,18 @@ hardpart(Drive *dp) ulong n; int i; + cp = dp->cp; + qlock(cp); + if(waserror()){ + qunlock(cp); + print("error in hardpart\n"); + nexterror(); + } + + /* + * we always have a partition for the whole disk + * and one for the partition table + */ pp = &dp->p[0]; strcpy(pp->name, "disk"); pp->start = 0; @@ -592,17 +605,15 @@ hardpart(Drive *dp) pp->end = dp->p[0].end; dp->npart = 2; - cp = dp->cp; - qlock(cp); - if(waserror()){ - qunlock(cp); - print("error in hardpart\n"); - nexterror(); - } - + /* + * read partition table from disk, null terminate + */ hardxfer(dp, pp, Cread, 0, dp->bytes); cp->buf[dp->bytes-1] = 0; + /* + * parse partition table. + */ n = getfields(cp->buf, line, Npart+1, '\n'); if(strncmp(line[0], MAGIC, sizeof(MAGIC)-1) != 0){ print("bad partition magic\n"); @@ -614,11 +625,7 @@ print("bad partition magic\n"); print("bad partition field\n"); break; } - if(strlen(field[0]) > NAMELEN){ -print("bad partition name\n"); - break; - } - strcpy(pp->name, field[0]); + strncpy(pp->name, field[0], NAMELEN); pp->start = strtoul(field[1], 0, 0); pp->end = strtoul(field[2], 0, 0); if(pp->start > pp->end || pp->start >= dp->p[0].end){