This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
POSIX: delete the L_tmpnam and L_tmpname symbols
authorAaron Crane <arc@cpan.org>
Fri, 13 May 2016 12:10:38 +0000 (13:10 +0100)
committerAaron Crane <arc@cpan.org>
Mon, 16 May 2016 12:47:10 +0000 (13:47 +0100)
The history here is relatively complicated.

The L_tmpname symbol is neither specified by POSIX or defined by traditional
Unix system; it's simply a typo for L_tmpnam, first introduced in Perl 5.0.

Commit 33f01dd10fdacfa5ccb83c4f933cacb0f65b707e (part of Perl 5.6) added
support for L_tmpnam, treating L_tmpname as a back-compat synonym. However,
no version of Perl has ever made L_tmpnam exportable, even at explicit
request; using that symbol has always required using its fully-qualified
POSIX::L_tmpnam name.

During the 5.8 development cycle, an apparently-unintended consequence of
various improvements to the way that POSIX.pm generates and exports constants
meant that L_tmpname stopped working. It continued to be exportable, but
trying to use the constant yielded an exception saying "Your vendor has not
defined POSIX macro L_tmpname". (This isn't exactly incorrect, of course: no
vendor defines the macro L_tmpname!)

At this point, therefore, there seems little benefit in trying to resurrect
support for the L_tmpname typo: it's impossible for any program running on
5.8.0 or later to have successfully used it.

There's perhaps an argument for making L_tmpnam exportable at this point,
since it does work when called by its full-qualified name. One option would
be to add it to @EXPORT_OK; but that is explicitly counselled against by the
POSIX.pm comments summarising the policy on symbol exports, which recommend
adding a new export tag instead. In this case, the obvious tag to use is
:stdio_h (which already exists), since the C-level symbol is provided by the
<stdio.h> header.

However, that doesn't seem worth it to me. The only possible use of L_tmpnam
is to create a buffer of a size suitable for passing to the tmpnam() C
function (which is presumably why nobody's noticed in the last fifteen years
that the symbol isn't actually exported). Furthermore, the POSIX.pm wrapper
for tmpnam() itself was deleted by 19fc2965b60669d7bc25548edb32e3cdd86a68de,
a few days ago, so merely deleting this additional symbol seems correct.

ext/POSIX/Makefile.PL
ext/POSIX/lib/POSIX.pm
ext/POSIX/lib/POSIX.pod
ext/POSIX/t/export.t
ext/POSIX/t/unimplemented.t

index 5a65173..a6e870c 100644 (file)
@@ -48,7 +48,7 @@ my @names =
       EUSERS EWOULDBLOCK EXDEV FILENAME_MAX F_OK HUPCL ICANON ICRNL IEXTEN
       IGNBRK IGNCR IGNPAR INLCR INPCK INT_MAX INT_MIN ISIG ISTRIP IXOFF IXON
       LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME
-      LINK_MAX LONG_MAX LONG_MIN L_ctermid L_cuserid L_tmpnam MAX_CANON
+      LINK_MAX LONG_MAX LONG_MIN L_ctermid L_cuserid MAX_CANON
       MAX_INPUT MB_LEN_MAX MSG_CTRUNC MSG_DONTROUTE MSG_EOR MSG_OOB MSG_PEEK
       MSG_TRUNC MSG_WAITALL NAME_MAX NCCS NGROUPS_MAX NOFLSH OPEN_MAX OPOST
       PARENB PARMRK PARODD PATH_MAX PIPE_BUF RAND_MAX R_OK SCHAR_MAX
@@ -74,8 +74,6 @@ my @names =
    {name=>"SIG_DFL", value=>"PTR2IV(SIG_DFL)", not_constant=>1},
    {name=>"SIG_ERR", value=>"PTR2IV(SIG_ERR)", not_constant=>1},
    {name=>"SIG_IGN", value=>"PTR2IV(SIG_IGN)", not_constant=>1},
-   # L_tmpnam[e] was a typo--retained for compatibility
-   {name=>"L_tmpname", value=>"L_tmpnam"},
    {name=>"NULL", value=>"0"},
    {name=>"_POSIX_JOB_CONTROL", type=>"YES", default=>["IV", "0"]},
    {name=>"_POSIX_SAVED_IDS", type=>"YES", default=>["IV", "0"]},
index d3755a5..6231bcb 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
 
 our ($AUTOLOAD, %SIGRT);
 
-our $VERSION = '1.68';
+our $VERSION = '1.69';
 
 require XSLoader;
 
@@ -24,6 +24,7 @@ sub usage { croak "Usage: POSIX::$_[0]" }
 XSLoader::load();
 
 my %replacement = (
+    L_tmpnam    => undef,
     atexit      => 'END {}',
     atof        => undef,
     atoi        => undef,
@@ -337,7 +338,7 @@ my %default_export_tags = ( # cf. exports policy below
     stddef_h =>        [qw(NULL offsetof)],
 
     stdio_h => [qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid
-               L_tmpname NULL SEEK_CUR SEEK_END SEEK_SET
+               NULL SEEK_CUR SEEK_END SEEK_SET
                STREAM_MAX TMP_MAX stderr stdin stdout
                clearerr fclose fdopen feof ferror fflush fgetc fgetpos
                fgets fopen fprintf fputc fputs fread freopen
index 2993421..4393702 100644 (file)
@@ -2593,7 +2593,7 @@ C<EXIT_FAILURE> C<EXIT_SUCCESS> C<MB_CUR_MAX> C<RAND_MAX>
 
 =item Constants
 
-C<BUFSIZ> C<EOF> C<FILENAME_MAX> C<L_ctermid> C<L_cuserid> C<L_tmpname> C<TMP_MAX>
+C<BUFSIZ> C<EOF> C<FILENAME_MAX> C<L_ctermid> C<L_cuserid> C<TMP_MAX>
 
 =back
 
index f82a591..5f71b32 100644 (file)
@@ -49,7 +49,7 @@ my %expect = (
             LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME LDBL_DIG
             LDBL_EPSILON LDBL_MANT_DIG LDBL_MAX LDBL_MAX_10_EXP
             LDBL_MAX_EXP LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP LINK_MAX
-            LONG_MAX LONG_MIN L_ctermid L_cuserid L_tmpname MAX_CANON
+            LONG_MAX LONG_MIN L_ctermid L_cuserid MAX_CANON
             MAX_INPUT MB_CUR_MAX MB_LEN_MAX NAME_MAX NCCS NDEBUG
             NGROUPS_MAX NOFLSH NULL OPEN_MAX OPOST O_ACCMODE O_APPEND
             O_CREAT O_EXCL O_NOCTTY O_NONBLOCK O_RDONLY O_RDWR O_TRUNC
@@ -148,7 +148,7 @@ my %expect = (
             localtime log mkdir nice open opendir pipe printf rand
             read readdir rename rewinddir rmdir sin sleep sprintf sqrt
             srand stat system time times umask unlink utime wait
-            waitpid write
+            waitpid write L_tmpnam
         ),
         # this stuff was added in 5.21
         # (though an oversight meant that lround wasn't listed here
index 9a03a75..6ee85f6 100644 (file)
@@ -88,6 +88,7 @@ foreach ([atexit => 'C-specific: use END {} instead'],
         [vfprintf => 'C-specific, stopped'],
         [vprintf => 'C-specific, stopped'],
         [vsprintf => 'C-specific, stopped'],
+        [L_tmpnam => 'C-specific, stopped'],
        ) {
     my ($func, $action) = @$_;
     my $expect = ref $action