aboutsummaryrefslogtreecommitdiff
path: root/interpreter/ElymasLinux.pm
blob: 171806044bdaf73475bc9bd294bbc87daabf5c1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package ElymasLinux;

use strict;
use warnings;

use Elymas;

use POSIX ();

our $linux = {
  'open' => [sub {
      my ($data, $scope) = @_;

      my $mode = popInt($data);
      my $flags = popInt($data);
      my $pathname = popString($data);

      my $fd = POSIX::open($pathname, $flags, $mode);
      $fd = -1 unless defined $fd;

      push @$data, [$fd, 'int'];
    }, ['func', 'linux .open'], 'active'],
  'close' => [sub {
      my ($data, $scope) = @_;

      my $fd = popInt($data);

      my $ret = POSIX::close($fd);
      $ret = -1 unless defined $ret;

      push @$data, [$ret, 'int'];
    }, ['func', 'linux .close'], 'active'],
#  'read' => [sub {
#      my ($data, $scope) = @_;
#
#      my $count = popInt($data);
#      my $buf = popArray($data);
#      my $fd = popInt($data);
#
#      my $ret = POSIX::close($fd);
#      $ret = -1 unless defined $ret;
#
#      push @$data, [$ret, 'int'];
#    }, ['func', 'linux .read'], 'active'],
};

map { installIntConstant($_) } qw(O_RDONLY O_RDWR O_WRONLY);

sub installIntConstant {
  my ($name) = @_;

  my $elymasName = $name;
  $elymasName =~ s/_//g;

  $linux->{$elymasName} = [${$POSIX::{$name}}, 'int', 'passive'];
}

1;