mirror of
https://github.com/FDOS/kernel.git
synced 2025-07-22 13:24:28 +02:00
Inline ioctl helper routine back again. We can save stack by using the
dev variable that points to the device smartly. git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1423 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
17bd0113b2
commit
ab6b4ffdf4
@ -54,7 +54,7 @@ static BYTE *RcsId =
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
int DosDevIOctl(lregs * r)
|
||||||
{
|
{
|
||||||
static UBYTE cmd [] = {
|
static UBYTE cmd [] = {
|
||||||
0, 0,
|
0, 0,
|
||||||
@ -74,6 +74,7 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
/* 0x11 */ C_IOCTLQRY,
|
/* 0x11 */ C_IOCTLQRY,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct dhdr FAR *dev;
|
||||||
sft FAR *s;
|
sft FAR *s;
|
||||||
struct dpb FAR *dpbp;
|
struct dpb FAR *dpbp;
|
||||||
unsigned attr;
|
unsigned attr;
|
||||||
@ -84,7 +85,7 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
|
|
||||||
/* commonly used, shouldn't harm to do front up */
|
/* commonly used, shouldn't harm to do front up */
|
||||||
CharReqHdr.r_command = cmd[r->AL];
|
CharReqHdr.r_command = cmd[r->AL];
|
||||||
if (al == 0x0C || al == 0x0D || al >= 0x10) /* generic or query */
|
if (r->AL == 0x0C || r->AL == 0x0D || r->AL >= 0x10) /* generic or query */
|
||||||
{
|
{
|
||||||
CharReqHdr.r_cat = r->CH; /* category (major) code */
|
CharReqHdr.r_cat = r->CH; /* category (major) code */
|
||||||
CharReqHdr.r_fun = r->CL; /* function (minor) code */
|
CharReqHdr.r_fun = r->CL; /* function (minor) code */
|
||||||
@ -105,7 +106,7 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
NetDelay = r->CX;
|
NetDelay = r->CX;
|
||||||
if (r->DX)
|
if (r->DX)
|
||||||
NetRetry = r->DX;
|
NetRetry = r->DX;
|
||||||
break;
|
return SUCCESS;
|
||||||
|
|
||||||
case 0x00:
|
case 0x00:
|
||||||
case 0x01:
|
case 0x01:
|
||||||
@ -124,8 +125,8 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
if ((s = get_sft(r->BX)) == (sft FAR *) - 1)
|
if ((s = get_sft(r->BX)) == (sft FAR *) - 1)
|
||||||
return DE_INVLDHNDL;
|
return DE_INVLDHNDL;
|
||||||
|
|
||||||
*dev = s->sft_dev;
|
dev = s->sft_dev;
|
||||||
attr = s->sft_dev->dh_attr;
|
attr = dev->dh_attr;
|
||||||
flags = s->sft_flags;
|
flags = s->sft_flags;
|
||||||
|
|
||||||
switch (r->AL)
|
switch (r->AL)
|
||||||
@ -138,7 +139,7 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
r->AX = flags;
|
r->AX = flags;
|
||||||
/* Undocumented result, Ax = Dx seen using Pcwatch */
|
/* Undocumented result, Ax = Dx seen using Pcwatch */
|
||||||
r->DX = r->AX;
|
r->DX = r->AX;
|
||||||
break;
|
return SUCCESS;
|
||||||
|
|
||||||
case 0x01:
|
case 0x01:
|
||||||
/* sft_flags is a file, return an error because you */
|
/* sft_flags is a file, return an error because you */
|
||||||
@ -156,18 +157,18 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
/* Set it to what we got in the DL register from the */
|
/* Set it to what we got in the DL register from the */
|
||||||
/* user. */
|
/* user. */
|
||||||
s->sft_flags_lo = SFT_FDEVICE | r->DL;
|
s->sft_flags_lo = SFT_FDEVICE | r->DL;
|
||||||
break;
|
return SUCCESS;
|
||||||
|
|
||||||
case 0x0a:
|
case 0x0a:
|
||||||
r->DX = flags;
|
r->DX = flags;
|
||||||
r->AX = 0;
|
r->AX = 0;
|
||||||
break;
|
return SUCCESS;
|
||||||
|
|
||||||
case 0x06:
|
case 0x06:
|
||||||
if (!(flags & SFT_FDEVICE))
|
if (!(flags & SFT_FDEVICE))
|
||||||
{
|
{
|
||||||
r->AL = s->sft_posit >= s->sft_size ? 0 : 0xFF;
|
r->AL = s->sft_posit >= s->sft_size ? 0 : 0xFF;
|
||||||
break;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
goto IoCharCommon;
|
goto IoCharCommon;
|
||||||
|
|
||||||
@ -175,7 +176,7 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
if (!(flags & SFT_FDEVICE))
|
if (!(flags & SFT_FDEVICE))
|
||||||
{
|
{
|
||||||
r->AL = 0;
|
r->AL = 0;
|
||||||
break;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
|
||||||
@ -188,7 +189,7 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
|| (r->AL == 0x0c && (attr & ATTR_GENIOCTL))))
|
|| (r->AL == 0x0c && (attr & ATTR_GENIOCTL))))
|
||||||
{
|
{
|
||||||
CharReqHdr.r_unit = 0;
|
CharReqHdr.r_unit = 0;
|
||||||
return 1;
|
break;
|
||||||
}
|
}
|
||||||
return DE_INVLDFUNC;
|
return DE_INVLDFUNC;
|
||||||
}
|
}
|
||||||
@ -216,11 +217,12 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
CharReqHdr.r_unit = (r->BL == 0 ? default_drive : r->BL - 1);
|
CharReqHdr.r_unit = (r->BL == 0 ? default_drive : r->BL - 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
dev = NULL;
|
||||||
dpbp = get_dpb(CharReqHdr.r_unit);
|
dpbp = get_dpb(CharReqHdr.r_unit);
|
||||||
if (dpbp)
|
if (dpbp)
|
||||||
{
|
{
|
||||||
*dev = dpbp->dpb_device;
|
dev = dpbp->dpb_device;
|
||||||
attr = dpbp->dpb_device->dh_attr;
|
attr = dev->dh_attr;
|
||||||
CharReqHdr.r_unit = dpbp->dpb_subunit;
|
CharReqHdr.r_unit = dpbp->dpb_subunit;
|
||||||
}
|
}
|
||||||
else if (r->AL != 9)
|
else if (r->AL != 9)
|
||||||
@ -232,13 +234,13 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
{
|
{
|
||||||
struct cds FAR *cdsp = get_cds(CharReqHdr.r_unit);
|
struct cds FAR *cdsp = get_cds(CharReqHdr.r_unit);
|
||||||
r->AX = S_DONE | S_BUSY;
|
r->AX = S_DONE | S_BUSY;
|
||||||
if (cdsp != NULL && dpbp == NULL)
|
if (cdsp != NULL && dev == NULL)
|
||||||
{
|
{
|
||||||
r->DX = ATTR_REMOTE;
|
r->DX = ATTR_REMOTE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!dpbp)
|
if (dev == NULL)
|
||||||
{
|
{
|
||||||
return DE_INVLDDRV;
|
return DE_INVLDDRV;
|
||||||
}
|
}
|
||||||
@ -248,7 +250,7 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
{
|
{
|
||||||
r->DX |= ATTR_SUBST;
|
r->DX |= ATTR_SUBST;
|
||||||
}
|
}
|
||||||
break;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
case 0x08:
|
case 0x08:
|
||||||
if (!(attr & ATTR_EXCALLS))
|
if (!(attr & ATTR_EXCALLS))
|
||||||
@ -261,7 +263,8 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
if (r->AL == 0x0D && (r->CX & ~(0x486B-0x084A)) == 0x084A)
|
if (r->AL == 0x0D && (r->CX & ~(0x486B-0x084A)) == 0x084A)
|
||||||
{ /* 084A/484A, 084B/484B, 086A/486A, 086B/486B */
|
{ /* 084A/484A, 084B/484B, 086A/486A, 086B/486B */
|
||||||
r->AX = 0; /* (lock/unlock logical/physical volume) */
|
r->AX = 0; /* (lock/unlock logical/physical volume) */
|
||||||
break; /* simulate success for MS-DOS 7+ SCANDISK etc. --LG */
|
/* simulate success for MS-DOS 7+ SCANDISK etc. --LG */
|
||||||
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
if ((r->AL <= 0x05 && !(attr & ATTR_IOCTL))
|
if ((r->AL <= 0x05 && !(attr & ATTR_IOCTL))
|
||||||
|| (r->AL == 0x11 && !(attr & ATTR_QRYIOCTL))
|
|| (r->AL == 0x11 && !(attr & ATTR_QRYIOCTL))
|
||||||
@ -269,26 +272,15 @@ STATIC int DosDevIOctl1(lregs * r, struct dhdr FAR **dev)
|
|||||||
{
|
{
|
||||||
return DE_INVLDFUNC;
|
return DE_INVLDFUNC;
|
||||||
}
|
}
|
||||||
return 1;
|
break;
|
||||||
|
|
||||||
default: /* 0x0e, 0x0f */
|
default: /* 0x0e, 0x0f */
|
||||||
if (attr & ATTR_GENIOCTL)
|
if (attr & ATTR_GENIOCTL)
|
||||||
return 1;
|
break;
|
||||||
return DE_INVLDFUNC;
|
return DE_INVLDFUNC;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DosDevIOctl(lregs * r)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
struct dhdr FAR *dev;
|
|
||||||
|
|
||||||
ret = DosDevIOctl1(r, &dev);
|
|
||||||
if(ret <= SUCCESS)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* call execrh() here instead of in DosDevIOctl1() to minimize stack usage */
|
/* call execrh() here instead of in DosDevIOctl1() to minimize stack usage */
|
||||||
execrh(&CharReqHdr, dev);
|
execrh(&CharReqHdr, dev);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user