Ulrich Weigand wrote:

> Strange.   Could you try running this simple test program?
> I'm able to access all of my 20Gb harddisk this way, even
> under my ancient 2.0.36 kernel ...

>     off = llseek( fd, target, SEEK_SET );

I turned on compiler warnings, and not only was llseek not
defined, but the linker warned against its use and suggested
using lseek64.

>     if ( count != 0x100 );

Oops, there is an extra semicolon at the end of that statement.

I modified this small program, and added some notes.  I use
a command line define to force the library calls to use the
64bit variants implicitly.  Program is attached.  I would
suggest that we do it this way, for those files which need
64-bit access.

-Kevin


-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Kevin Lawton                        [EMAIL PROTECTED]
MandrakeSoft, Inc.                  Plex86 developer
http://www.linux-mandrake.com/      http://www.plex86.org/
/* Compile the file with the following command:
 *
 *   gcc -Wall -D_FILE_OFFSET_BITS=64 fileio64.c
 *
 * This compiles with off_t of size 64bits, and redirects
 * IO library calls to 64bit variants.  If you want to access
 * the 64bit extensions directly, you can use
 *
 *   -D_LARGEFILE64_SOURCE
 *
 * and then call open64(), lseek64(), etc directly.
 */

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>


int main( void )
{
    char buf[0x100];
    int fd;
    off_t off, target;
    ssize_t count;

    printf("sizeof(off_t) is %u bytes\n", sizeof(off_t));

    target = (loff_t)(1ULL << 32);

    fd = open("/dev/hda", O_RDONLY
/* I wasn't sure if you still need to pass O_LARGEFILE to
 * open, even when the compile options are turning on 64-bit
 * library translations?  Is this needed when opening files,
 * rather than filesystems?
 */
#if 0
#ifdef O_LARGEFILE
               | O_LARGEFILE
#endif
#endif
              );
    if ( fd < 0 )
    {
        perror( "open" );
        exit( 1 );
    }

    off = lseek(fd, target, SEEK_SET);
    if ( off != target )
    {
        fprintf(stderr, "llseek FAILED: requested=0x%llx, got=0x%llx\n",
            target, off);
        exit( 1 );
    }
    fprintf(stderr, "lseek() succeeded\n");

    count = read( fd, buf, 0x100 );

    if ( count != 0x100 )
    {
        fprintf(stderr, "read FAILED: requested=%u, got=%u\n",
                0x100, count);
        exit( 1 );
    }
    fprintf(stderr, "read() succeeded\n");

    fprintf(stderr, "All operations OK\n");
    return 0;
}

Reply via email to