DOS 3.30 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

253 lines
5.8 KiB

/*** MSDOS JOIN Utility Vers 4.0
*
* This utility allows the splicing of a physical drive to a pathname
* on another physical drive such that operations performed using the
* pathname as an arguement take place on the physical drive.
*
* MODIFICATION HISTORY
*
* Converted to CMERGE 03/26/85 by Greg Tibbetts
*
* M000 May 23/85 Barrys
* Disallow splicing similar drives.
*
* M001 May 24/85 Barrys
* The original IBM version of JOIN allowed the delete splice switch
* "/D" immediately after the drive specification. The argument parsing
* code has been modified to allow this combination.
*
* M002 June 5/85 Barrys
* Changed low version check for specific 320.
*
* M003 July 15/85 Barrys
* Checked for any possible switch characters in the other operands.
*
* M004 July 15/85 Barrys
* Moved check for physical drive before check for NET and SHARED tests.
*
* 33D0016 July 16/86 Rosemarie Gazzia
* Put SHARED test on an equal basis with physical drive check.
* Last fix (M004) erroneously allowed joining physical or local shared
* drives. This is because it only performed the SHARED test if the drive
* failed the physical test.
*/
#include "types.h"
#include "versionc.h"
#include "sysvar.h"
#include "cds.h"
#include <dos.h>
#include <ctype.h>
extern char NoMem[], ParmNum[], BadParm[], DirNEmp[], NetErr[], BadVer[] ;
extern char *strchr(); /* M003 */
struct sysVarsType SysVars ;
/*** main - program entry point
*
* Purpose:
* To test arguements for validity and perform the splice
*
* int main(int c, char *v[])
*
* Args:
* c - the number of command line arguements
* v - pointer to pointers to the command line arguements
*
* Links:
* ERRTST.C - Drive and path validity testing functions
* SYSVAR.C - Functions to get/set DOS System Variable structures
* CDS.C - Functions to get/set DOS CDS structures
*
* Returns:
* Appropriate return code with error message to stdout if
* necessary.
*
*/
main(c, v)
int c ;
char *v[] ;
{
char *strbscan() ;
union REGS ir;
register union REGS *iregs = &ir ; /* Used for DOS calls */
struct findType findbuf ;
char path [MAXPATHLEN],*p ;
struct CDSType CDS ;
int i ;
int dstdrv; /* dest. drive number M000 */
int delflag = FALSE; /* delete splice flag M001 */
int arglen; /* length of argument M001 */
/* check os version */
iregs->h.ah = GETVERS ; /* Function 0x30 */
intdos(iregs, iregs) ;
if ( (iregs->h.al != expected_version_major) || (iregs->h.ah != expected_version_minor) )
Fatal(BadVer);
/* i = (iregs->h.al * 100) + iregs->h.ah; */
/* if (i < LowVersion || i > HighVersion) */
/* Fatal(BadVer) ; */
SHIFT(c,v) ;
for (i=0 ; i < c ; i++) /* Convert to upper case */
strupr(v[i]) ;
GetVars(&SysVars) ; /* Access to DOS data structures */
if (c > 2) /* M001 */
Fatal(ParmNum); /* M001 */
if (c == 0)
DoList() ; /* list splices */
else {
/* Process drive letter */
i = **v - 'A' ;
if ((*v)[1] != ':') {
if (c == 1) {
Fatal(ParmNum);
}
else {
Fatal(BadParm) ;
}
}
if (!fGetCDS(i, &CDS)) {
Fatal(BadParm) ;
}
/* Accept arguments separate or mixed with drive spec M001 */
arglen = strlen(*v);
if (arglen != 2) {
if ((*v)[2] != SwitChr) {
Fatal(ParmNum);
}
if (arglen != 4) {
if (c == 1) {
Fatal(BadParm);
}
else {
Fatal(ParmNum);
}
}
/* Advance arg pointer to possible switches */
(*v)++; (*v)++;
}
else {
SHIFT(c,v) ;
}
/* Check for splice deletion switch */
if (**v == SwitChr) {
if ((*v)[1] == 'D')
delflag = TRUE;
else {
Fatal(BadParm);
}
}
if (delflag == TRUE) { /* Deassigning perhaps? */
if (!TESTFLAG(CDS.flags, CDSSPLICE)) {
Fatal(BadParm) ; /* If NOT spliced */
}
if (fPathErr(CDS.text)) {
Fatal(BadParm) ; /* If prefix of curdir */
}
CDS.text[0] = i + 'A' ;
CDS.text[1] = ':' ;
CDS.text[2] = '\\' ;
CDS.text[3] = 0 ;
CDS.cbEnd = 2 ;
if (i >= SysVars.cDrv)
CDS.flags = FALSE ;
else
CDS.flags = CDSINUSE ;
GetVars(&SysVars) ;
SysVars.fSplice-- ;
PutVars(&SysVars) ;
fPutCDS(i, &CDS) ;
}
else {
/* Test if there are any other possible switches
* in the operand M003
*/
if (strchr(v[0], SwitChr)) {
Fatal(ParmNum);
}
if (TESTFLAG(CDS.flags,CDSSPLICE)) {
Fatal(BadParm) ; /* If now spliced */
}
rootpath(*v, path) ; /* Get root path */
strupr(path) ; /* Upper case */
/* M004 Start */
if (i == getdrv() || /* Can't mov curdrv */
fPathErr(path) || /* or curdir prefix */
*strbscan(path+3, "/\\") != 0 ||
!fPhysical(i) ||
fShared(i)) { /* 33D0016 RG */
/* Determine if it was a NET error */
if (fNet(i) || fShared(i)) {
Fatal(NetErr) ;
}
Fatal(BadParm) ;
}
if (fNet(path[0] - 'A') || fNet(path[0] - 'A')) {
Fatal(NetErr) ; /* Same for dest */
}
/* M004 End */
/* Check src and dst drives are not same */
dstdrv = *path - 'A'; /* M000 */
if (i == dstdrv) /* M000 */
Fatal (BadParm); /* M000 */
if (mkdir(path) == -1) { /* If can't mkdir */
/* or if no dir or */
/* if node is file */
if (ffirst(path, A_D, &findbuf) == -1 ||
!TESTFLAG(findbuf.attr,A_D))
Fatal(BadParm) ;
p = path + strlen(path) ;
strcat(p, "\\*.*") ;
if (ffirst(path, 0, &findbuf) != -1)
Fatal(DirNEmp) ; /* if dir */
/* not empty */
*p = 0 ;
} ;
strcpy(CDS.text, path) ;
CDS.flags = CDSINUSE | CDSSPLICE ;
fPutCDS(i, &CDS) ;
GetVars(&SysVars) ;
SysVars.fSplice++ ;
PutVars(&SysVars) ;
} ;
}
exit(0) ;
}
DoList()
{
int i ;
struct CDSType CDS ;
for (i=0 ; fGetCDS(i, &CDS) ; i++) {
if (TESTFLAG(CDS.flags,CDSSPLICE))
printf("%c: => %s\n", i+'A', CDS.text) ;
} ;
}