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 ---

Reply via email to