home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1999 May / pcp151c.iso / misc / src / install / cdrom.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-09-24  |  3.4 KB  |  178 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 "intl.h"
  13. #include "log.h"
  14. #include "newt.h"
  15. #include "scsi.h"
  16. #include "windows.h"
  17.  
  18. #define CD_IDE 1
  19. #define CD_SCSI 2
  20. #define CD_OTHER 3
  21.  
  22. static struct { char * modname, * devname; } transTable[] = {
  23.     { "cm206", "cm206cd" },
  24.     { "sonycd535", "cdu535" },
  25.     { NULL, NULL }
  26. } ;
  27.  
  28.  
  29. #ifdef __i386__
  30. static int setupCDdevicePanel(int * type) {
  31.     char * menuItems[3];
  32.     int cdromType = 0, rc;
  33.  
  34.     menuItems[0] = "SCSI";
  35.     menuItems[1] = _("Other CDROM");
  36.     menuItems[2] = NULL;
  37.  
  38.     if (*type == CD_OTHER)
  39.     cdromType = 1;
  40.  
  41.     rc = newtWinMenu(_("CDROM type"), _("What type of CDROM do you have?"),
  42.              30, 5, 5, 7, menuItems,
  43.              &cdromType, _("Ok"), _("Back"), NULL);
  44.  
  45.     if (rc == 2) return INST_CANCEL;
  46.  
  47.     if (cdromType == 0)
  48.     *type = CD_SCSI;
  49.     else
  50.     *type = CD_OTHER;
  51.  
  52.     return 0;
  53. }
  54. #endif /* __i386__ */
  55.  
  56. #ifndef __sparc__
  57. int findAtapi(char ** cddev) {
  58.     struct deviceInfo * ide;
  59.     int i;
  60.  
  61.     if (ideGetDevices(&ide)) return INST_ERROR;
  62.  
  63.     i = 0;
  64.     while (ide[i].deviceName) {
  65.     if (ide[i].type == DEVICE_CDROM) {
  66.         *cddev = ide[i].deviceName;
  67.         return 0;
  68.     }
  69.     i++;
  70.     }
  71.  
  72.     return INST_ERROR;
  73. }
  74. #endif /* ! __sparc__ */
  75.     
  76. int setupCDdevice(char ** cddev, struct driversLoaded ** dl) {
  77.     int type = 0, rc = 0;
  78.     struct driversLoaded * d;
  79.     int i;
  80.     int done = 0;
  81.  
  82.     #ifndef __sparc__
  83.     /* Let's see if any CDROM's are already available */
  84.     if (!findAtapi(cddev)) {
  85.         logMessage("using device %s", *cddev);
  86.         done = 1;
  87.     }
  88.     #endif
  89.  
  90.     if (!done) {
  91.     #if defined(__sparc__) || defined(__alpha__)
  92.         /* It must be SCSI -- we'll give an error later if this is wrong */
  93.         setupSCSIInterfaces(1, dl, 0, 1);
  94.         *cddev = "scd0";
  95.         done =1;
  96.     #else
  97.         if (!findSCSIcdrom(cddev)) {
  98.         done = 1;
  99.         } else if (kickstart) {
  100.         setupSCSIInterfaces(1, dl, 0, 1);
  101.         if (!findSCSIcdrom(cddev)) done = 1;
  102.         }
  103.     #endif
  104.     }
  105.  
  106.     #ifdef __i386__
  107.     while (rc || !done) {
  108.         rc = setupCDdevicePanel(&type);
  109.         if (rc) return rc;
  110.  
  111.         switch (type) {
  112.           case CD_SCSI:
  113.         rc = setupSCSIInterfaces(0, dl, 0, 1);
  114.         if (rc == INST_ERROR) return rc;
  115.         *cddev = "scd0";
  116.         done = 1;
  117.         break;
  118.  
  119.           case CD_OTHER:
  120.         rc = loadDeviceDriver(DRIVER_CDROM, dl, 0);
  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.             done = 1;
  139.         }
  140.         break;
  141.         }
  142.     } 
  143.     #endif /* __i386__ */
  144.  
  145.     winStatus(35, 3, "CDROM", _("Initializing CDROM..."));
  146.     sleep(2);
  147.     newtPopWindow();
  148.  
  149.     return 0;
  150. }
  151.  
  152. int removeCDmodule(struct driversLoaded ** dl) {
  153.     /* this wil fail silently if no CD module has been loaded */
  154.     removeDeviceDriver(DRIVER_CDROM, dl);
  155.  
  156.     return 0;
  157. }
  158.  
  159. int findSCSIcdrom(char ** cddev) {
  160.     struct deviceInfo * scsi;
  161.     int i;
  162.  
  163.     if (!scsiDeviceAvailable()) return INST_ERROR;
  164.  
  165.     if (scsiGetDevices(&scsi)) return INST_ERROR;
  166.  
  167.     i = 0;
  168.     while (scsi[i].deviceName) {
  169.     if (scsi[i].type == DEVICE_CDROM) {
  170.         *cddev = scsi[i].deviceName;
  171.         return 0;
  172.     }
  173.     i++;
  174.     }
  175.  
  176.     return INST_ERROR;
  177. }
  178.