2015-09-30 5 views
2

CD-ROM Cela fonctionne sous Linux, mais pas (comme je voudrais) sur FreeBSD:Random Seek sur le lecteur

Je souhaite exercer mon lecteur de CD-ROM, pour garder la poussière de l'objectif. Sous Linux, je cours (en tant que root) un programme en C que j'ai écrit et qui cherche et recule, en lisant un seul bloc à chaque fois. Sur FreeBSD, ce programme ne va pas trop loin. Je peux ouvrir l'appareil et chercher à (disons) le bloc 1. Mais quand j'essaie de lire le bloc, j'obtiens l'erreur 22 (EINVAL). Il échoue lors de la première lecture, au bloc 1, si le périphérique est monté ou non (-t cd9660). Comment dois-je procéder? Le programme complet est here. L'extrait pertinent:

lo_fd=Open(ar_argv[1], 
      O_RDONLY, 
      0 
      ); 

    lo_high_bit=1; 

    while(lo_high_bit>0) 
    { 
    if(lseek(lo_fd, 
      lo_high_bit, 
      SEEK_SET 
      ) 
     == 
     (off_t)-1 
    ) 
    { 
     lo_high_bit>>=1; 

     break; 
    } 

    if(read(lo_fd, 
      lo_buffer, 
      1 
      ) 
     != 
     1 
    ) 
    { 
     lo_high_bit>>=1; 

     break; 
    } 

    lo_high_bit<<=1; 
    } 
+1

On dirait que vous lisez un octet à la fois. Vous pourriez avoir besoin de lire tout un secteur/bloc. –

+0

@Andrew: Merci, vous m'avez mis sur la bonne voie. –

+1

(Pas besoin d'ajouter "RESOLU" à un titre.Si votre propre réponse fonctionne, vous êtes libre (et même encouragé!) De le marquer comme la réponse 'acceptée'.) – usr2564301

Répondre

3

Il se trouve que je faisais deux erreurs: en essayant de lire un octet à la fois, et lseek() uant à l'octet 1. fstat() sur l'appareil indique st_blksize 4096.

Recherche à 4096 et la lecture de 4096 octets fonctionne.

Recherche vers 2048 et la lecture de 2048 octets fonctionne.

La recherche de 2048 et la lecture de 1024 octets donne EINVAL sur read().

La recherche de 1024 et la lecture de 2048 octets donne EINVAL sur read().