Forum Programmation.c Programme qui referme mon lecteur CD

Posté par  .
Étiquettes : aucune
0
2
déc.
2005
Salut, je n'y connai absolument rien en programmation, je suis en train de créer un live cd, j'ai presque terminé, récemment je bloquais sur un problème qui était que lorsque j'étaignais mon pc avec mon live cd dedans celui-ci ne s'éjectait pas, heureusement grâce au forum, des personnes m'ont aidé à faire un petit programme qui force l'éjection du CD-rom à la fermeture (ils m'ont donné le code et je n'ai eu qu'à le compiler).

Mais, maintenant il faudrait que une foi que le cd a été éjecté le lecteur se referme avant que le pc ne s'éteigne.

Je cherche donc quelque ligne de C qui me permetrait d'obtenir une petite application qui fermerait simplement le lecteur cd quand on l'exécute.

Merci
  • # eject -t /dev/cdrom

    Posté par  . Évalué à 3.

    Disponible dans toutes les crèmeries
    • [^] # Re: eject -t /dev/cdrom

      Posté par  . Évalué à 0.

      J'avais rajouté dans mon script :
      etc/rc0.d/S90Halt

      mount /dev/cdrom
      mais le problème, c'est que c'est un live-cd et que le lecteur cd est reconnue comme un hdd. Et bien sure, suivant la machine le hdd n'a pas toujours la même lettre !

      Mais je vais quand même essayer.

      Merci
      • [^] # Re: eject -t /dev/cdrom

        Posté par  . Évalué à 0.

        Et non, malheureusement ca ne fonctionne pas.

        Tant que je suis sur le disque dur c'est bon, mais lorsque je créai mon live cd le script ne fonctionne plus (depuis le live-cd).

        Avec ça j'obtient un programme qui m'éjecte le cd du lecteur :

        #include <sys/ioctl.h>
        #include <linux/cdrom.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>

        int main(void){
        int fd = -1;
        fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
        if (fd > 0) {
        ioctl(fd, CDROM_LOCKDOOR, 0);
        close(fd);
        }
        fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
        if (fd > 0) {
        ioctl(fd, CDROMEJECT, 0);
        close(fd);
        }
        }



        Est-ce que quelqu'un pourrait me donner en gros la même chose mais pour le refermer; svp.

        Merci
        • [^] # Re: eject -t /dev/cdrom

          Posté par  (site web personnel) . Évalué à 2.

          [gc@meuh /tmp] strace -eioctl eject
          ioctl(5, CDROMEJECT, 0x804f398) = 0

          [gc@meuh /tmp] strace -eioctl eject -t
          ioctl(5, CDROMCLOSETRAY, 0x24) = 0


          donc je te propose la même chose sauf que tu mets uniquement dans le main :

          fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
          if (fd > 0) {
          ioctl(fd, CDROMCLOSETRAY, 0);
          close(fd);
          }
          }


          c'est beau strace.
  • # moi pas comprendre.

    Posté par  (site web personnel) . Évalué à 2.

    Je ne saisis pas tres bien ce que tu veux faire.
    Ce que je pige :
    Tu as un live cd ;
    Tu veux eteindre la machine ;
    Ton lecteur cd s'ouvre ;
    Tu enleves le cd (ou pas, un programme ne pourra pas voir s'il reste un cd dans ton tiroir tant que ce tiroir est ouvert) ;
    Ton lecteur de cd se referme, et ton ordinateur s'eteint calmement.

    Le probleme que je vois, c'est le contenu des parentheses. Si ton programme ouvre puis referme le tiroir, ca ne sert a rien. Ce que font les live-cd que je connais, c'est d'ejecter le cd, et de te laisser refermer le bidule a la main (s'il y a besoin, sur les lecteurs mange-disques par exemple, il n'y a pas a fermer quoi que ce soit) avant de continuer l'extinction.
    • [^] # Désolé, c'est vrai que je suis pas très clair

      Posté par  . Évalué à 0.

      Donc en gros, je suis en train de créer un live cd linux a partir d'une debian installé sur disque dur et du programme Bootcdwrite.
      Quand je démarre depuis mon live cd, d'origine sans rien toucher aux fichiers et script, quand je l'éteind, le cd reste dans le pc et je suis alors obligé de le rallumer pour éjecter le cd.

      J'ai donc "créé" (d'autres personnes ont fait le boulot pour moi car j'en suis incapable étant donné que je sais pas programmer),un petit programme qui eject le cd nommé force_eject.

      Je l'ai placé dans mon repertoire /usr/bin/

      ensuite j'ai modifié mon fichier /etc/rc0.d/S90Halt

      J'y ai ajouté les lignes suivantes :

      /usr/bin/force_eject
      echo "APPUYER SUR ENTREE POUR CONTINUER"
      read off
      eject -t /dev/cdrom
      sleep 5s
      .....puis la fin du script non modifiée

      Donc grace à ça, au moment ou le pc s'éteind, l'ordinateur éjecte le cd et me demande d'appuyer sur entrée(ce qui me laisse le temps d'enlever le cd), ensuite c'est là qu'est le problème, le lecteur cd devrait se refermer tout seul, puis l'ordinateur s'éteindre completement.

      Au lieux de ça, il éjecte le cd, me demande d'appuyer sur entrée me
      laissant le temps d'enlever le cd, puis me retourne un message d'erreur que je n'ai pas eu le temps de noter mais j'ai eu le temps de voire qu'il me parlai de /dev/cdrom eject.... et il s'éteind le lecteur cd ouvert.

      Voila, j'espère que cela vous aidera a mieux comprendre mon problème. :)

      Merci.
      • [^] # re: Meuh GC

        Posté par  . Évalué à 0.

        Je vais essayer ta solution, merci :)


        PS: C'est bizzar, ton post date d'après celui de E H et il apparaît avant ö_Ö !
        • [^] # Oups, help !!! (ö)

          Posté par  . Évalué à 1.

          Alors, ça ne marche pas, ou plutot je suis un boulet je n'y arrive pas :)!

          donc voila ce que j'ai fait :

          vi /home/force_close.c


          #include <sys/ioctl.h>
          #include <linux/cdrom.h>
          #include <sys/types.h>
          #include <sys/stat.h>
          #include <fcntl.h>

          int main(void){
          fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
          if (fd > 0) {
          ioctl(fd, CDROMCLOSETRAY, 0);
          close(fd);
          }
          }

          Je sauve et je quitte -> :wq

          Je tape :

          cc /home/force_close.c -o /home/force_close

          et voila ce que mon pc me dit:


          /home/force_close.c: Dans la fonction « main »:
          /home/force_close.c:8: error: `fd' undeclared (first use in this function)
          /home/force_close.c:8: error: (Each undeclared identifier is reported only once
          /home/force_close.c:8: error: for each function it appears in.)

          Que dois-je faire svp

          Merci
          • [^] # Re: J'ai trouvé, euh en fait j'ai pompé sur le prog d'avant !

            Posté par  . Évalué à 1.

            Il manquait (je sais pas vraiment ce que sa fait mais bon, moi ca marche comme ca, je vais pas aller le contrarier) :

            int fd = -1;
            juste après le "main"
            ce qui donne donc :


            #include <linux/cdrom.h>
            #include <sys/types.h>
            #include <sys/stat.h>
            #include <fcntl.h>
            #include <sys/ioctl.h>

            int main(void){
            int fd = -1;
            fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
            if (fd > 0) {
            ioctl(fd, CDROMCLOSETRAY, 0);
            close(fd);
            }
            }


            Alors par-contre je sais pas si c'est nécessaire d'avoir tout ces includes ?

            Mais bon, ca marche comme ça :)

            Allez je recommence mon live-cd et je test !


            Merci tout le monde !!!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.