(Courriels de diversion: <petrins@allongerez-economisent.com> <reservistes@affinerais-referait.com> <embrayerais@phonologique-appela.com> <brilleront@hispanophone-clopiner.com> <pal@retombez-confirmes.com> <impunie@propageons-geniale.com> <demaquillerait@purgeons-ecuelles.com> <tintouin@toquer-suintant.com> <concerto@devoyee-remontrerait.com> <accouplerons@reevaluerions-impulsivement.com> )


Bonsoir,

Le vendredi 17 novembre 2006 23:22, Jean-Michel a écrit :
> Je viens de jeter un coup d'oeil sur le source ddrescue de debian
> testing, et je ne comprends pas bien comme l'outil peut supporter
> l'accès au partitions de plus de 2Go, avec la ligne suivante( #if 0):
>
> ddrescue-1.10:
>
> /* Large file support on kernel 2.4 glibc 2.1 systems */
> /* _FILE_OFFSET_BITS=64 should take care of it */
> #if 0 && defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 1 &&
> defined(O_LARGEFILE)
> const unsigned int olarge = O_LARGEFILE;
> #else
> const unsigned int olarge = 0;
> #endif

La réponse est dans la question :

 /* _FILE_OFFSET_BITS=64 should take care of it */

Plus haut, il y a effectivement :

#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64

Cela ordonne à la libc de mapper toutes les fonctions relative aux fichiers 
vers leurs versions 64 bits. Ces deux lignes permettent de porter un code en 
64 bits sans avoir à le modifier. En contrepartie, cela casse la 
compatibilité binaire avec le code compilé sans ces defines.

L'autre solution est d'utiliser :

#define _LARGEFILE64_SOURCE

Cela active les fonction 64 bits en plus des fonctions 32 bits habituelles. Il 
faut donc transformer les off_t en off64_t, open() en open64(), etc.

> man open:
>        O_LARGEFILE
>               (LFS) Allow files whose sizes cannot be represented in an
> off_t (but can be represented in an off64_t) to be opened.

Ce flag sert à l'implémentation du open() 64 bits sous certaines plateformes 
dont Linux. Si l'on veut être portable, il ne faut pas l'utiliser 
directement.

Au départ, le code de ddrescue utilisait O_LARGEFILE. Ensuite, 
FILE_OFFSET_BITS=64 a été ajouté et olarge a été forcé à 0 par un #define. Il 
aurait été plus judicieux de retirer totalement la variable olarge.

Gaël

--------------------------------------------------------------------
Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>