home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume1 / 8708 / 24 / rename.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-13  |  2.7 KB  |  151 lines

  1. /* Copyright (C) 1984 by Manx Software Systems, Inc. */
  2.  
  3. #include    <quickdraw.h>
  4. #include    <pb.h>
  5. #include    <errno.h>
  6.  
  7. #define        _DEBUG
  8. #include    <max/debug.h>
  9.  
  10. #ifdef TEST
  11. #include <stdio.h>
  12. #endif
  13.  
  14. long setdir( path, dir, name )
  15. char * path;
  16. char * dir;
  17. char * name;
  18. {
  19.     CInfoPBRec cpb;
  20.     int err;
  21.  
  22.     splitname( path, dir, name );
  23.     
  24. #ifdef TEST
  25.     fprintf( stderr, "setdir: \"%s\" \"%s\" \"%s\"\n", name, dir, path );
  26. #endif
  27.  
  28.     cpb.ioNamePtr = ctop( dir );
  29.     
  30.     cpb.ioVRefNum = 0;
  31.     cpb.ioFDirIndex = 0;
  32.     cpb.u.di.ioDrDirID = 0L;
  33.  
  34.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  35.  
  36. #ifdef TEST
  37.     fprintf( stderr, "setdir: err %d\n", err );
  38. #endif
  39.         
  40.     }
  41.  
  42.     ptoc( dir );
  43.  
  44. #ifdef TEST
  45.     fprintf( stderr, "setdir: path|%s dir|%s name|%s\n",
  46.                 path, dir, name );
  47. #endif
  48.  
  49.     return( cpb.u.di.ioDrDirID );
  50.  
  51. }
  52.  
  53. rename(old, new)
  54. char *old, *new;
  55. {
  56.     register int i, err;
  57.     long int freeb;
  58.     int vrefnum;
  59.     
  60.     union {
  61.         struct HPrmBlkRec pb;
  62.         struct CMovePBRec cm;
  63.     } pbcm;
  64.         
  65.     char nbuf[64], ndir[64], nname[32];
  66.     char obuf[64], odir[64], oname[32];
  67.  
  68.  
  69.     /* get vRefNum */
  70.     if ( (i=hfixnam(old, obuf)) == 0 ||
  71.                  (pbcm.pb.ioVRefNum = hfixnam(new, nbuf)) == 0
  72.             )
  73.         return(-1);
  74.     if (i != pbcm.pb.ioVRefNum) {
  75.         errno = EINVAL;
  76.         return(-1);
  77.     }
  78.  
  79.     
  80. #ifdef TEST
  81.     fprintf( stderr, "rename: obuf|%s -> nbuf|%s\n", obuf, nbuf );
  82. #endif
  83.  
  84.     /* get dir refnums, fix path names, get dir name, and name */
  85.     pbcm.cm.ioNewDirID = setdir( nbuf, ndir, nname );
  86.     pbcm.cm.ioDirID = setdir( obuf, odir, oname );    
  87.     
  88.     /* use name only */
  89.     if ( pbcm.cm.ioDirID != pbcm.cm.ioNewDirID ) {
  90. #ifdef TEST
  91.         fprintf( stderr, "rename: catmove\n" );
  92.         fprintf( stderr, "rename: %ld|%s -> %ld|%s\n", 
  93.                 pbcm.cm.ioDirID, obuf, pbcm.cm.ioNewDirID, ndir );
  94. #endif
  95.         /* use full path name including volume name */
  96.         pbcm.pb.ioNamePtr = ctop(obuf);
  97.         pbcm.cm.ioNewName = ctop(ndir);
  98.         err = PBCatMove(&pbcm, 0);
  99.     }
  100.     else
  101.         err = 0;
  102.     if (err) {
  103.         if (err == -48)
  104.             err = EEXIST;
  105.         errno = err;
  106.         return(-1);
  107.     }
  108.     else {
  109. #ifdef TEST
  110.     fprintf( stderr, "rename: rename\n" );
  111.     fprintf( stderr, "rename: %ld|%s -> %ld|%s\n", 
  112.             pbcm.cm.ioDirID, oname, pbcm.cm.ioNewDirID, nname);
  113. #endif
  114.         pbcm.pb.ioNamePtr = ctop(oname);
  115.         pbcm.pb.u.iop.ioVersNum = 0;
  116.         pbcm.pb.u.iop.ioMisc = ctop(nname);
  117.         pbcm.cm.ioDirID =  pbcm.cm.ioNewDirID;
  118.         err = PBHRename(&pbcm, 0);
  119.         if (err) {
  120.             if (err == -48)
  121.                 err = EEXIST;
  122.             errno = err;
  123.             return(-1);
  124.         }
  125.         else
  126.             return(0);
  127.     }
  128. }
  129.  
  130. #ifdef TEST
  131. #include <errno.h>
  132.  
  133. main()
  134. {
  135.     char command[100];
  136.  
  137.     char f1[100], f2[100];
  138.  
  139.     while(gets(command) != NULL) {
  140.         sscanf( command, "%s%s", f1, f2 );
  141.  
  142.         fprintf( stderr, "test: %s %s\n", f1, f2 );
  143.  
  144.         if ( rename( f1, f2 ) == 0 )
  145.             fprintf( stderr, "test: OK\n\n" );
  146.         else
  147.             fprintf( stderr, "test: ERROR %d\n\n", errno );
  148.     }
  149. }
  150. #endif
  151.