X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp_sys.c;h=5d5b92dfe91925af294d92dc6002fc68ddea4464;hb=2e1d04bc4fa2d036f823d5251c731f594e0246dd;hp=2f674839e51b7c032fb22f93688e0fba68c64ac8;hpb=5cdabb00637dac511820ef15cf49e86f5e883771;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp_sys.c b/pp_sys.c index 2f67483..5d5b92d 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -3679,6 +3679,8 @@ PP(pp_fork) EXTEND(SP, 1); PERL_FLUSHALL_FOR_CHILD; childpid = PerlProc_fork(); + if (childpid == -1) + RETSETUNDEF; PUSHi(childpid); RETURN; # else @@ -3742,7 +3744,7 @@ PP(pp_system) } } PERL_FLUSHALL_FOR_CHILD; -#if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) +#if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) && !defined(__CYGWIN__) if (PerlProc_pipe(pp) >= 0) did_pipes = 1; while ((childpid = vfork()) == -1) { @@ -4085,14 +4087,14 @@ PP(pp_gmtime) SV *tsv; if (!tmbuf) RETPUSHUNDEF; - tsv = Perl_newSVpvf(aTHX_ "%s %s %2"IVdf" %02"IVdf":%02"IVdf":%02"IVdf" %"IVdf, + tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %d", dayname[tmbuf->tm_wday], monname[tmbuf->tm_mon], - (IV)tmbuf->tm_mday, - (IV)tmbuf->tm_hour, - (IV)tmbuf->tm_min, - (IV)tmbuf->tm_sec, - (IV)tmbuf->tm_year + 1900); + tmbuf->tm_mday, + tmbuf->tm_hour, + tmbuf->tm_min, + tmbuf->tm_sec, + tmbuf->tm_year + 1900); PUSHs(sv_2mortal(tsv)); } else if (tmbuf) { @@ -4771,8 +4773,50 @@ PP(pp_gpwent) register SV *sv; STRLEN n_a; struct passwd *pwent = NULL; -/* We do not use HAS_GETSPENT in pp_gpwent() but leave it here in the case - * somebody wants to write an XS to access the shadow passwords. --jhi */ + /* + * We currently support only the SysV getsp* shadow password interface. + * The interface is declared in and often one needs to link + * with -lsecurity or some such. + * This interface is used at least by Solaris, HP-UX, IRIX, and Linux. + * (and SCO?) + * + * AIX getpwnam() is clever enough to return the encrypted password + * only if the caller (euid?) is root. + * + * There are at least two other shadow password APIs. Many platforms + * seem to contain more than one interface for accessing the shadow + * password databases, possibly for compatibility reasons. + * The getsp*() is tby far he simplest one, the other two interfaces + * are much more complicated, but also very similar to each other. + * + * + * + * + * struct pr_passwd *getprpw*(); + * The password is in + * char getprpw*(...).ufld.fd_encrypt[AUTH_MAX_CIPHERTEXT_LENGTH] + * + * + * + * + * struct es_passwd *getespw*(); + * The password is in + * char *(getespw*(...).ufld.fd_encrypt) + * + * XXX Configure test needed for getprpwnam XXX + * XXX Configure test needed for getespwnam XXX + * + * In HP-UX for getprpw*() the manual page claims that one should include + * instead of , but that is not needed + * if one includes as that includes , + * and pp_sys.c already includes if there is such. + * + * In Digital UNIX/Tru64 if using the getespw*() (which seems to be + * be preferred interface, even though also the getprpw*() interface + * is available) one needs to link with -lsecurity -ldb -laud -lm. + * + * --jhi + */ # ifdef HAS_GETSPNAM struct spwd *spwent = NULL; # endif @@ -4900,9 +4944,6 @@ PP(pp_spwent) djSP; #if defined(HAS_PASSWD) && defined(HAS_SETPWENT) setpwent(); -# ifdef HAS_SETSPENT - setspent(); -# endif RETPUSHYES; #else DIE(aTHX_ PL_no_func, "setpwent"); @@ -4914,9 +4955,6 @@ PP(pp_epwent) djSP; #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT) endpwent(); -# ifdef HAS_ENDSPENT - endspent(); -# endif RETPUSHYES; #else DIE(aTHX_ PL_no_func, "endpwent");