/* cds utilities */
#include "types.h"
#include "sysvar.h"
#include "cds.h"
#include "dpb.h"
#include <dos.h>

extern struct sysVarsType SysVars ;

char fGetCDS(i, pLCDS)
int i ;
struct CDSType *pLCDS ;
{
	struct CDSType far *cptr ;
	int j ;

	if (i >= 0 && i < SysVars.cCDS) {
		*(long *)(&cptr) = SysVars.pCDS + (i * sizeof(*pLCDS)) ;

		for (j=0 ; j <= sizeof(*pLCDS) ; j++)
			*((char *)pLCDS+j) = *((char far *)cptr+j) ;

		return TRUE ;
	} ;
	return FALSE ;
}




char fPutCDS(i, pLCDS)
int i ;
struct CDSType *pLCDS ;
{
	struct CDSType far *cptr ;
	int j ;

	if (i >= 0 && i < SysVars.cCDS) {
		*(long *)(&cptr) = SysVars.pCDS + (i * sizeof(*pLCDS)) ;

		for (j=0 ; j <= sizeof(*pLCDS) ; j++)
			*((char far *)cptr+j) = *((char *)pLCDS+j) ;

		return TRUE ;
	} ;
	return FALSE ;
}

/* returns TRUE if drive i is a physical drive.  Physical means that logical
 * drive n corresponds with physical drive n.  This is the case ONLY if the
 * CDS is inuse and the DPB corresponding to the CDS has the physical drive
 * equal to the original drive.
 */

char fPhysical(i)
int i ;
{
	struct DPBType DPB ;
	struct DPBType *pd = &DPB ;
	struct DPBType far *dptr ;
	int j ;

	struct CDSType CDS ;

	if (!fGetCDS(i, &CDS))
		return FALSE ;

	if (TESTFLAG(CDS.flags,CDSNET | CDSSPLICE | CDSLOCAL))
		return FALSE ;

	*(long *)(&dptr) = CDS.pDPB ;

	for (j=0 ; j <= sizeof(DPB) ; j++)
		 *((char *)pd+j) = *((char far *)dptr+j) ;

	return(i == DPB.drive) ;
}

/* return TRUE if the specified drive is a network drive.  i is a 0-based
 * quantity
 */

/*	MODIFICATION HISTORY
 *
 *  M000	June 5/85	Barrys
 *  Removed extra net check.
 */

char fNet(i)
int i ;
{
	union REGS ir ;
	register union REGS *iregs = &ir ;	/* Used for DOS calls	   */

	struct CDSType CDS ;

	if (!fGetCDS(i, &CDS))
		return FALSE ;

	iregs->x.ax = IOCTL9 ;			/* Function 0x4409	   */
	iregs->x.bx = i + 1 ;
	intdos(iregs, iregs) ;

/***	M000
	return(TESTFLAG(CDS.flags,CDSNET) || TESTFLAG(iregs->x.dx,0x1000)) ;
***/
	return(TESTFLAG(CDS.flags,CDSNET)) ;
}


/* return TRUE if the specified drive is a shared drive.  i is a 0-based
 * quantity
 */
char fShared(i)
int i ;
{
	struct CDSType CDS ;
	union REGS ir ;
	register union REGS *iregs = &ir ;	/* Used for DOS calls	   */

	if (!fGetCDS(i, &CDS))
		return FALSE ;

	iregs->x.ax = IOCTL9 ;			/* Function 0x4409	   */
	iregs->x.bx = i + 1 ;
	intdos(iregs, iregs) ;

	return TESTFLAG(CDS.flags,CDSNET) || TESTFLAG(iregs->x.dx,0x0200) ;
}
