X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FIO%2FIO.xs;h=b3125aa6017d7b3a7b717f9bcf31ff785ea7812b;hb=8ca60cef700efb73a84648ac3b19fd3a3eecd992;hp=dc810d68a5f9fefd45c1e91d32760ae4263db913;hpb=824215e2e3b067efbb0104afd616d77cb9526d1a;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/IO/IO.xs b/ext/IO/IO.xs index dc810d6..b3125aa 100644 --- a/ext/IO/IO.xs +++ b/ext/IO/IO.xs @@ -26,7 +26,7 @@ #endif #ifdef PerlIO -#ifdef MACOS_TRADITIONAL +#if defined(MACOS_TRADITIONAL) && defined(USE_SFIO) #define PERLIO_IS_STDIO 1 #undef setbuf #undef setvbuf @@ -49,11 +49,12 @@ typedef FILE * OutputStream; #define gv_stashpvn(str,len,flags) gv_stashpv(str,flags) #endif +static int not_here(const char *s) __attribute__noreturn__; static int -not_here(char *s) +not_here(const char *s) { croak("%s not implemented on this architecture", s); - return -1; + NORETURN_FUNCTION_END; } @@ -64,62 +65,33 @@ not_here(char *s) static int io_blocking(pTHX_ InputStream f, int block) { +#if defined(HAS_FCNTL) int RETVAL; if(!f) { errno = EBADF; return -1; } -#if defined(HAS_FCNTL) RETVAL = fcntl(PerlIO_fileno(f), F_GETFL, 0); if (RETVAL >= 0) { int mode = RETVAL; + int newmode = mode; #ifdef O_NONBLOCK /* POSIX style */ -#if defined(O_NDELAY) && O_NDELAY != O_NONBLOCK - /* Ooops has O_NDELAY too - make sure we don't - * get SysV behaviour by mistake. */ - /* E.g. In UNICOS and UNICOS/mk a F_GETFL returns an O_NDELAY +# ifndef O_NDELAY +# define O_NDELAY O_NONBLOCK +# endif + /* Note: UNICOS and UNICOS/mk a F_GETFL returns an O_NDELAY * after a successful F_SETFL of an O_NONBLOCK. */ RETVAL = RETVAL & (O_NONBLOCK | O_NDELAY) ? 0 : 1; - if (block >= 0) { - if ((mode & O_NDELAY) || ((block == 0) && !(mode & O_NONBLOCK))) { - int ret; - mode = (mode & ~O_NDELAY) | O_NONBLOCK; - ret = fcntl(PerlIO_fileno(f),F_SETFL,mode); - if(ret < 0) - RETVAL = ret; - } - else - if ((mode & O_NDELAY) || ((block > 0) && (mode & O_NONBLOCK))) { - int ret; - mode &= ~(O_NONBLOCK | O_NDELAY); - ret = fcntl(PerlIO_fileno(f),F_SETFL,mode); - if(ret < 0) - RETVAL = ret; - } + if (block == 0) { + newmode &= ~O_NDELAY; + newmode |= O_NONBLOCK; + } else if (block > 0) { + newmode &= ~(O_NDELAY|O_NONBLOCK); } #else - /* Standard POSIX */ - RETVAL = RETVAL & O_NONBLOCK ? 0 : 1; - - if ((block == 0) && !(mode & O_NONBLOCK)) { - int ret; - mode |= O_NONBLOCK; - ret = fcntl(PerlIO_fileno(f),F_SETFL,mode); - if(ret < 0) - RETVAL = ret; - } - else if ((block > 0) && (mode & O_NONBLOCK)) { - int ret; - mode &= ~O_NONBLOCK; - ret = fcntl(PerlIO_fileno(f),F_SETFL,mode); - if(ret < 0) - RETVAL = ret; - } -#endif -#else /* Not POSIX - better have O_NDELAY or we can't cope. * for BSD-ish machines this is an acceptable alternative * for SysV we can't tell "would block" from EOF but that is @@ -127,25 +99,21 @@ io_blocking(pTHX_ InputStream f, int block) */ RETVAL = RETVAL & O_NDELAY ? 0 : 1; - if ((block == 0) && !(mode & O_NDELAY)) { - int ret; - mode |= O_NDELAY; - ret = fcntl(PerlIO_fileno(f),F_SETFL,mode); - if(ret < 0) - RETVAL = ret; - } - else if ((block > 0) && (mode & O_NDELAY)) { - int ret; - mode &= ~O_NDELAY; - ret = fcntl(PerlIO_fileno(f),F_SETFL,mode); - if(ret < 0) - RETVAL = ret; - } + if (block == 0) { + newmode |= O_NDELAY; + } else if (block > 0) { + newmode &= ~O_NDELAY; + } #endif + if (newmode != mode) { + const int ret = fcntl(PerlIO_fileno(f),F_SETFL,newmode); + if (ret < 0) + RETVAL = ret; + } } return RETVAL; #else - return -1; + return -1; #endif } @@ -205,7 +173,7 @@ MODULE = IO PACKAGE = IO::File PREFIX = f void new_tmpfile(packname = "IO::File") - char * packname + const char * packname PREINIT: OutputStream fp; GV *gv; @@ -235,14 +203,14 @@ _poll(timeout,...) PPCODE: { #ifdef HAS_POLL - int nfd = (items - 1) / 2; + const int nfd = (items - 1) / 2; SV *tmpsv = NEWSV(999,nfd * sizeof(struct pollfd)); struct pollfd *fds = (struct pollfd *)SvPVX(tmpsv); int i,j,ret; for(i=1, j=0 ; j < nfd ; j++) { fds[j].fd = SvIV(ST(i)); i++; - fds[j].events = SvIV(ST(i)); + fds[j].events = (short)SvIV(ST(i)); i++; fds[j].revents = 0; } @@ -268,7 +236,7 @@ io_blocking(handle,blk=-1) PROTOTYPE: $;$ CODE: { - int ret = io_blocking(aTHX_ handle, items == 1 ? -1 : blk ? 1 : 0); + const int ret = io_blocking(aTHX_ handle, items == 1 ? -1 : blk ? 1 : 0); if(ret >= 0) XSRETURN_IV(ret); else