home *** CD-ROM | disk | FTP | other *** search
/ Mikrobitti Virtuaalilehti 1997 / mbvirt1997d.iso / ohjelmat / move.lha / move.c next >
Encoding:
C/C++ Source or Header  |  1994-03-03  |  2.6 KB  |  124 lines

  1. /*
  2.     move - Written by S.Klemola. (C)1993,1994 SH-Ware.
  3. */
  4.  
  5. #include "exec/types.h"
  6. #include "exec/nodes.h"
  7. #include "exec/libraries.h"
  8. #include "libraries/dos.h"
  9.  
  10. #define BUFSIZE 16384
  11.  
  12. extern APTR AllocMem(long,long);
  13. extern char *FilePart(APTR);
  14. extern struct Library *SysBase;
  15. void Fatal(),error(),cleanup();
  16.  
  17. APTR mem;
  18. BPTR srcf,destf,lock;
  19. long flen;
  20.  
  21. char *cmd;
  22. char *Template = "SOURCE/A,DESTINATION/A\n";
  23. char *Version = "Move v1.02 for V34 & V36 by S.Klemola. (C)1994 SH-Ware.\n";
  24.  
  25. char *Error[] = {
  26.     "required argument missing",
  27.     "can't open source file",
  28.     "can't open destination file",
  29.     "can't allocate memory"
  30. };
  31.  
  32. char Buffer[64];
  33.  
  34. int main(argc,argv) int argc; char *argv[]; {
  35. long rlen,ProtectionBits;
  36. char temp;
  37.  
  38.     cmd=argv[0];
  39.  
  40.     if(!strcmp(argv[1],"?")) {
  41.         printf(Template);
  42.         exit(RETURN_OK);
  43.     };
  44.  
  45.     if(!strcmp(argv[1],"??")) {
  46.         printf(Version);
  47.         exit(RETURN_OK);
  48.     };
  49.  
  50.     if(argc<3) error(0);
  51.  
  52.     strcpy(Buffer,argv[2]);
  53.  
  54.     if((SysBase->lib_Version)>=36) if(FilePart(Buffer)[0]==0) {
  55.         AddPart(Buffer,FilePart(argv[1]),64);
  56.         temp++;
  57.     };
  58.  
  59.     if(!(srcf=Open(argv[1],MODE_OLDFILE))) error(1);
  60.     if(destf=Open(argv[2],MODE_OLDFILE)) {
  61.         printf("Can't move %s as %s because object already exists\n",
  62.             argv[1],Buffer);
  63.         cleanup();
  64.         exit(20);
  65.     };
  66.     if(!(destf=Open(Buffer,MODE_NEWFILE))) error(2);
  67.  
  68.     if(temp) printf("Moving %s as %s\n",argv[1],Buffer);
  69.  
  70.     Seek(srcf,0,OFFSET_END);
  71.     flen=Seek(srcf,0,OFFSET_BEGINNING);
  72.  
  73.     if(!(mem=AllocMem(BUFSIZE,0))) error(3);
  74.  
  75.     lock=Lock(argv[1],SHARED_LOCK);
  76.     Examine(lock,mem);
  77.     UnLock(lock);
  78.  
  79.     ProtectionBits=((struct FileInfoBlock *)mem)->fib_Protection;
  80.  
  81.     while(flen>0) {
  82.         rlen=BUFSIZE;
  83.         if(flen<rlen) rlen=flen;
  84.  
  85.         if(Read(srcf,mem,rlen)<rlen) {
  86.             printf("Error in reading\n");
  87.             Fatal(Buffer);
  88.         };
  89.  
  90.         if(Write(destf,mem,rlen)<rlen) {
  91.             printf("Error in writing\n");
  92.             Fatal(Buffer);
  93.         };
  94.  
  95.         flen=flen-rlen;
  96.     };
  97.  
  98.     cleanup();
  99.     SetProtection(argv[1],0);
  100.     DeleteFile(argv[1]);
  101.     SetProtection(argv[2],ProtectionBits);
  102.     return(RETURN_OK);
  103. };
  104.  
  105. void Fatal(FileName) char *FileName; {
  106.     printf("Destination file ""%s"" removed.\n",FileName);
  107.     cleanup();
  108.     DeleteFile(FileName);
  109.     exit(RETURN_FAIL);
  110. };
  111.  
  112. void error(err) int err; {
  113.     printf("%s: %s\n",cmd,Error[err]);
  114.     cleanup();
  115.     exit(RETURN_FAIL);
  116. };
  117.  
  118. void cleanup() {
  119.     if(srcf) Close(srcf);
  120.     if(destf) Close(destf);
  121.     if(mem) FreeMem(mem,BUFSIZE);
  122. };
  123.  
  124.