mirror of https://github.com/AR1972/DOS3.3
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
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) ;
|
|
} ;
|
|
}
|
|
|