home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / mar94 / os20 / cli / move.lha / Move / Move.c < prev    next >
C/C++ Source or Header  |  1994-01-31  |  28KB  |  1,178 lines

  1. /*
  2. Auto:        sc <file>
  3. */
  4.  
  5. /* $Revision Header built automatically *************** (do not edit) ************
  6. **
  7. ** © Copyright by GuntherSoft
  8. **
  9. ** File             : SnakeSYS:CPrgs/Utils/Move.c
  10. ** Created on       : Wednesday, 11.08.93 15:01:14
  11. ** Created by       : Kai Iske
  12. ** Current revision : V1.8
  13. **
  14. **
  15. ** Purpose
  16. ** -------
  17. **   - Small move utility which supports wildcards and doesn`t use
  18. **     Rename() nor Copy() nor anything similar...
  19. **
  20. ** Revision V1.8
  21. ** --------------
  22. ** created on Sunday, 19.12.93 01:44:05  by  Kai Iske.   LogMessage :
  23. **  -*-  changed on Sunday, 19.12.93 01:47:54  by  Kai Iske.   LogMessage :
  24. **   - Added PURE information to Doc, since Move really is pure
  25. **     (Suggested by : Albert-Jan Brouver)
  26. **  -*-  changed on Sunday, 19.12.93 01:46:23  by  Kai Iske.   LogMessage :
  27. **   - Due to the move-renaming bug one couldn`t rename a dir
  28. **     an Assign was put on.
  29. **     (Reported by : Albert-Jan Brouver)
  30. **  -*-  created on Sunday, 19.12.93 01:44:05  by  Kai Iske.   LogMessage :
  31. **   - Fixed move-renaming of directories.
  32. **     (Reported by : Albert-Jan Brouver)
  33. **   - Move had some severe problems recursively moving
  34. **     the contents of a directory
  35. **
  36. ** Revision V1.7
  37. ** --------------
  38. ** created on Saturday, 04.12.93 23:19:03  by  Kai Iske.   LogMessage :
  39. **  -*-  changed on Saturday, 04.12.93 23:26:25  by  Kai Iske.   LogMessage :
  40. **   - Error while moving to a "device full" disk
  41. **     (Reported by : Chris Conger)
  42. **  -*-  created on Saturday, 04.12.93 23:19:03  by  Kai Iske.   LogMessage :
  43. **   - FileName length-bug fixed
  44. **     (Reported by : Juergen Lang)
  45. **   - Recompiled using SAS 6.50
  46. **   - Stack usage reduced
  47. **
  48. ** Revision V1.6
  49. ** --------------
  50. ** created on Friday, 15.10.93 15:51:13  by  Kai Iske.   LogMessage :
  51. **  -*-  changed on Saturday, 16.10.93 15:17:29  by  Kai Iske.   LogMessage :
  52. **   - Move got screwed up, when attempting to move a
  53. **     zero size file
  54. **  -*-  changed on Friday, 15.10.93 16:03:35  by  Kai Iske.   LogMessage :
  55. **   - Added Buffer Keyword to specify the maximum buffer
  56. **     size for an inter device move. Normally Move would have used
  57. **     the max amount of available free memory in order to
  58. **     accomplish the move, or the size needed by the file...
  59. **     (Suggested by : Christof Damian)
  60. **  -*-  created on Friday, 15.10.93 15:51:13  by  Kai Iske.   LogMessage :
  61. **   - One couldn`t rename a file using move, because the
  62. **     "destination" file was removed before doing the rename,
  63. **     ie. the source file was deleted.
  64. **     (Reported by : Chris Conger)
  65. **
  66. ** Revision V1.5
  67. ** --------------
  68. ** created on Tuesday, 05.10.93 01:42:53  by  Kai Iske.   LogMessage :
  69. **  -*-  changed on Tuesday, 05.10.93 02:03:22  by  Kai Iske.   LogMessage :
  70. **   - Freed the FileInfoBlock _BEFORE_ setting the Bits, Comment
  71. **     etc. This lead to MungWall hits (of course it did)
  72. **     (Reported by Nico Francois)
  73. **  -*-  created on Tuesday, 05.10.93 01:42:53  by  Kai Iske.   LogMessage :
  74. **   - Exidentially called one ExAll() without ED_SIZE
  75. **     This lead to some calls to DoTheMove without the Size set ;)
  76. **     (Reported by  Karsten Weiss)
  77. **
  78. ** Revision V1.4
  79. ** --------------
  80. ** created on Friday, 01.10.93 16:55:15  by  Kai Iske.   LogMessage :
  81. **  -*-  created on Friday, 01.10.93 16:55:15  by  Kai Iske.   LogMessage :
  82. **   - Now uses Rename() when source and dest are on the same
  83. **     device. This is faster ;) Why haven`t I thought of that
  84. **     earlier ??? ;)
  85. **
  86. ** Revision V1.3
  87. ** --------------
  88. ** created on Wednesday, 25.08.93 16:32:43  by  Kai Iske.   LogMessage :
  89. **   - UnLock Problem solved when doing recursive Dir-Moves
  90. **     This bug lead to "Object in use" error messages
  91. **
  92. ** Revision V1.2
  93. ** --------------
  94. ** created on Tuesday, 17.08.93 22:48:38  by  Kai Iske.   LogMessage :
  95. **   - Added CTRL-C checking
  96. **   - Added FORCE Flag in order to move read/deleteprotected or
  97. **     to overwrite a delete/writeprotected files
  98. **
  99. ** Revision V1.1
  100. ** --------------
  101. ** created on Monday, 16.08.93 22:53:34  by  Kai Iske.   LogMessage :
  102. **   - Added well known CLONE, DATES, COM, NOPRO,
  103. **     QUIET and NOREQ options also used by e.g. Rename
  104. **
  105. ** Revision V1.0
  106. ** --------------
  107. ** created on Wednesday, 11.08.93 15:01:14  by  Kai Iske.   LogMessage :
  108. **     --- Initial release ---
  109. **
  110. *********************************************************************************/
  111. #define REVISION "1.8"
  112. #define REVDATE  "19.12.93"
  113. #define REVTIME  "01:47:54"
  114. #define AUTHOR   "Kai Iske"
  115. #define VERNUM   1
  116. #define REVNUM   8
  117.  
  118. #include    <string.h>
  119. #include    <stdlib.h>
  120. #include    <exec/types.h>
  121. #include    <proto/exec.h>
  122. #include    <proto/dos.h>
  123. #include    <exec/memory.h>
  124. #include    <exec/execbase.h>
  125. #include    <dos/exall.h>
  126. #include    <dos/dos.h>
  127. #include    <dos/dosextens.h>
  128.  
  129.  
  130.  
  131.  
  132. /**********************************************************************/
  133. /*                         Defines for Flags                          */
  134. /**********************************************************************/
  135. #define    CLONE        0x0001
  136. #define    DATES        0x0002
  137. #define    NOPRO        0x0004
  138. #define    COM        0x0008
  139. #define    QUIET        0x0010
  140. #define    FORCE        0x0020
  141.  
  142. #define    WATCHSIGS    SIGBREAKF_CTRL_C
  143.  
  144.  
  145.  
  146. /**********************************************************************/
  147. /*                      Static char definitions                       */
  148. /**********************************************************************/
  149. static    const char    *Version    = "$VER: Move "REVISION" ("REVDATE")\0";
  150. static    const char    *Template    = "FROM/M,TO/A,CLONE/S,DATES/S,NOPRO/S,COM/S,QUIET/S,NOREQ/S,FORCE/S,BUFFER/N/K";
  151. enum    {FROM_ARG, TO_ARG, CLONE_ARG, DATES_ARG, NOPRO_ARG, COM_ARG, QUIET_ARG, NOREQ_ARG, FORCE_ARG, BUFFER_ARG, LAST_ARG};
  152.  
  153.  
  154.  
  155. /**********************************************************************/
  156. /*                             Prototypes                             */
  157. /**********************************************************************/
  158. int    __saveds DoMove(void);
  159. BOOL    __stdargs DoTheMove(char *FromFile, char *ToPath, BOOL PatternFrom, BPTR OutHandle, struct DOSBase *DOSBase, LONG Type, ULONG Size, UWORD CopyFlags, LONG *HitMask, ULONG MaxBuffer);
  160. BOOL    __stdargs DoMoveFile(char *FromFile, char *ToPath, char *Buffer, BPTR OutHandle, struct DOSBase *DOSBase, ULONG Size, UWORD CopyFlags, LONG *HitMask, ULONG MaxBuffer);
  161.  
  162.  
  163. /**********************************************************************/
  164. /*                          The main program                          */
  165. /**********************************************************************/
  166. int __saveds DoMove(void)
  167. {
  168.     struct    FileInfoBlock    *FIB;
  169.     struct    ExecBase    *SysBase = *((struct ExecBase **)0x4L);
  170.     struct    DOSBase        *DOSBase;
  171.     struct    Process        *MyProc = (struct Process *)SysBase->ThisTask;
  172.     struct    RDArgs        *RDArgs;
  173.     struct    ExAllControl    *EAC;
  174.     struct    ExAllData    *EAB, *EAD;
  175.     APTR    *Args,
  176.         *OldWindow;
  177.     BPTR    DirLock,
  178.         OutHandle;
  179.     char    **FromPtr;
  180.     char    *ToPtr;
  181.     char    *Pattern;
  182.     char    *PathName    = NULL;
  183.     char    *Buffer        = NULL;
  184.     LONG    HitMask;
  185.     UWORD    NumFrom = 0, PatternType, CopyFlags = 0;
  186.     ULONG    MaxBuffer = 0;
  187.     BOOL    PatternFrom, GoOn = FALSE, Scanning;
  188.  
  189.         // Ignore startup from WB
  190.  
  191.     if(!(MyProc->pr_CLI))
  192.     {
  193.         struct    Message    *MyMsg;
  194.  
  195.         WaitPort(&MyProc->pr_MsgPort);
  196.         MyMsg = GetMsg(&MyProc->pr_MsgPort);
  197.         Disable();
  198.         ReplyMsg(MyMsg);
  199.         return(10);
  200.     }
  201.  
  202.         // Do the wild thing
  203.  
  204.     if((DOSBase = (struct DOSBase *)OpenLibrary("dos.library", 37)))
  205.     {
  206.             // Allocate buffers
  207.  
  208.         if((Pattern = AllocVec(1024, MEMF_CLEAR)) && (PathName = AllocVec(1024, MEMF_CLEAR)) && (Buffer = AllocVec(1024, MEMF_CLEAR)))
  209.         {
  210.             if((FIB = AllocVec(sizeof(struct FileInfoBlock), MEMF_CLEAR)))
  211.             {
  212.                     // Get buffer for ReadArgs()
  213.  
  214.                 if((Args = AllocVec((LAST_ARG * sizeof(ULONG)), MEMF_CLEAR)))
  215.                 {
  216.                         // Get structure for ExAll()
  217.  
  218.                     if((EAC = AllocDosObject(DOS_EXALLCONTROL, NULL)))
  219.                     {
  220.                             // Get buffer for ExAll()
  221.  
  222.                         if((EAB = AllocVec((sizeof(struct ExAllData)*20), MEMF_CLEAR)))
  223.                         {
  224.                                 // Parse commandline
  225.  
  226.                             if((RDArgs = ReadArgs((char *)Template, (LONG *)Args, NULL)))
  227.                             {
  228.                                     // From and to really there ??
  229.  
  230.                                 if(Args[FROM_ARG] && Args[TO_ARG])
  231.                                 {
  232.                                         // A O.K. so far
  233.  
  234.                                     GoOn        = TRUE;
  235.