X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp_sys.c;h=afac5ab1ce0c1d3a0c4226eff8cb69286fc896ae;hb=0295179fdf8aa1b8c029859896e7340a11a3de74;hp=cbd5764a313eccc2aee339541f526a587fb2924b;hpb=d5a9bfb0fc8643b1208bad4f15e3c88ef46b4160;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp_sys.c b/pp_sys.c index cbd5764..afac5ab 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -230,7 +230,7 @@ static char zero_but_true[ZBTLEN + 1] = "0 but true"; || defined(HAS_SETREGID) || defined(HAS_SETRESGID)) /* The Hard Way. */ STATIC int -S_emulate_eaccess(pTHX_ const char* path, int mode) +S_emulate_eaccess(pTHX_ const char* path, Mode_t mode) { Uid_t ruid = getuid(); Uid_t euid = geteuid(); @@ -295,7 +295,7 @@ S_emulate_eaccess(pTHX_ const char* path, int mode) #if !defined(PERL_EFF_ACCESS_R_OK) STATIC int -S_emulate_eaccess(pTHX_ const char* path, int mode) +S_emulate_eaccess(pTHX_ const char* path, Mode_t mode) { Perl_croak(aTHX_ "switching effective uid is not implemented"); /*NOTREACHED*/ @@ -501,10 +501,16 @@ PP(pp_open) djSP; dTARGET; GV *gv; SV *sv; + SV *name; + I32 have_name = 0; char *tmps; STRLEN len; MAGIC *mg; + if (MAXARG > 2) { + name = POPs; + have_name = 1; + } if (MAXARG > 1) sv = POPs; if (!isGV(TOPs)) @@ -537,6 +543,8 @@ PP(pp_open) PUSHMARK(SP); XPUSHs(SvTIED_obj((SV*)gv, mg)); XPUSHs(sv); + if (have_name) + XPUSHs(name); PUTBACK; ENTER; call_method("OPEN", G_SCALAR); @@ -546,7 +554,7 @@ PP(pp_open) } tmps = SvPV(sv, len); - if (do_open(gv, tmps, len, FALSE, O_RDONLY, 0, Nullfp)) + if (do_open9(gv, tmps, len, FALSE, O_RDONLY, 0, Nullfp, name, have_name)) PUSHi( (I32)PL_forkprocess ); else if (PL_forkprocess == 0) /* we are a new child */ PUSHi(0); @@ -808,10 +816,17 @@ PP(pp_untie) if (ckWARN(WARN_UNTIE)) { MAGIC * mg ; if (mg = SvTIED_mg(sv, how)) { +#ifdef IV_IS_QUAD + if (mg && SvREFCNT(SvRV(mg->mg_obj)) > 1) + Perl_warner(aTHX_ WARN_UNTIE, + "untie attempted while %" PERL_PRIu64 " inner references still exist", + (UV)SvREFCNT(SvRV(mg->mg_obj)) - 1 ) ; +#else if (mg && SvREFCNT(SvRV(mg->mg_obj)) > 1) Perl_warner(aTHX_ WARN_UNTIE, "untie attempted while %lu inner references still exist", (unsigned long)SvREFCNT(SvRV(mg->mg_obj)) - 1 ) ; +#endif } } @@ -1652,6 +1667,7 @@ PP(pp_send) else #endif { + /* See the note at doio.c:do_print about filesize limits. --jhi */ length = PerlLIO_write(PerlIO_fileno(IoIFP(io)), buffer+offset, length); } @@ -1749,7 +1765,7 @@ PP(pp_sysseek) djSP; GV *gv; int whence = POPi; - Off_t offset = POPl; + Off_t offset = (Off_t)SvIVx(POPs); MAGIC *mg; gv = PL_last_in_gv = (GV*)POPs; @@ -2457,30 +2473,30 @@ PP(pp_stat) if (max) { EXTEND(SP, max); EXTEND_MORTAL(max); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_dev))); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_ino))); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_mode))); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_nlink))); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_uid))); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_gid))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_dev))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_ino))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_mode))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_nlink))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_uid))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_gid))); #ifdef USE_STAT_RDEV - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_rdev))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_rdev))); #else PUSHs(sv_2mortal(newSVpvn("", 0))); #endif - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_size))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_size))); #ifdef BIG_TIME - PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_atime))); - PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_mtime))); - PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_ctime))); + PUSHs(sv_2mortal(newSVnv(PL_statcache.st_atime))); + PUSHs(sv_2mortal(newSVnv(PL_statcache.st_mtime))); + PUSHs(sv_2mortal(newSVnv(PL_statcache.st_ctime))); #else - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_atime))); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_mtime))); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_ctime))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_atime))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_mtime))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_ctime))); #endif #ifdef USE_STAT_BLOCKS - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_blksize))); - PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_blocks))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_blksize))); + PUSHs(sv_2mortal(newSViv(PL_statcache.st_blocks))); #else PUSHs(sv_2mortal(newSVpvn("", 0))); PUSHs(sv_2mortal(newSVpvn("", 0))); @@ -2703,7 +2719,7 @@ PP(pp_ftmtime) djSP; dTARGET; if (result < 0) RETPUSHUNDEF; - PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_mtime) / 86400.0 ); + PUSHn( (PL_basetime - PL_statcache.st_mtime) / 86400.0 ); RETURN; } @@ -2713,7 +2729,7 @@ PP(pp_ftatime) djSP; dTARGET; if (result < 0) RETPUSHUNDEF; - PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_atime) / 86400.0 ); + PUSHn( (PL_basetime - PL_statcache.st_atime) / 86400.0 ); RETURN; } @@ -2723,7 +2739,7 @@ PP(pp_ftctime) djSP; dTARGET; if (result < 0) RETPUSHUNDEF; - PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_ctime) / 86400.0 ); + PUSHn( (PL_basetime - PL_statcache.st_ctime) / 86400.0 ); RETURN; } @@ -3535,7 +3551,7 @@ PP(pp_fork) PP(pp_wait) { -#if !defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(CYGWIN32) +#if !defined(DOSISH) || defined(OS2) || defined(WIN32) djSP; dTARGET; Pid_t childpid; int argflags; @@ -3551,7 +3567,7 @@ PP(pp_wait) PP(pp_waitpid) { -#if !defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(CYGWIN32) +#if !defined(DOSISH) || defined(OS2) || defined(WIN32) djSP; dTARGET; Pid_t childpid; int optype; @@ -3749,21 +3765,21 @@ PP(pp_getpgrp) { #ifdef HAS_GETPGRP djSP; dTARGET; - int pid; - I32 value; + Pid_t pid; + Pid_t pgrp; if (MAXARG < 1) pid = 0; else pid = SvIVx(POPs); #ifdef BSD_GETPGRP - value = (I32)BSD_GETPGRP(pid); + pgrp = (I32)BSD_GETPGRP(pid); #else if (pid != 0 && pid != getpid()) DIE(aTHX_ "POSIX getpgrp can't take an argument"); - value = (I32)getpgrp(); + pgrp = getpgrp(); #endif - XPUSHi(value); + XPUSHi(pgrp); RETURN; #else DIE(aTHX_ PL_no_func, "getpgrp()"); @@ -3774,8 +3790,8 @@ PP(pp_setpgrp) { #ifdef HAS_SETPGRP djSP; dTARGET; - int pgrp; - int pid; + Pid_t pgrp; + Pid_t pid; if (MAXARG < 2) { pgrp = 0; pid = 0; @@ -3934,15 +3950,15 @@ PP(pp_gmtime) PUSHs(sv_2mortal(tsv)); } else if (tmbuf) { - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_sec))); - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_min))); - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_hour))); - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mday))); - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mon))); - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_year))); - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_wday))); - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_yday))); - PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_isdst))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_sec))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_min))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_hour))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_mday))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_mon))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_year))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_wday))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_yday))); + PUSHs(sv_2mortal(newSViv(tmbuf->tm_isdst))); } RETURN; } @@ -3957,7 +3973,7 @@ PP(pp_alarm) EXTEND(SP, 1); if (anum < 0) RETPUSHUNDEF; - PUSHi((I32)anum); + PUSHi(anum); RETURN; #else DIE(aTHX_ PL_no_func, "Unsupported function alarm"); @@ -4609,7 +4625,7 @@ PP(pp_gpwent) register SV *sv; struct passwd *pwent; STRLEN n_a; -#ifdef HAS_GETSPENT +#if defined(HAS_GETSPENT) || defined(HAS_GETSPNAM) struct spwd *spwent = NULL; #endif @@ -4631,8 +4647,10 @@ PP(pp_gpwent) spwent = getspnam(pwent->pw_name); } # endif +# ifdef HAS_GETSPENT else spwent = (struct spwd *)getspent(); +# endif #endif EXTEND(SP, 10); @@ -4653,7 +4671,7 @@ PP(pp_gpwent) PUSHs(sv = sv_mortalcopy(&PL_sv_no)); #ifdef PWPASSWD -# ifdef HAS_GETSPENT +# if defined(HAS_GETSPENT) || defined(HAS_GETSPNAM) if (spwent) sv_setpv(sv, spwent->sp_pwdp); else @@ -4722,7 +4740,7 @@ PP(pp_gpwent) PP(pp_spwent) { djSP; -#if defined(HAS_PASSWD) && defined(HAS_SETPWENT) && !defined(CYGWIN32) +#if defined(HAS_PASSWD) && defined(HAS_SETPWENT) && !defined(CYGWIN) setpwent(); # ifdef HAS_SETSPENT setspent(); @@ -4983,7 +5001,7 @@ fcntl_emulate_flock(int fd, int operation) return -1; } flock.l_whence = SEEK_SET; - flock.l_start = flock.l_len = 0L; + flock.l_start = flock.l_len = (Off_t)0; return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock); }