COMCPY.C
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:43k
源码类别:

操作系统开发

开发平台:

Asm

  1. /*
  2. ;    File              : $Workfile: COMCPY.C$
  3. ;
  4. ;    Description       :
  5. ;
  6. ;    Original Author   : DIGITAL RESEARCH
  7. ;
  8. ;    Last Edited By    : $CALDERA$
  9. ;
  10. ;-----------------------------------------------------------------------;
  11. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  12. ;      
  13. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  14. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  15. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  16. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  17. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  18. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  19. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  20. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  21. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  22. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  23. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  24. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  25. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  26. ;    CIVIL LIABILITY.
  27. ;-----------------------------------------------------------------------;
  28. ;
  29. ;    *** Current Edit History ***
  30. ;    *** End of Current Edit History ***
  31. ;
  32. ;    $Log$
  33. ;    ENDLOG
  34. */
  35. /*
  36. File COMCPY.C
  37. Title Copy module for command.com
  38. Revision History:-
  39. ==================
  40. Date       Description
  41. -----------------------------------------------------------------------------
  42. 20/05/86   Command.com copy routine
  43. Based on earlier comcpy.c but heavily modified
  44.  6/06/86   Destination file given the same attributes as source file
  45. (only applicable to non concatinate cases etc as per 
  46. timestamping)
  47.         Verify calls added 
  48. 24/06/86   Special case of file+,, ('touch') supported
  49. 27/06/86   Destination now only opened at last possible moment
  50. (in copy1 routine), to speed up floppy to floppy copying
  51. 03/07/86   ow supports copy bill+fred bill without destroying the
  52. original contents of bill. Also supports copy ref.lst+*.lst
  53.  4 Aug 86  ANSI C compatibilty MSC /W1
  54.  3 Oct 86  Fix bug in REPWILD temp[12] to temp[13] 
  55. 21 Nov 86  Fixed bug in DOSIF MS_DATETIME
  56. ------------- DOS Plus 2.1 and 2.1b internal release
  57.  8 Dec 86 Rewritten to handle single drive copying better
  58. added preread and readsrc
  59. 11 Dec 86 Number of files copied message moved into message.c 
  60. 11 Dec 86 Gastly fix for single floppy drive copy of large file
  61. as DOS Plus wont allow us to keep the destination file open
  62. when swapping floppies
  63. (ABswap and ABloop1 flags added)
  64. 12 Dec 86 Finished and thoroughly tested for DOS Plus 2.1d release
  65. The few minor bugs remaining are documented in dosplus.doc
  66. Although the code is now very messy it seems to work well!
  67. 31 Dec 86 If copying from aux device, set buffer size to 1
  68. 16 Feb 87 Changed check for single physical floppy disk drive
  69. to make more generic
  70.  8 Sep 87 Incorporation of these DOS Plus sources into the Concurrent
  71.   DOS COMMAND.EXE and COPY.EXE files. The memory management
  72. has been modified to use an internal static buffer for
  73. copying. An unused routines have been deleted.
  74. 10 Sep 87 Force BufSize to be a multiple of 512 bytes otherwise
  75. files greater than the buffer size are not copied.
  76. 10 Sep 87 Add an extra check to isfile to check for the case "d:"
  77. 13 Oct 87 Add the /Z option which will force the data to be masked
  78. with 0x7F to zero the top bit.
  79. 16 Oct 87 /S option copies hidden files as well as system files
  80. 16 Oct 87 Copys files with passwords (if source password specified)
  81.           (nb destination does not receive a password unless one is 
  82.           explicitly set)
  83. 19 Oct 87 Added /C confirm option
  84. 30 Oct 87 isfile() checks for trailing '' as a special case
  85. 05 Nov 87 Moved isdev(fn1) test till after removing flags from fn1
  86. 10 Nov 87 If destination is a device, assume ascii when reading source
  87.           and dont send a final ^Z  (unless overridden by user flags)
  88.  5 Apr 88 If Sharing mode open fails on the source file try using
  89.           a compatibilty mode open. For FrameWork SETUP.EXE.
  90. 20 May 88 Update the ISFILE routine to use the FPTR routine. Fixs the
  91.           Novell COPY bug.
  92. 25 May 88 Close any open batch files for WS2000 install which copies
  93.           over its installation batch file.
  94. 27 May 88 Added string undefs.
  95. 28 Sep 88 Read data from the source device till the buffer is full or
  96.           a ^Z has been reached. Donot append a ^Z to a file when copying
  97.           from a device unless /A used.
  98. 21 Dec 88 Use IOCTL to determine if a handle is attached to a device
  99.           or not.
  100. 1 Mar 89  Ignore '[',']','"' 
  101. 14 Apr 89 If dest is a device and /b specified (either src or dst) set
  102.           device to binary
  103. 6 Jun 89  Do not explicitly set the hidden attribute on password 
  104.           protected files let OS do it for us.
  105. 12 Jun 89 Use all of allocated buffer even for Device Reads
  106. 14 Jul 89 Move findeof to assembler for speed
  107. 4 Aug 89  Used to ignore /b on concat src if dest was device
  108. 6-Mar-90  Watcom C v 7.0
  109. 22-Mar-90 Copy with control chars cmd string (get_pno terminate bug)
  110. 8-May-90  "File not found" error goes to STDOUT, not STDERR.
  111. 24-May-90 samefs uses ms_x_expand to check full physical path
  112. 5-Jun-90  BODGE copy to dev to be 1 char at a time so we can retry
  113.           correctly (BDOS bug workaround)
  114. 11-Jun-90 "COPY file1 file2 ; " hanging cured. I hate get_pno.
  115. 27-Nov-90 samefs() no longer uses ms_x_expand(), for PCNFS
  116.           compatibility.
  117. 15-Jan-91 "COPY a+b+c d" no longer stops if b does not exist.
  118. DRDOS BUXTON
  119. ------------
  120. 1-Mar-91  COPY /B FILE DEVICE is now supported.
  121.           Copying to a dev is no longer 1 char at a time, in anticipation
  122.           of a fix in the BDOS.
  123. 2-Apr-91  COPY no longer forces time/date/attributes of source onto
  124.           destination.
  125. 7-May-91  time/date is now preserved again, attributes are not.
  126. DRDOS PANTHER
  127. -------------
  128. 22-Jun-92 Support for Novell Remote copy added.
  129.           See call to novell_copy().
  130. ----------------------------------------------------------------------------
  131. */
  132. #include "defines.h"
  133. #include <string.h>
  134. #if defined(MWC) && defined(strlen)
  135. #undef strcmp /* These are defined as macros in string.h */
  136. #undef strcpy /* which are expaneded in line under */
  137. #undef strlen /* Metaware C. These undefs avoid this. */
  138. #endif
  139. #include <portab.h>
  140. #include <mserror.h>
  141. #include "command.h" /* COMMAND Definitions */
  142. #include "dos.h"  /* MSDOS Functions */
  143. #include "dosif.h" /* DOS interface definitions  */
  144. #include "toupper.h"
  145. #include "support.h" /* Support routines  */
  146. #include "global.h"
  147. EXTERN VOID batch_close(VOID); /* BATCH.C */
  148. MLOCAL BYTE * skip_switch(BYTE *);
  149. MLOCAL BYTE * get_p1(BYTE *, BYTE *, BYTE *);
  150. MLOCAL BYTE * get_pno(BYTE *, BYTE *);
  151. MLOCAL BOOLEAN isfile(BYTE *);
  152. MLOCAL VOID addwild(BYTE *);
  153. MLOCAL BOOLEAN dopen(BYTE *);
  154. MLOCAL VOID dclose(BYTE *, WORD, WORD);
  155. MLOCAL BOOLEAN preread(BYTE *);
  156. MLOCAL WORD readsrc(VOID);
  157. MLOCAL WORD copy1(BYTE *, BYTE *);
  158. MLOCAL BOOLEAN lseek(BYTE *);
  159. MLOCAL BOOLEAN samefs(BYTE *, BYTE *, WORD);
  160. MLOCAL WORD ABcheck(BYTE *, BYTE *);
  161. MLOCAL VOID prtsrc(BYTE *);
  162. MLOCAL WORD conf_src(BYTE *);
  163. MLOCAL VOID e_check2(WORD);
  164. MLOCAL BOOLEAN touch(BYTE *);
  165. MLOCAL BYTE * get_pswd(BYTE *);
  166. /* define external variables used */
  167. #define COPY_VERIFY (global_flg & 1) /* Set Verify Flag */
  168. #define COPY_SYS (global_flg & 2) /* Include SYSTEM Files */
  169. #define COPY_ZERO (global_flg & 4) /* Zero the eighth Bit */
  170. #define COPY_CONFIRM (global_flg & 8) /* Confirm each file */
  171. #define COPYSRC_ASC (sflag & 1) /* Source is ASCII */
  172. #define COPYSRC_BIN (sflag & 2) /* Source is Binary */
  173. #define COPYDST_ASC (dflag & 1) /* Destination is ASCII */
  174. #define COPYDST_BIN (dflag & 2) /* Destination is BINARY*/
  175. #define MIN_COPYBUF (10 * (1024/16)) /* Minimum Copy Buffer Size */
  176. #define MAX_COPYBUF (50 * (1024/16)) /* Maximum Copy Buffer Size */
  177. /* define static variables for this module */
  178. MLOCAL BYTE *lp;
  179. MLOCAL UWORD global_flg; /* Global Flags Verify, System & Zero */
  180. MLOCAL UWORD dflag;
  181. MLOCAL BOOLEAN sascii;  /* treat current source file as ascii */
  182. MLOCAL BOOLEAN sbin;
  183. MLOCAL BOOLEAN concat;
  184. MLOCAL WORD nfiles;  /* number of files copied */
  185. MLOCAL WORD dfh; /* destination file handle */
  186. MLOCAL BOOLEAN dstopen; /* destination open */
  187. MLOCAL WORD sfh;
  188. MLOCAL ULONG src_len;
  189. MLOCAL BOOLEAN srcopen; /* flag whether src is still open */
  190. MLOCAL BOOLEAN srcdev; 
  191. MLOCAL BOOLEAN  dstdev;
  192. MLOCAL BOOLEAN fullbuf; /* buffer contains data */
  193. MLOCAL BOOLEAN dfailed;
  194. MLOCAL BOOLEAN ABswap;  /* single floppy disk drive copy with disk swap */
  195. MLOCAL BOOLEAN tstamp;  /* set destination timestamp to same as source */
  196. MLOCAL UWORD date,time; /* source date and time      */
  197. MLOCAL UWORD attrib;  /* source file attributes    */
  198. MLOCAL UWORD amount;  /* amount of real data in buffer */
  199. /* ---- start of code ---------------------------------------------*/
  200. GLOBAL VOID CDECL cmd_copy(cmd)
  201. BYTE *cmd;
  202. {
  203. WORD rmode = 0x0000;  /* read mode - normal files only */
  204. BYTE delim;
  205. BYTE npara;
  206. BYTE src[MAX_FILELEN]; /* buffer in which to expand wild source filespec */
  207. BYTE dest[MAX_FILELEN]; /* buffer in which to expand wild destination filespec */
  208. #if defined(PASSWORD)
  209. BYTE password[10]; /* keep note of src password    */
  210. #endif
  211. BYTE *olp, *tp;
  212. BYTE *last_delim;
  213. WORD ret;
  214. BOOLEAN scheme1;
  215. BOOLEAN init = YES; /* do initialisations during 1st loop */
  216. BOOLEAN pflag;
  217. BOOLEAN tflag; /* touch flag (special case) */
  218. BOOLEAN confirmed;
  219. UWORD dosvf; /* used to save current dos verify state */
  220. UWORD sflag; /* Source File Options */
  221. /* scheme2 extra bits */
  222. BYTE wdfn[13]; /* used by scheme2 to save wild destination filename */
  223. BYTE *dfptr;
  224. BYTE *ocmd;  
  225. BYTE src2[MAX_FILELEN]; /* 2nd src buffer for scheme2 */
  226. DTA search;  /* DOS Search Buffer */
  227. sascii = NO; /* indicates if current source is ascii or not */
  228. sbin   = NO; /* sbin indicates if an explicit /b found */
  229. concat = NO;
  230. dfailed = ABswap = NO;
  231. srcopen = dstopen = NO; /* No file are Open */
  232. nfiles=0; /* number of files copied */
  233. cmd = deblank(cmd); /* remove leading spaces */
  234. strlwr(cmd); /* force it all to lower case first */
  235. strcpy(heap(),cmd); /* make temp copy of cmd line */
  236. if(f_check(heap(), "vszcab", &global_flg, NO)) /* check for any bad flags */
  237.    return; /* exit if any (with message) */    
  238. /* also zaps any valid flags but not important is this is a temp copy */
  239. f_check(cmd,"vszc",&global_flg,YES); /* check for, and zap verify, sys, zero and confirm flags */
  240. if(COPY_SYS) {
  241.     rmode |= ATTR_SYS; /* read system files also*/
  242.     rmode |= ATTR_HID; /* read hidden files also*/
  243. } /* nb  /s flag acts globally */
  244. cmd = deblank (cmd); /* deblank incase /v was at start of line */
  245. while(*cmd == *switchar) {        /* process any initial switches */
  246.     if(*(cmd+1)=='a')
  247. sascii=YES;
  248.     if(*(cmd+1)=='b') {
  249. sascii=NO;
  250. sbin=YES;
  251.     }
  252.     cmd = deblank (cmd+2);
  253. }     
  254. lp = get_pno(cmd,&npara);
  255. olp =lp; /* save lp ptr (as lp possibly modified later) */
  256. /* olp is used as the end of the list of source parameters */
  257. if(npara > 1)        /* dont remove switches if npara=1 as they will be processed when fn1 switches are checked */
  258.     f_check( lp, "ab", &dflag, YES); /* check for, and zap destination a and b flags */
  259. /* store them in dflag for later use */
  260. last_delim = lp-1;
  261. while (*last_delim == 32) last_delim--;
  262. zap_spaces(lp);
  263. cmd = get_p1(src, deblank(cmd), &delim);  /* separate 1st filename spec from rest */
  264. if(delim == '=') { /* if the user spells PIP as COPY */
  265.     syntax(); /* exit with syntax error */
  266.     return;
  267. }
  268. if(npara>2 && delim!='+') {
  269.     printf(MSG_INOP);     /* invalid number of parameters */
  270.     return;
  271. }
  272. if(!d_check(src))
  273.     return;     /* invalid drive */
  274. f_check( src, "ab", &sflag, YES); /* check for, and zap flags in fn1 */
  275. if(COPYSRC_ASC)
  276.     sascii=YES;
  277. if(COPYSRC_BIN) {
  278.     sascii=NO; /* nb /b checked last by default */
  279.     sbin=YES;
  280. }
  281. zap_spaces (src);
  282. /* do adjustments for special cases */
  283. if (COPYDST_BIN) {
  284.     sbin = YES; /* Does it make sense to have source ascii */
  285.     sascii = NO; /* and dest binary? I think not. */
  286. }
  287. if(lp[strlen(lp)-1] == ',') 
  288.     lp[strlen(lp)-1] = ''; /* remove comma from end of lp */
  289. if(npara==1 && delim!='+')
  290.     if(isfile(lp)) { /* strip drive and path from lp    */
  291. lp = fptr(lp); /* ie pathfile becomes pathfile */
  292.     } /* to file but not if pathfile+  */
  293.     else
  294. lp=lp+strlen(lp);   /* if dir, lp=  */
  295.  
  296. if(npara==1 && delim=='+') {
  297.     delim=' '; /* not concat if 1 parameter */
  298.     tp=lp;
  299.     while (*tp) { /* remove the + sign from end of lp filespec */
  300. if(*tp == '+') 
  301.     *tp = ' ';
  302. tp++;
  303.     }
  304. }
  305. if(npara>=2 && delim=='+' && *last_delim=='+') {
  306. /* copy fred+bill   dest is fred   */
  307.     lp = fptr(src);  /* copy pathfred+bill dest is fred */
  308.     olp=cmd+strlen(cmd); /* fiddle olp to end of list of source parameters */
  309. }
  310. if(npara==2 && iswild(src) &&  /* handle special case */
  311.      isfile(lp) && !iswild(lp))  /* of copy *.lst file */
  312. concat = YES; /* (implied concatination) */
  313. tflag = (npara>=3 && delim=='+' && *cmd==','); /* touch special case so set tflag */
  314. if(delim == '+')
  315.     concat = YES;
  316. if(concat && !sbin) /* concat is ascii unless a /b switch has occured */
  317.     sascii = YES;
  318. dstdev = NO;
  319. if (!iswild(lp) && *lp)
  320. {
  321.     get_filename(dest,lp,YES); /* this turns lpt1: into lpt1 */
  322.     
  323.     ret = ms_x_open(dest, OPEN_READ); /* Check if destination is */
  324.     if (ret >= 0) /* a device. If so, if /b  */
  325.     { /* on src OR dst, copy is  */
  326.      if (isdev(ret)) /* binary    */
  327.         {
  328.    dstdev = YES;
  329.            if (COPYSRC_BIN || (COPYDST_BIN && !concat) || sbin)
  330.    {
  331.        sbin = YES;
  332.        sascii = NO;
  333.    } /* If no /b, default to    */
  334.    else /* ascii    */
  335.    {
  336.        sbin = NO;
  337.        sascii = YES;
  338.    }
  339. }
  340. ms_x_close (ret);
  341.     }
  342. }
  343. mem_alloc(&bufaddr, &bufsize, MIN_COPYBUF, MAX_COPYBUF);
  344. bufsize <<= 4; /* Allocate the Buffer */
  345. bufsize &= ~511; /* Force the buffer size to be a*/
  346. /* multiple of 512 Bytes */
  347. if(bufsize == 0) { /* If the memory allocation */
  348.     e_check(ED_MEMORY); /* print a memory error and  */
  349.     return; /* return to the caller. */
  350. }
  351. #if 0 /* UNBODGE */
  352. /** BODGE **/
  353. if(dstdev) /* copy to dev 1 char at a time */
  354.     bufsize = 1; /* so retry operates correctly  */
  355. /** BODGE **/
  356. #endif /* UNBODGE */
  357. if(batchflg) /* close the BATCH file if OPEN cos  */
  358.     batch_close(); /* installation routines copy over   */
  359. /* the current batch file.      */
  360. dosvf = ms_f_getverify();  /* read present dos verify flag*/
  361. if(COPY_VERIFY)
  362.     ms_f_verify(1);  /* set verify */
  363. if (lp == get_filename(dest, lp, YES)) {
  364.     if (strlen(lp)) {
  365. printf(MSG_SYNTAX); /* bad filename specified */
  366. return;
  367.     }
  368. }
  369. #if TRUE
  370. /* ##jc##
  371.  * This Code is a Special for IBM Display Write 4 which attempts
  372.  * to copy "A:DEFAULT.P*T