home *** CD-ROM | disk | FTP | other *** search
/ For Beginners & Professional Hackers / cd.iso / docum / dos-ref.doc / examples / chap4.arj / MOV.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-25  |  2.8 KB  |  95 lines

  1. /*
  2. MOV.C
  3. demonstrate wildcard pathed renames via DOS indirect 
  4. function call
  5. by Ralf Brown, with thanks to Dan Lanciani for pointing out that 
  6. indirect function call enables wildcards on rename and delete
  7.  
  8. This file contains a number of minor modifications from the version
  9. printed in UNDOCUMENTED DOS
  10.  
  11. Usage: MOV old-filespec new-filespec
  12. */
  13.  
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include <dos.h>
  17.  
  18. typedef struct
  19. {
  20.    unsigned ax,bx,cx,dx,si,di,ds,es,reserved,computerID,processID ;
  21. } DPL ;     /* DOS parameter list */
  22.  
  23. union REGS regs ;
  24. struct SREGS segregs ;
  25.  
  26. void canonicalize(filespec,canonical,errorlevel)
  27. char *filespec, *canonical ;
  28. int errorlevel ;
  29. {
  30.    regs.h.ah = 0x60 ;
  31.    regs.x.si = FP_OFF((void far *)filespec) ;
  32.    segregs.ds = FP_SEG((void far *)filespec) ;
  33.    regs.x.di = FP_OFF((void far *)canonical) ;
  34.    segregs.es = FP_SEG((void far *)canonical) ;
  35.    intdosx(®s,®s,&segregs) ;
  36.    if (regs.x.cflag)
  37.    {
  38.       puts("invalid filespec") ;
  39.       exit(errorlevel) ;
  40.    }
  41. }
  42.  
  43. int errorlevel = 0 ;
  44. void ERROR(char *s, int x)     { puts(s); errorlevel = (x); }
  45.  
  46. int main(argc,argv)
  47. int argc ;
  48. char **argv ;
  49. {
  50.    DPL dpl ;
  51.    void far *ptr ;
  52.    char source[128], target[128] ;
  53.  
  54.    if (argc != 3)
  55.    {
  56.       puts("usage: MOV old-filespec new-filespec") ;
  57.       puts("where old-filespec and new-filespec may contain") ;
  58.       puts("wildcards. Wildcards in the new-filespec indicate") ;
  59.       puts("that new name should contain same characters as") ;
  60.       puts("old name in those positions.") ;
  61.       errorlevel = 1 ;
  62.    }
  63.    else if (_osmajor < 3 || (_osmajor == 3 && _osminor < 10))
  64.       ERROR("MOV requires DOS 3.10 or higher", 5);
  65.    else
  66.    {
  67.       canonicalize(argv[1],source,3) ;
  68.       canonicalize(argv[2],target,4) ;
  69.       if (source[0] != target[0])    /* are they on the same drive? */
  70.         ERROR("Source and target must be on the same drive", 6);
  71.       else /* do the move/rename */
  72.       {
  73.         dpl.ax = 0x5600 ;   /* indirect function is rename */
  74.         dpl.dx = FP_OFF((void far *)&source) ;
  75.         dpl.ds = FP_SEG((void far *)&source) ; /* DS:DX old filespec */
  76.         dpl.di = FP_OFF((void far *)&target) ;
  77.         dpl.es = FP_SEG((void far *)&target) ; /* ES:DI new filespec */
  78.         dpl.bx = dpl.cx = dpl.si = 0 ;
  79.         dpl.computerID = 0 ;    /* local machine */
  80.         dpl.processID = 0 ;     /* current process */
  81.  
  82.         regs.x.ax = 0x5D00 ;  /* invoke server function call */
  83.         ptr = (void far *)&dpl ;
  84.         regs.x.dx = FP_OFF(ptr) ;
  85.         segregs.ds = FP_SEG(ptr) ;
  86.         intdosx(®s,®s,&segregs) ;
  87.         /* rename returns error 12h (no more files) on success */
  88.         if (regs.x.cflag && regs.x.ax != 0x12)
  89.             ERROR("rename failed", 2);
  90.         /* NOTE: fails in OS/2 DOS box */
  91.       }
  92.    }
  93.    return errorlevel ;
  94. }
  95.