Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello, we would like to request for some assistance with an issue with File::Temp that we've experienced since installing a new module: https://metacpan.org/pod/Net::Amazon::S3#new

After installation of the module & its dependencies, we had received errors from Temp::File stating:

Your vendor has not defined Fcntl macro O_NOINHERIT, used at /usr/shar +e/perl5/File/Temp.pm line 247. Your vendor has not defined Fcntl macro O_EXLOCK, used at /usr/share/p +erl5/File/Temp.pm line 256. Your vendor has not defined Fcntl macro O_TEMPORARY, used at /usr/shar +e/perl5/File/Temp.pm line 277. Your vendor has not defined Fcntl macro O_EXLOCK, used at /usr/share/p +erl5/File/Temp.pm line 255.

Upon checking File::Temp these are the lines that are apparently causing issues

my $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR; my $LOCKFLAG; unless ($^O eq 'MacOS') { for my $oflag (qw/ NOFOLLOW BINARY LARGEFILE NOINHERIT /) { my ($bit, $func) = (0, "Fcntl::O_" . $oflag); no strict 'refs'; $OPENFLAGS |= $bit if eval { # Make sure that redefined die handlers do not cause problems # e.g. CGI::Carp local $SIG{__DIE__} = sub {}; local $SIG{__WARN__} = sub {}; $bit = &$func(); 1; }; } # Special case O_EXLOCK $LOCKFLAG = eval { local $SIG{__DIE__} = sub {}; local $SIG{__WARN__} = sub {}; &Fcntl::O_EXLOCK(); }; }

we've tried applying the fix mentioned here, but it did not work.

https://bugzilla.mozilla.org/show_bug.cgi?id=171674 https://bugzilla.mozilla.org/show_bug.cgi?id=179171

For reference heres the code after applying the fix:

$OPENFLAGS |= $bit if eval { # Make sure that redefined die handlers do not cause problems # e.g. CGI::Carp local $SIG{__DIE__} = sub {}; local $SIG{__WARN__} = sub {}; local *CORE::GLOBAL::die = sub {}; $bit = &$func(); 1; };

At this point we are completely lost, is there anything else we can try to remedy the issue? Thanks in advance.

Replies are listed 'Best First'.
Re: File::Temp throwing errors after installation of a module
by Corion (Patriarch) on Feb 12, 2019 at 21:48 UTC

    This error should not suddenly appear, since File::Temp is a Perl core module. Maybe it got upgraded by installing the other module, but even then, that warning shouldn't appear.

    What is your Perl version? You can find it by running perl -v.

    I think that the fix should work as you posted it, but in your weird/special case, you could just remove the offending function names from the list, as they will not be defined anyway.

      Thank you for the response! Our current Perl version is 5.10.1, File::Temp's version is 0.22. Could you please elaborate what you mean by removing the offending function names from the list?
        Could you please elaborate what you mean by removing the offending function names from the list?

        Remove the "NOINHERIT" from the line:
        for my $oflag (qw/ NOFOLLOW BINARY LARGEFILE NOINHERIT /) {
        Also, remove entirely (or comment out):
        # Special case O_EXLOCK $LOCKFLAG = eval { local $SIG{__DIE__} = sub {}; local $SIG{__WARN__} = sub {}; &Fcntl::O_EXLOCK(); };
        And remove entirely (or comment out):
        unless ($^O eq 'MacOS') { for my $oflag (qw/ TEMPORARY /) { my ($bit, $func) = (0, "Fcntl::O_" . $oflag); local($@); no strict 'refs'; $OPENTEMPFLAGS |= $bit if eval { # Make sure that redefined die handlers do not cause problems # e.g. CGI::Carp local $SIG{__DIE__} = sub {}; local $SIG{__WARN__} = sub {}; $bit = &$func(); 1; }; } }
        What does the following output:
        perl -le print $^O
        File::Temp clearly expects that, unless $^O is 'MacOS', then the Fcntl module will provide the O_NOINHERIT, O_EXLOCK and O_TEMPORARY macros.
        Possibilities are:
        1) That the Fcntl module is not constructed correctly;
        2) that $^O is set incorrectly;
        3) that the condition "unless ($^O eq 'MacOS')" needs to be modified.

        What version of Fcntl do you have ?
        Like you, on my perl-5.10 (windows), I have version 0.22 of File::Temp - and I have version 1.06 of Fcntl.

        Updating to a more recent version of perl (say 5.28.x) may well fix the problem, though what you're experiencing is very strange and I'm loath to blame it on the age of your perl-5.10.1.

        Cheers,
        Rob