On Thu, 9 Jan 2003 17:55:17 +0100, Axel Rose wrote:

>Um 11:13 Uhr -0500 09.01.2003, schrieb Chris Nandor:
>> I -- or someone who wants to -- needs to patch IO::File ...
>
>I'd be willing but fear the consequences for other platforms
>or would it just be a MacPerl only patch?

A consequence would be that it would only work for 5.6.0 and up, because
I think that's when the three argument open() was introduced. That would
imply that future bugfixes on IO::File would be wasted on 5.005_03,
which still is a very popular Perl version -- which replace something
that isn't really broken?

The safer but more complex way, is to always use sysopen(), and thus,
convert the modes into numbers using the constants from Fctnl. I could
have some errors, but I think this about covers it:

        use Fcntl;
        my %mode = (
          '<'  => O_RDONLY,
          '+<' => O_RDWR,
          '>'  => O_WRONLY | O_TRUNC   | O_CREAT,
          '+>' => O_RDWR   | O_TRUNC   | O_CREAT,
          '>>' => O_WRONLY | O_APPEND  | O_CREAT,
          '+>>' => O_RDWR   | O_APPEND | O_CREAT,
        );

You get the numerical mode from the string representation *after*
IO::Handle::_open_mode_string() has had its hand in normalising it.

Besides... the PERMS you pass to this function, only has effect if your
provide a numerical mode. Even though it's documented... Surely that
can't be right?

The patched open() as I would propose it (warning: untested):

my %mode = (
  '<'  => O_RDONLY,
  '+<' => O_RDWR,
  '>'  => O_WRONLY | O_TRUNC   | O_CREAT,
  '+>' => O_RDWR   | O_TRUNC   | O_CREAT,
  '>>' => O_WRONLY | O_APPEND  | O_CREAT,
  '+>>' => O_RDWR   | O_APPEND | O_CREAT,
);

sub open {
    @_ >= 2 && @_ <= 4 
      or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])';
    my ($fh, $file) = @_;
    if (@_ > 2) {
        my ($mode, $perms) = @_[2, 3];
        $mode =~ /^\d+$/
          or $mode = $mode{IO::Handle::_open_mode_string($mode)};
        defined $perms or $perms = 0666;
        return sysopen($fh, $file, $mode, $perms);
    }
    open($fh, $file);
}

-- 
        Bart.

Reply via email to