Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Inappropriate ioctl for device

7 réponses
Avatar
xavier
Bonjour,

Je suis en train de compiler thrash
<http://www.csc.liv.ac.uk/~greg/thrash/>
sur MacOSX afin de tester une baie RAID qui présente des défauts.

A part le fait que les flags O_LARGEFILE et O_DIRECT ne sont pas
supportés par BSD (je les ai définis à 0x0), tout se passe bien, jusque
et y compris l'ouverture du device, /dev/disk2s2 dans mon cas.

Par contre j'obtiens le message d'erreur "ENOTTY Inappropriate ioctl for
device" lorsque je tente un bête lseek.

Oserais-je imagine que lseek sur un device est supporté sous Linux mais
pas sous BSD ?

Merci,

--
Xav
Disponible au 01/04/2010
<http://www.xavierhumbert.net/perso/CV2.html>

7 réponses

Avatar
lusenet
Le Fri, 29 Jan 2010 12:29:09 +0100, Xavier a écrit :

Je suis en train de compiler thrash
<http://www.csc.liv.ac.uk/~greg/thrash/>
sur MacOSX afin de tester une baie RAID qui présente des défauts.

A part le fait que les flags O_LARGEFILE et O_DIRECT ne sont pas
supportés par BSD (je les ai définis à 0x0), tout se passe bien, jusque
et y compris l'ouverture du device, /dev/disk2s2 dans mon cas.

Par contre j'obtiens le message d'erreur "ENOTTY Inappropriate ioctl for
device" lorsque je tente un bête lseek.

Oserais-je imagine que lseek sur un device est supporté sous Linux mais
pas sous BSD ?



Pour pouvoir faire un "lseek()" sur un device, il faut en général
utiliser le device en mode "character", pas celui en mode bloc.
La première colonne affichée par "ls -l /dev/$DEVICE" indique le type
de device.

Je ne connais pas la différence de nommage sur MacOSX, sur OpenBSD par
exemple, c'est "/dev/r$DEVICE" au lieu de "/dev/$DEVICE" ('r' ajouté
avant le nom du disque).


Loïc.
Avatar
xavier
Loic Tortay wrote:

Je ne connais pas la différence de nommage sur MacOSX, sur OpenBSD par
exemple, c'est "/dev/r$DEVICE" au lieu de "/dev/$DEVICE" ('r' ajouté
avant le nom du disque).



C'est pareil sous MacOSX (à la base, c'est un mix de Free, Net et Open,
par dessus un noyau Mach)

Mais je viens de tester avec /dev/rdisk2s2 ou même /dev/rdisk2 en
argument, ça ne change malheureusement rien...

Merci quand même,

--
Xav
Disponible au 01/04/2010
<http://www.xavierhumbert.net/perso/CV2.html>
Avatar
xavier
Xavier wrote:

Mais je viens de tester avec /dev/rdisk2s2 ou même /dev/rdisk2 en
argument, ça ne change malheureusement rien...



Cependant, j'ai trouvé un workaround pour le premier lseek

devsize=lseek(fd, 0, SEEK_END);

remplacé par
ioctl (fd, DKIOCGETBLOCKSIZE, &blocksize);
ioctl (fd, DKIOCGETBLOCKCOUNT, &blockcount);
devsize= blocksize * blockcount;

Mais ça aide juste à lancer le programme :-)

Pour aller *effectivement* lire un block défini, lseek échoue toujours. Et
je n'ai pas vu de paramètre à ioctl qui permette ça (dans <sys/disk.h>)

--
Xav
Disponible au 01/04/2010
<http://www.xavierhumbert.net/perso/CV2.html>
Avatar
Bruno Tréguier
Xavier wrote:

Cependant, j'ai trouvé un workaround pour le premier lseek

devsize=lseek(fd, 0, SEEK_END);

remplacé par
ioctl (fd, DKIOCGETBLOCKSIZE, &blocksize);
ioctl (fd, DKIOCGETBLOCKCOUNT, &blockcount);
devsize= blocksize * blockcount;

Mais ça aide juste à lancer le programme :-)

Pour aller *effectivement* lire un block défini, lseek échoue toujours. Et
je n'ai pas vu de paramètre à ioctl qui permette ça (dans <sys/disk.h>)



Bonjour Xavier,

Etes-vous sûr de ne pas être victime de ce qui est décrit ici:

http://en.wikipedia.org/wiki/Not_a_typewriter

Pour ma part je trouve très curieux qu'un appel système comme lseek()
vous injurie en vous disant qu'il ne peut pas s'exécuter parce que
l'opération ne porte pas sur un TTY ! ;-) C'est plutôt l'inverse qui
ferait râler lseek() normalement !

Cordialement,

Bruno
Avatar
xavier
Bruno Tréguier wrote:

Etes-vous sûr de ne pas être victime de ce qui est décrit ici:

http://en.wikipedia.org/wiki/Not_a_typewriter



Ca y ressemble. Et c'est curieux, parce que, sous Linux, lseek marche
sur un device (block ou charachter, d'ailleurs)

Je vais voir si j'ai les versions de debug des librairies pour tracer ce
qui se passe exactement...

--
Xav
Disponible au 01/04/2010
<http://www.xavierhumbert.net/perso/CV2.html>
Avatar
Éric Lévénez
Le 29/01/10 15:45, Xavier a écrit :

devsize=lseek(fd, 0, SEEK_END);



Je viens de tester des lseek (SEEK_SET...) sur un système de fichiers
sous Mac OS X 10.6 (64 bits) sans soucis.

Le code lseek avec SEEK_END retourne 0 et non la taille du système de
fichiers, mais cela n'a rien de surprenant. Pour avoir les informations
sur un fichier c'est stat, et sur un système de fichiers c'est statfs.
Le coup du lseek pour avoir une taille n'est pas propre de toute façon.
Les vieux codes qui semblent marcher et qui marchent par hasard sont
légions.

Si ton code n'a pas les bons includes, il peut compiler, mais ne pas
marcher, en particulier parce que la taille "offset" est un 64 bits.
Est-ce que le code suivant te donne toujours une erreur lseek, ou 0
comme chez moi ?

devsize = lseek(fd, (off_t)0, SEEK_END);

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Avatar
xavier
Éric Lévénez wrote:

Est-ce que le code suivant te donne toujours une erreur lseek, ou 0
comme chez moi ?

devsize = lseek(fd, (off_t)0, SEEK_END);



Je sépare les tâches : Usenet sur le MacBookPro devant la télé au RDC,
et XCode est à l'étage :-) Je te tiens au courant.

Merci Éric.

--
XAv
Disponible au 01/06/2010
<http://www.xavierhumbert.net/perso/CV2.html>