This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: 64-bit file operations (lseek64() etc) misbehaving


Mike,

Please make sure your mailer respects the Reply-To: header.  Thanks.

Frankly, I don't see any reason why open() *wouldn't* succeed on
\\.\PhysicalDrive0...  All it'll do is recognize a Win32 pathname (because
of the '\'), and pass it along to Windows.  OTOH, Cygwin will not see this
name as special -- from Cygwin's point of view it's just another file.  So
any operations invoked on it (including "open") will be regular Windows
file calls, not special ones (e.g., NtOpenFile with the right attributes,
as done in fhandler_dev_raw::open).  This might be the reason for your
initial problem.
	Igor

On Wed, 31 Mar 2004, Mike Brown wrote:

> Hi,
>
> Yep that fixes me.  Thanks Igor.  Odd that the open() succeeds for
> \\.\PhysicalDrive0.  _shrug_.  I'll gladly use /dev/sda.
>
> -Mike
>
> On Wed, Mar 31, 2004 at 04:18:49PM -0500, Igor Pechtchanski wrote:
> > Mike,
> >
> > FYI, the following works just fine on my system (Win2k, Cygwin 1.5.9, 11G
> > harddrive):
> >
> > ------------------------------------------------------------------------------
> > #include <sys/types.h>
> > #include <stdio.h>
> > #include <fcntl.h>
> > #include <unistd.h>
> >
> > #define BYTE (sizeof(unsigned char))
> > #define KB (1024 * BYTE)
> > #define MB (1024 * KB)
> > #define GB (1024 * MB)
> >
> > int main(int argc, char *argv[]) {
> >       int fd;
> >       off_t maxblock;
> >       if ((fd = open("/dev/sda", O_RDONLY)) < 0) {
> >               perror("open failed"); exit(2);
> >       }
> >       if ((maxblock = lseek(fd, 0, SEEK_END)) == (off_t) -1) {
> >               perror("lseek failed"); exit(3);
> >       }
> >       printf("%llub, %lluKb, %lluMb, %lluGb in /dev/sda\n", maxblock,
> >              maxblock / KB, maxblock / MB, maxblock / GB);
> >       close(fd);
> >       return 0;
> > }
> > ------------------------------------------------------------------------------
> >
> > If I replace "/dev/sda" by "\\\\.\\PhysicalDrive0" everywhere, however, I
> > get the same result you do.  Food for thought.
> > HTH,
> >       Igor
> >
> > On Wed, 31 Mar 2004, Mike Brown wrote:
> >
> > > Hi Igor,
> > >
> > > Yes the a.out a.exe thing is a typo.  I've read the page on special
> > > filenames.  You can use the POSIX names or you can open the Windows
> > > device namespace name.  Either way, my problem isn't with opening and
> > > reading from the disk device.  That works fine.  My problem is with
> > > lseek() not being able to seek past the 4Gb boundary.
> > >
> > > Thanks.
> > >
> > > On Wed, Mar 31, 2004 at 02:14:18PM -0500, Igor Pechtchanski wrote:
> > > > On Wed, 31 Mar 2004, Mike Brown wrote:
> > > >
> > > > > Hi,
> > > > >
> > > > > cygwin 1.5.9-1 on Windows XP Service Pack 1.
> > > > >
> > > > > I need 64-bit versions of lseek() and friends.  No prototype exists for
> > > > > lseek64().  I've searched the archives on the list and many claim that
> > > > > 64-bit support is "automatic" and lseek() resolves at compile time to
> > > > > lseek64().  This isn't happening for me.  Is there a compile time
> > > > > define I need to make this happen?
> > > > >
> > > > > [snip]
> > > > > Here's a simple example app I'm using.  I run via:  a.out PhysicalDrive0
> > > >
> > > > Michael,
> > > >
> > > > I don't know if it's related to the problem you're having, but I'm sure
> > > > you've read <http://cygwin.com/cygwin-ug-net/using-specialnames.html>,
> > > > right?  Try compiling a Linux version with "#define lseek64 lseek", and
> > > > use ./a.exe /dev/sda (note that Cygwin gcc produces a.exe, not a.out, by
> > > > default, so I assume the above is a typo or the result of an explicit "-o"
> > > > flag).
> > > >       Igor
> > > >
> > > > > -----------------------
> > > > > /* #define LINUX */
> > > > > #define WIN32
> > > > >
> > > > > [snip]
> > > > > #ifdef WIN32
> > > > >         /* automatically add the \\.\ crap in front */
> > > > >         sprintf(filename, "\\\\.\\%s", argv[1]);
> > > > > #else
> > > > >         sprintf(filename, "%s", argv[1]);
> > > > > #endif
> > > > > [snip]
> > > > > #ifdef WIN32
> > > > >         maxblock = lseek(fd, 0, SEEK_END);
> > > > > #else
> > > > >         maxblock = lseek64(fd, 0, SEEK_END);
> > > > > #endif

-- 
				http://cs.nyu.edu/~pechtcha/
      |\      _,,,---,,_		pechtcha@cs.nyu.edu
ZZZzz /,`.-'`'    -.  ;-;;,_		igor@watson.ibm.com
     |,4-  ) )-,_. ,\ (  `'-'		Igor Pechtchanski, Ph.D.
    '---''(_/--'  `-'\_) fL	a.k.a JaguaR-R-R-r-r-r-.-.-.  Meow!

"I have since come to realize that being between your mentor and his route
to the bathroom is a major career booster."  -- Patrick Naughton

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]