home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 13 / CDA13.ISO / MISC / SRC / INSTALL / CDROM.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-23  |  3.1 KB  |  156 lines

  1. #include <fcntl.h>
  2. #include <linux/types.h>
  3. #include <linux/cdrom.h>
  4. #include <sys/ioctl.h>
  5. #include <strings.h>
  6. #include <newt.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9.  
  10. #include "devices.h"
  11. #include "install.h"
  12. #include "log.h"
  13. #include "newt.h"
  14. #include "scsi.h"
  15. #include "windows.h"
  16.  
  17. #define CD_IDE 1
  18. #define CD_SCSI 2
  19. #define CD_OTHER 3
  20.  
  21. static struct { char * modname, * devname; } transTable[] = {
  22.     { "cm206", "cm206cd" },
  23.     { "sonycd535", "cdu535" },
  24.     { NULL, NULL }
  25. } ;
  26.  
  27.  
  28. int setupCDdevicePanel(int * type) {
  29.     newtComponent form, label, listbox, okay, cancel, answer;
  30.  
  31.     #ifdef __sparc__
  32.     *type = CD_SCSI;
  33.     return 0;
  34.     #endif
  35.  
  36.     newtOpenWindow(22, 6, 35, 11, "CDROM type");
  37.  
  38.     label = newtLabel(1, 1, "What type of CDROM do you have?");
  39.     listbox = newtListbox(10, 3, 0, NEWT_LISTBOX_RETURNEXIT);
  40.  
  41.     newtListboxAddEntry(listbox, "IDE (ATAPI)", (void *) CD_IDE);
  42.     newtListboxAddEntry(listbox, "SCSI", (void *) CD_SCSI);
  43.  
  44.     #ifndef __axp__
  45.     newtListboxAddEntry(listbox, "Other CDROM", (void *) CD_OTHER);
  46.     #endif
  47.     
  48.     okay = newtButton(5, 7, "Ok");
  49.     cancel = newtButton(20, 7, "Cancel");
  50.  
  51.     form = newtForm(NULL, NULL, 0);
  52.     newtFormAddComponents(form, label, listbox, okay, cancel, NULL);
  53.  
  54.     answer = newtRunForm(form);
  55.  
  56.     if (answer != cancel)
  57.     *type = (int) newtListboxGetCurrent(listbox);
  58.  
  59.     newtFormDestroy(form);
  60.     newtPopWindow();
  61.  
  62.     if (answer == cancel) return INST_CANCEL;
  63.  
  64.     return 0;
  65. }
  66.  
  67. int findAtapi(char ** cddev) {
  68.     char * dev;
  69.     int i, fd;
  70.     struct cdrom_volctrl volctrl;
  71.  
  72.     dev = alloca(105);
  73.     strcpy(dev, "/tmp/hda");
  74.  
  75.     for (i = 0; i < 8; i++, dev[7]++) {
  76.     logMessage("seeing if %s is ATAPI CD", dev);
  77.     devMakeInode(dev + 5, dev);
  78.     fd = open(dev, O_RDONLY);
  79.     if (fd < 0) {
  80.         logMessage("    failed to open device");
  81.         continue;
  82.     }
  83.  
  84.     unlink(dev);
  85.     if (!ioctl(fd, CDROMVOLREAD, &volctrl)) {
  86.         logMessage("    CDROMVOLREAD ioctl worked");
  87.         close(fd);
  88.         *cddev = strdup(dev + 5);
  89.         return 0;
  90.     };
  91.  
  92.     close(fd);
  93.     }
  94.  
  95.     messageWindow("Error", "No IDE (ATAPI) drives can be found.");
  96.  
  97.     return INST_ERROR;
  98. }
  99.     
  100. int setupCDdevice(char ** cddev, struct driversLoaded ** dl) {
  101.     int type, rc;
  102.     struct driversLoaded * d;
  103.     int i;
  104.  
  105.     do {
  106.     rc = setupCDdevicePanel(&type);
  107.     if (rc) return rc;
  108.  
  109.     switch (type) {
  110.       case CD_SCSI:
  111.         setupSCSIInterfaces(1, dl);
  112.         *cddev = "scd0";
  113.         break;
  114.  
  115.       case CD_IDE:
  116.         rc = findAtapi(cddev);
  117.         break;
  118.  
  119.       case CD_OTHER:
  120.         rc = loadDeviceDriver(DRIVER_CDROM, dl);
  121.         if (!rc) {
  122.         d = *dl;
  123.         *cddev = "bad_device";
  124.         while (d) {
  125.             if (d->type == DRIVER_CDROM) {
  126.             *cddev = d->module;
  127.             break;
  128.             }
  129.             d = d->next;
  130.         }
  131.  
  132.         for (i = 0; transTable[i].modname; i++) {
  133.             if (!strcmp(*cddev, transTable[i].modname)) {
  134.             *cddev = transTable[i].devname;
  135.             break;
  136.             }
  137.         }
  138.         }
  139.         break;
  140.     }
  141.     } while (rc);
  142.  
  143.     winStatus(35, 3, "CDROM", "Initializing CDROM...");
  144.     sleep(2);
  145.     newtPopWindow();
  146.  
  147.     return 0;
  148. }
  149.  
  150. int removeCDmodule(struct driversLoaded ** dl) {
  151.     /* this wil fail silently if no CD module has been loaded */
  152.     removeDeviceDriver(DRIVER_CDROM, dl);
  153.  
  154.     return 0;
  155. }
  156.