home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / dirutl / tools.arc / MV.C < prev    next >
Text File  |  1987-09-23  |  4KB  |  140 lines

  1. /*
  2.  *  mv.c move (rename a file or files)
  3.  */
  4.  
  5. #include <stdio.h>              /* Standard I/O definitions */
  6. #include <dos.h>                /* Msdos definitions */
  7. #include <errno.h>              /* error codes */
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. static char ID[]="## mv.c 1.0 K.van Houten 230987 ##";
  14. struct stat statbuf;
  15. int iflg=0;
  16. int dflg=0;
  17. int i;
  18. int tmp=0;
  19. char errbuf[100];
  20. char nmbuf[100];
  21. char *dp;                       /* points to dest. dir argv[argc-1] */
  22. char *tp;
  23.  
  24. union REGS r;
  25. struct SREGS s;
  26.  
  27. main (argc, argv)
  28. int     argc;                   /* Number of command line arguments */
  29. char   *argv[];                 /* Array of pointers to arguments */
  30. {
  31.     for (argc--,argv++; argc>0; argc--,argv++) {
  32.         if (**argv == '-') {
  33.             while (*++(*argv)) {
  34.                 switch (**argv) {
  35.                 case 'i':
  36.                     iflg++;
  37.                     printf("mv: -i not yet supported.\n");
  38.                     exit(1);
  39.                     break;
  40.                 default:
  41. usage:              printf("Usage: mv [-i] file [file | [file...] directory]\n");
  42.                     exit(1);
  43.                 }
  44.             }
  45.         }
  46.  
  47.         else
  48.             break;
  49.     }
  50.     /*
  51.      * NOW THE ARGV[0] CONTAINS THE FIRST NON-OPTION ARGUMENT,
  52.      * WHILE ARGC CONTAINS THE NUMBER OF ARGUMENTS LEFT.
  53.      * SO WE HAVE AVAILABLE ARGV[0] -- ARGV[ARGC-1].
  54.      */
  55.     if (argc < 2)
  56.         goto usage;
  57.     dp = argv[argc-1];
  58.  
  59.     if (strcmp(dp,"\\")==0 || strcmp(dp,"..")==0 ||
  60.      (dp[strlen(dp)]=='.' && dp[strlen(dp)-1]=='.' )) {
  61.         dflg++;
  62.     }
  63.     else {
  64.         if (stat(dp,&statbuf) == -1) {
  65.             if (argc>2) {
  66.                 sprintf(errbuf,"mv: %s ",dp);
  67.                 perror(errbuf);
  68.                 exit(1);
  69.             }
  70.         }
  71.         else {
  72.             if ((statbuf.st_mode & S_IFDIR) == 0) {
  73.                 if (argc > 2) {
  74.                     fprintf(stderr,"mv: destination must be directory\n");
  75.                     exit(1);
  76.                 }
  77.             }
  78.             else
  79.                 dflg++;
  80.         }
  81.     }
  82.     for (i=0; i< argc-1 ;i++) {
  83.         if (dflg) {
  84.             if ((tp=strrchr(argv[i],'\\'))==NULL)
  85.                 tp=argv[i];
  86.             else
  87.                 tp++;
  88.             strcpy(nmbuf,dp);
  89.             strcat(nmbuf,"/");
  90.             strcat(nmbuf,tp);
  91.         }
  92.         else {
  93.             strcpy(nmbuf,argv[1]);
  94.         }
  95.         rename(argv[i],nmbuf);
  96.         if (r.x.cflag) {
  97.             sprintf(errbuf,"mv: Error %d ",errno);
  98.             switch(errno) {
  99.             case 2:
  100.                 fprintf(stderr,"mv: File not found.\n");
  101.                 exit(1);
  102.             case 3:
  103.                 fprintf(stderr,"mv: Path not found.\n");
  104.                 exit(1);
  105.             case 5:
  106.                 if (unlink(nmbuf) == -1) {
  107.                     fprintf(stderr,"mv: %s write protect.\n",nmbuf);
  108.                     exit(1);
  109.                 }
  110.                 rename(argv[i],nmbuf);
  111.                 if (r.x.cflag) {
  112.                     fprintf(stderr,"mv: Unexpected Error %d\n",errno);
  113.                     exit(1);
  114.                 }
  115.                 break;
  116.             case 17:
  117.                 fprintf(stderr,"mv: No cross device move\n");
  118.                 exit(1);
  119.             default:
  120.                 fprintf(stderr,"mv: Unexpected ERROR.\n");
  121.                 exit(1);
  122.             }
  123.         }
  124.     }
  125.     exit(0);
  126. }
  127.  
  128. rename(c1,c2)
  129. char *c1, *c2;
  130. {
  131.         segread(&s);
  132.         s.es = s.ds;
  133.         r.h.ah = 0x56;   /* Rename function */
  134.         r.x.dx = (int)c1;
  135.         r.x.di = (int)c2;
  136.         errno = intdosx(&r, &r, &s);
  137. }
  138.  
  139.     
  140.