--- IO-AIO/AIO.xs 2010/08/04 16:09:36 1.170 +++ IO-AIO/AIO.xs 2010/08/04 17:16:19 1.171 @@ -167,6 +167,19 @@ # define posix_madvise(a,b,c) errno = ENOSYS /* also return ENOSYS */ #endif +#ifndef PROT_NONE +# define PROT_NONE 0 +#endif +#ifndef PROT_READ +# define PROT_READ 0 +#endif +#ifndef PROT_WRITE +# define PROT_READ 0 +#endif +#ifndef PROT_EXEC +# define PROT_EXEC 0 +#endif + #ifndef ST_NODEV # define ST_NODEV 0 #endif @@ -633,6 +646,7 @@ #if !_POSIX_MAPPED_FILES # define mmap(addr,length,prot,flags,fd,offs) (errno = ENOSYS, -1) # define munmap(addr,length) (errno = ENOSYS, -1) +# define mprotect(addr,len,prot) (errno = ENOSYS, -1) #endif #define MMAP_MAGIC PERL_MAGIC_ext @@ -745,8 +759,8 @@ const_iv (ST_NODIRATIME) const_iv (ST_RELATIME) - const_iv (PROT_EXEC) const_iv (PROT_NONE) + const_iv (PROT_EXEC) const_iv (PROT_READ) const_iv (PROT_WRITE) @@ -1447,19 +1461,31 @@ sv_unmagic (scalar, MMAP_MAGIC); int -madvise (SV *scalar, off_t offset, off_t length, IV advice) +madvise (SV *scalar, off_t offset, off_t length, IV advice_or_prot) + ALIAS: + mprotect = 1 PROTOTYPE: $$$$ CODE: { - char *addr = SvPV_nolen (scalar) + offset; - - if (!SvOK (ST (2))) - length = SvCUR (scalar) - offset; + STRLEN cur; + char *addr = SvPVbyte (scalar, cur); - if (addr >= SvEND (scalar) || length <= 0) - XSRETURN_EMPTY; + if (offset > cur) + RETVAL = errno = EFAULT; + else + { + if (!SvOK (ST (2))) + length = cur - offset; - RETVAL = posix_madvise (addr, length, advice); + if (offset + length > cur) + RETVAL = errno = EFAULT; + else + switch (ix) + { + case 0: RETVAL = posix_madvise (addr + offset, length, advice_or_prot); break; + case 1: RETVAL = mprotect (addr + offset, length, advice_or_prot); break; + } + } } OUTPUT: RETVAL