*BSD News Article 37742


Return to BSD News archive

Xref: sserve comp.unix.bsd:15269 comp.unix.internals:7964
Newsgroups: comp.unix.bsd,comp.unix.internals
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!hookup!news.mathworks.com!udel!gatech!howland.reston.ans.net!EU.net!uunet!clsi!shankha
From: shankha@tibu (Shankha S. Mitra)
Subject: Re: mmap() returns errno = 5. Any Clues??
In-Reply-To: leo@krabat.marco.de's message of 26 Oct 94 09:34:34 GMT
Message-ID: <SHANKHA.94Nov2164334@canopus.tibu>
Followup-To: comp.unix.bsd,comp.unix.internals
Sender: usenet@clsi.COM
Organization: COMPASS Design Automation
References: <38gb37$4d6@speedy.inri.com> <3895@krabat.marco.de>
Date: 02 Nov 1994 21:43:34 GMT
Lines: 71


In article <3895@krabat.marco.de> leo@krabat.marco.de (Matthias Pfaller) writes:

   Xref: clsi comp.unix.bsd:16206 comp.unix.internals:4014
   Path: clsi!uunet!news.mathworks.com!news.duke.edu!convex!cs.utexas.edu!howland.reston.ans.net!EU.net!Germany.EU.net!b.marco.de!krabat!leo
   From: leo@krabat.marco.de (Matthias Pfaller)
   Newsgroups: comp.unix.bsd,comp.unix.internals
   Date: 26 Oct 94 09:34:34 GMT
   References: <38gb37$4d6@speedy.inri.com>
   Followup-To: comp.unix.bsd,comp.unix.internals
   Distribution: world
   Organization: marco GmbH, D-85221 Dachau
   Lines: 17
   X-Newsreader: TIN [version 1.2 PL2]

   Anthony D Alston (ada@grumpy.mnfep.nn.inri.com) wrote:
   > The following line fails when trying to memory map a file thats
   > on a NFS mount directory. mmap() returns 0xffffff and errno = 5. 

   > This line works fine when the file is on a local file system.

   > addr = mmap(0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0l);

   > I'm running SunOS 4.1.1

   I had problems with mmap, nfs and SunOS 4.x.x too. It turned out that
   if you have locked the file in question you can't mmap it for an unknown
   period of time even if the lock is removed... So in case your mixing mmap
   and nfs locking you may have the same problem I had (Solution: Don't use
   mmap).

	   Matthias

Anthony:

I tried an example out:

#ifdef READ_WRITE
    fd = open(file, O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO);
#else
    fd = open(file, O_RDONLY, S_IRWXU | S_IRWXG | S_IRWXO);
#endif

    /* find the length of the file */
    lseek(fd, (off_t)0, SEEK_END);
    len = lseek(fd, (off_t)0, SEEK_CUR);
    lseek(fd, (off_t)0, SEEK_SET);      /* position back to beginning */

    /* map file into memory */
#ifdef READ_WRITE
    /* ada@grumpy.mnfep.nn.inri.com (Anthony D Alston) reports this
       doesn't work on SunOS 4.1.1 if file is on an NFS mount directory */
    *pa = mmap(0, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
#else
    *pa = mmap(0, len, PROT_READ, MAP_SHARED, fd, 0);
#endif


Both ifdef's work on files in both local and NFS-mounted disks.  
I running on SunOS 4.1.3 though.

I was getting an EACCES because I was opening the file with O_RDONLY and
trying to map it with PROT_READ|PROT_WRITE.  You're not doing somthing
similar are you?

Shankha
--
------------------------------------------------------------------------------
Shankha S. Mitra                      			shankha@compass-da.com
COMPASS Design Automation                                   410.992.5700 x1227
------------------------------------------------------------------------------