home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / lynxlib / volume.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-23  |  5.6 KB  |  179 lines

  1. /* This source file is part of the LynxLib miscellaneous library by
  2. Robert Fischer, and is Copyright 1990 by Robert Fischer.  It costs no
  3. money, and you may not make money off of it, but you may redistribute
  4. it.  It comes with ABSOLUTELY NO WARRANTY.  See the file LYNXLIB.DOC
  5. for more details.
  6. To contact the author:
  7.     Robert Fischer \\80 Killdeer Rd \\Hamden, CT   06517   USA
  8.     (203) 288-9599     fischer-robert@cs.yale.edu                 */
  9.  
  10. /* volume.c */
  11. /* Change volume name */
  12.  
  13. #include <stat.h>
  14. #include <osbind.h>
  15. #include <errno.h>
  16.  
  17. /* Gemdos date-word format:
  18.  *         ------------------------------
  19.  *        |  year (7) | mo (4) | day (5) |
  20.  *         ------------------------------
  21.  *       15........9 8......5 4.......0
  22.  */
  23.  
  24. /* Misc. constants */
  25. #define PATH_LENGTH 65
  26. #define TOS1_4 0x0104                   /* Version number of TOS 1.4 */
  27. #define AUG_08_88 ((8<<9) | (8<<5) | 8) /* Release date of developer's
  28.                                            RAM TOS 1.4 */
  29.  
  30. /* Directory mode bit combinations */
  31. #define FILE_MODE 0x0
  32. #define S_IJALL 0x37
  33.  
  34. /* User-defined error */
  35. #define NAME_EXISTS (-257L)
  36.  
  37. /* Flags */
  38. #define SET_ATTRIB 1
  39.  
  40. /* Function headers                                              */
  41. extern void whichtos();
  42.  
  43. /*--------------------------------------------------------------------
  44.  * d_search
  45.  *      Searches directory for name matching pattern and mode
  46.  *      Copies matching named string if successful
  47.  *      Returns AE_OK if successful; AEFILNF otherwise
  48.  *--------------------------------------------------------------------*/
  49. int d_search(pattern, mode, label)
  50. char *pattern;
  51. int mode;
  52. char *label;
  53. {
  54. DMABUFFER dma;
  55. register DMABUFFER *olddmap;
  56. long retval;
  57.  
  58. #if 0
  59. Cconws("d_search called with:\r\n  Pattern = ");
  60. Cconws(pattern);
  61. Cconws("\r\n  Label = ");
  62. Cconws(label);
  63. #endif
  64.     /* Search directory */
  65.     olddmap = (DMABUFFER *) Fgetdta();
  66.     Fsetdta(&dma);
  67.     if ((retval = Fsfirst(pattern, mode)) == AE_OK) {   /* found */
  68.         strcpy(label, dma.d_fname);
  69.     }
  70.     else {                                      /* not found */
  71.         *label = '\0';
  72.     }
  73.     Fsetdta(olddmap);
  74. #if 0
  75. Cconws("\r\n\r\n  Label = ");
  76. Cconws(label);
  77. Cconws("\r\nd_search returning ");
  78. Cconws((retval == AE_OK ? "Success\r\n" : "Failure\r\n"));
  79. #endif
  80.     return retval;
  81. }
  82. /*--------------------------------------------------------------------
  83.  * get_vname
  84.  *      Gets volume name
  85.  *      Returns pointer label string
  86.  *--------------------------------------------------------------------*/
  87. int get_vname(drvnum, label)
  88. int  drvnum;
  89. char *label;
  90. {
  91.     char path[PATH_LENGTH];
  92.  
  93.     /* Prepare search string */
  94.     strcpy(path, "a:\\*.*");
  95.     path[0] = (char) drvnum + 'a';
  96.  
  97.     /* Search directory */
  98.     return d_search(path, S_IJVOL, label);
  99. }
  100. /*--------------------------------------------------------------------
  101.  * set_vname
  102.  *      Replaces old volume name(s) with new one
  103.  *      Deletes volume name if newname is empty string (old TOS only)
  104.  *      Returns TOS error code in case of trouble
  105.  *--------------------------------------------------------------------*/
  106. int set_vname(drvnum, newname)
  107. int drvnum;
  108. char *newname;
  109. {
  110.     char path[PATH_LENGTH];             /* path buffer */
  111.     char dummy[PATH_LENGTH];
  112.     unsigned tosver;                    /* TOS version number (2 bytes) */
  113.     unsigned tosdate;                   /* TOS release date in Gemdos
  114.                                            date-word format */
  115.     register char *leafptr;             /* pointer into path buffer */
  116.     register int fd;                    /* file descriptor */
  117.     register long err;                    /* error value */
  118.  
  119.     /* Set up path buffer with <drive letter>:\  */
  120.     strcpy(path, "a:\\");
  121.     path[0] += drvnum;
  122.     leafptr = &path[3];
  123.  
  124.     whichtos(&tosver, &tosdate);
  125.     if (tosver < TOS1_4 ||
  126.         (tosver == TOS1_4 && tosdate == AUG_08_88)) {
  127.  
  128.         /* --------------------------------------------------------------- */
  129.         /* Create new volume label -- TOS prior to official release of 1.4 */
  130.         /* --------------------------------------------------------------- */
  131.         /* Make sure new name does not already exist as a file or directory */
  132.         if (*newname != '\0') {
  133.             strcpy(leafptr, newname);
  134.             if (d_search(path, S_IJALL, dummy) == AE_OK) return NAME_EXISTS;
  135.         }
  136.  
  137.         /* Delete any old volume labels */
  138.         while (get_vname(drvnum, leafptr), *leafptr != '\0') {
  139.             if ((fd = err = Fcreate(path, FILE_MODE)) < 0) return err;
  140.             if ((err = Fclose(fd)) != AE_OK) return err;
  141.             if ((err = Fdelete(path)) != AE_OK) return err;
  142.         }
  143.  
  144.         /* Create new volume label */
  145.         if (*newname != '\0') {
  146.             strcpy(leafptr, newname);
  147.             if ((fd = err = Fcreate(path, FILE_MODE)) < 0) return err;
  148.             if ((err = Fclose(fd)) != AE_OK) return err;
  149.             Fattrib(path, SET_ATTRIB, S_IJVOL);
  150.         }
  151.         return AE_OK;
  152.     }
  153.  
  154.     else {
  155.         /* ---------------------------------------------------- */
  156.         /* Create new volume label -- TOS version 1.4 and after */
  157.         /* ---------------------------------------------------- */
  158.         if (*newname != '\0') strcpy(leafptr, newname);
  159.         else strcpy(leafptr, "nolabel");  /* Can't delete, so set to default */
  160.         if ((fd = err = Fcreate(path, S_IJVOL)) < 0) return err;
  161.         err = Fclose(fd);
  162.         return err;
  163.     }
  164. }
  165. /* ------------------------------------------------------------- */
  166. #if 0
  167. main()
  168. {
  169. char label[20];
  170.     force_dchange(0);
  171.     get_vname(0, label + 1);
  172.     printf("%s\n",label + 1);
  173.     Cnecin();
  174.     force_dchange(0);
  175.     get_vname(0, label + 1);
  176.     printf("%s\n",label + 1);
  177. }
  178. #endif
  179.