[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: "probleme" xine



> 
> PARTEZ PAS, J'AI QUAND MEME UNE QUESTION ;-)
> 
> Question subsidiaire : j'ai du faire à la main le lien entre /dev/cdrom
> et /dev/scd0 pour que ça fonctionne ... par quelle méthode ce lien
> pourrait-il être automatique ? (c'est pour faire une distrib live...
> contexte knoppix)
> 
J'ai fait un programme linuxrc avec recherche automatique du CDROM
contenant un fichier, chargement de la racine et création du lien: En gros

Il cherche un CDROM IDE ou SCSI
Sur ces CDROMS, il cherche un fichier root.gz (il monte le cdrom sur
/cdrom)
Il dézippe le fichier dans /dev/ram1
Il modifie dans le système de fichier de /dev/ram1 le lien /dev/cdrom vers
le CD où se trouve le fichier.

Et voilà.

Je pense que tu pourras adapter ce programme sans difficulté à tes
besoins. Si tu veux le source complet, dis le moi (unzip n'est pas donné
ci dessous, je l'ai récupéré tout prêt).

François Boisson

int main(int argc, char **argv)
{
        struct stat stat_buf;
        char media_str[]="/proc/ide/ide0/hda/media";
        char blank[]="";
        char idedrives[]="0a0b1c1d";
        char *cd_device;
        char cd_ide[]="/dev/hda";
        char cd_scsi[]="/dev/scd0";
        char inbuf[80];
        int trouve;
        int i,x;
        int nbcdromscsi;
        FILE *f;

// New startup by Paul
// ameliore par F. Boisson
// Passage au CDrom suivant si echec et incorporation des Cdrom SCSI

        printf("Lancement INITRD (F.Boisson Fevrier 2003)\n");
        // Mount proc on /proc
        printf("   Montage de proc\n");
        if (mount ("none","/proc","proc",MS_MGC_VAL, blank)) {
           printf("[RATE]: echec du montage\n");
           exit(0); 
        }
        trouve = 0;

        printf("   Recherche CDrom\n");
        cd_device = cd_ide;
        for (x=0;((x<8) && (trouve == 0));x+=2) {
           media_str[13]=idedrives[x];
           media_str[17]=idedrives[x+1];
           if (f=fopen(media_str,"r")) {
              if (fgets(inbuf,80,f)) {
                 if (strstr(inbuf,"cdrom")!=NULL) {
                    cd_device[7]=media_str[17];
                    trouve = 1;
                 }
              }
              fclose(f);
            }
        // Si trouve = 1, CDrom trouvé
          if (trouve == 1) {

            printf("   --> CDrom en [%s]\n",cd_device);
            chdir("/dev");
            unlink("cdrom");
            symlink(cd_device,"cdrom");
            printf("   Montage CD\n");
            if (mount
("/dev/cdrom","/cdrom","iso9660",MS_MGC_VAL+MS_RDONLY, blank)) {
              printf("[RATE]: montage impossible\n");
              trouve=0;
            } else printf("   --> réussite\n");
         // Le CD a pu etre monté
           if (trouve == 1) {
             printf("   Extraction de root.gz sur ram1\n");
         /* Open input file en l'occurrence root.gz */
             in_file = fopen("/cdrom/root.gz", "r");
             if (in_file == NULL) {
               printf("[RATE]: Lecture fichier impossible\n");
               trouve = 0;
             }
             else {
        /* Open output file le ramdisk */
               out_file = fopen("/dev/ram1", "w");
               if (out_file == NULL) {
                 fclose(in_file);
                 umount("/cdrom");
                 printf("[RATE]: écriture impossible\n");
                 exit(0);
               }
               if (unzip(in_file, out_file) != 0) {
                 printf("[RATE]: Fichier impossible à extraire\n");
                 umount("/cdrom");
                 exit(0);
               } else
                 {
                   printf("   --> réussite\n");
                   fclose (in_file);
                   fclose (out_file);
                 }
             }
             umount("/cdrom");
           }
          }
         }


        if ((x==8) && (trouve == 0)) {
           printf("[RATE]: pas de CDrom IDE trouvé\n");
           printf("Recherche de CDrom SCSI\n");
           nbcdromscsi = 0;
           if (f=fopen("/proc/scsi/scsi","r")) {
             while (fgets(inbuf,80,f)) {
               
               if ((strstr(inbuf,"Type:") != NULL) && 
                   (strstr(inbuf,"CD-ROM")!=NULL))
                 nbcdromscsi++;
             }
             fclose(f);
           }
           else printf("[RATE]: Pas de SCSI trouvé\n");
           if (nbcdromscsi == 0) {
             printf("[RATE]: pas de CDrom SCSI trouvé\n");
             exit(1);
           }
           // on adapte...
           cd_device = cd_scsi;
           for (i=0;((i<nbcdromscsi) && (trouve==0));i++)
             {
               // test des différents CDscsi
                 cd_scsi[8] = '0'+i;
               // rappel: cd_device = cd_scsi
               printf("   --> CDrom en [%s]\n",cd_device);
               chdir("/dev");
               unlink("cdrom");
               symlink(cd_device,"cdrom");
               printf("   Montage CD\n");
 if (mount("/dev/cdrom","/cdrom","iso9660",MS_MGC_VAL+MS_RDONLY, blank)) {
                 printf("[RATE]: montage impossible\n");
                 trouve=0;
               } else 
                 {
                   printf("   --> réussite\n");
                   trouve = 1;
                 }
               // recherche du fichier

                 // Le CD a pu etre monté
                   if (trouve == 1) {
                     printf("   Extraction de root.gz sur ram1\n");
                     /* Open input file */
                     in_file = fopen("/cdrom/root.gz", "r");
                     if (in_file == NULL) {
                       printf("[RATE]: Lecture fichier impossible\n");
                       trouve = 0;
                     }
                     else {
                       /* Open output file */
                       out_file = fopen("/dev/ram1", "w");
                       if (out_file == NULL) {
                         fclose(in_file);
                         umount("/cdrom");
                         printf("[RATE]: écriture impossible\n");
                         exit(0);
                       }
                       if (unzip(in_file, out_file) != 0) {
           printf("[RATE]: Fichier impossible à extraire\n");
                         umount("/cdrom");
                         exit(0);
                       } else
                         {
                           printf("   --> réussite\n");
                           fclose (in_file);
                           fclose (out_file);
                         }
                     }
                     umount("/cdrom");
                   }
             }
         }

        if (trouve == 0) {
          printf("ECHEC: Pas de CDrom trouve\n");
          exit(1);
        }
        /* Creat the symlink in the real root fs */
        printf("   Montage de la racine\n");
        if (mount ("/dev/ram1","/ram","ext2",MS_MGC_VAL, blank)) {
          printf("[RATE]: montage de /dev/ram1 impossible\n");
          exit(1);
        } else printf("   --> réussite\n");
        chdir("/ram/dev");
        printf("   creation de /dev/cdrom\n");
        symlink(cd_device,"cdrom");
        
        chdir("/");
        umount("/ram");
        umount("/proc");
        printf("\nINITRD fini, racine construite...\n");
        return(0);
}



Reply to: