Hi! - bugfix: Getlogdev(): in case of no DF_CURLOG flag is set, in rp->r_unit now returned last+1 (equal to blk_dev.dh_name[0]) unit (was last+2). - Setlogdev(): added comment about undocumented behavior.
--- Begin Message ---diff -ruNp old/kernel/dsk.c new/kernel/dsk.c --- old/kernel/dsk.c 2004-06-11 03:03:52.000000000 +0000 +++ new/kernel/dsk.c 2004-06-11 03:15:38.000000000 +0000 @@ -279,36 +279,32 @@ STATIC WORD RWzero(ddt * pddt, UWORD mod */ STATIC WORD Getlogdev(rqptr rp, ddt * pddt) { - int i; - ddt *pddt2; - - if (!(pddt->ddt_descflags & DF_MULTLOG)) { - rp->r_unit = 0; - return S_DONE; - } - - pddt2 = getddt(0); - for (i = 0; i < blk_dev.dh_name[0]; i++, pddt2++) + UBYTE unit = 0; + if (pddt->ddt_descflags & DF_MULTLOG) { - if (pddt->ddt_driveno == pddt2->ddt_driveno && - (pddt2->ddt_descflags & (DF_MULTLOG | DF_CURLOG)) == - (DF_MULTLOG | DF_CURLOG)) - break; + ddt *pddt2 = getddt0() - 1; + do + pddt2++, unit++; + while (unit < blk_dev.dh_name[0] && + (pddt->ddt_driveno != pddt2->ddt_driveno || + (~pddt2->ddt_descflags & (DF_MULTLOG | DF_CURLOG)))); } - - rp->r_unit = i+1; + rp->r_unit = unit; return S_DONE; } STATIC WORD Setlogdev(rqptr rp, ddt * pddt) { - unsigned char unit = rp->r_unit; + UBYTE unit = rp->r_unit + 1; Getlogdev(rp, pddt); - if (rp->r_unit == 0) - return S_DONE; - getddt(rp->r_unit - 1)->ddt_descflags &= ~DF_CURLOG; - pddt->ddt_descflags |= DF_CURLOG; - rp->r_unit = unit + 1; + if (rp->r_unit) + { + getddt(rp->r_unit - 1)->ddt_descflags &= ~DF_CURLOG; + pddt->ddt_descflags |= DF_CURLOG; + /* UNDOCUMENTED: MS-DOS sets r_unit field both for */ + /* 0x17 (Getlogdev()) and 0x18 (Setlogdev()) functions. */ + rp->r_unit = unit; + } return S_DONE; }
--- End Message ---
