@@ -25,7 +25,7 @@ func (p Process) Files() []abi.File {
25
25
}
26
26
27
27
// NewProcess creates a new process.
28
- func NewProcess (name string ) abi. ABI {
28
+ func NewProcess (name string ) * Process {
29
29
return & Process {name : name }
30
30
}
31
31
@@ -46,88 +46,109 @@ func (p *Process) insertFile(file abi.File) int {
46
46
// Name returns this process's name.
47
47
func (p * Process ) Name () string { return p .name }
48
48
49
+ func (p * Process ) OpenFD (furl string , flags uint32 ) int64 {
50
+ fd , err := p .open (furl , flags )
51
+
52
+ if err != nil {
53
+ log .Printf ("%s: OpenFD(%s, %x): %v" , p .name , furl , flags , err )
54
+ return int64 (- 1 * int64 (err .(Error ).Errno ))
55
+ }
56
+
57
+ return int64 (fd )
58
+ }
59
+
60
+ func (p * Process ) CloseFD (fd int64 ) int64 {
61
+ err := p .files [fd ].Close ()
62
+ if err != nil {
63
+ log .Printf ("%s: CloseFD(%d): %v" , p .name , fd , err )
64
+ return - 1
65
+ }
66
+
67
+ return 0
68
+ }
69
+
70
+ func (p * Process ) WriteFD (fd int64 , data []byte ) int64 {
71
+ n , err := p .files [int (fd )].Write (data )
72
+ if err != nil {
73
+ log .Printf ("%s: WriteFD(%d, []byte{%d}): %v" , p .name , fd , len (data ), err )
74
+ return - 1
75
+ }
76
+
77
+ return int64 (n )
78
+ }
79
+
80
+ func (p * Process ) SyncFD (fd int64 ) int64 {
81
+ err := p .files [fd ].Sync ()
82
+ if err != nil {
83
+ log .Printf ("%s: Sync(%d) %v" , p .name , fd , err )
84
+ return - 1
85
+ }
86
+
87
+ return 0
88
+ }
89
+
90
+ func (p * Process ) ReadFD (fd int64 , buf []byte ) int64 {
91
+ n , err := p .files [fd ].Read (buf )
92
+ if err != nil {
93
+ log .Printf ("%s: ReadFD(%d, []byte{%d}): %v" , p .name , fd , len (buf ), err )
94
+ return - 1
95
+ }
96
+
97
+ return int64 (n )
98
+ }
99
+
49
100
// ResolveFunc resolves dagger's ABI and importable functions.
50
101
func (p * Process ) ResolveFunc (module , field string ) exec.FunctionImport {
51
102
switch module {
52
103
case "dagger" :
53
104
switch field {
54
- case "open" :
105
+ case "open" : // :: String -> Int32 -> Int64
55
106
return func (vm * exec.VirtualMachine ) int64 {
56
107
f := vm .GetCurrentFrame ()
57
108
furlPtr := uint32 (f .Locals [0 ])
58
109
flags := uint32 (f .Locals [1 ])
59
110
furl := string (readMem (vm .Memory , furlPtr ))
60
111
61
- fd , err := p .open (furl , flags )
62
- if err != nil {
63
- // TODO(Xe): Log
64
- return int64 (- 1 * int64 (err .(Error ).Errno ))
65
- }
66
-
67
- return int64 (fd )
112
+ return p .OpenFD (furl , flags )
68
113
}
69
- case "close" :
114
+ case "close" : // :: Int64 -> IO Int64
70
115
return func (vm * exec.VirtualMachine ) int64 {
71
116
f := vm .GetCurrentFrame ()
72
- fd := int (f .Locals [0 ])
73
-
74
- err := p .files [fd ].Close ()
75
- if err != nil {
76
- // TODO(Xe): Log
77
- return - 1
78
- }
117
+ fd := f .Locals [0 ]
79
118
80
- return 0
119
+ return p . CloseFD ( fd )
81
120
}
82
- case "write" :
121
+ case "write" : // :: Int64 -> String -> IO Int64
83
122
return func (vm * exec.VirtualMachine ) int64 {
84
123
f := vm .GetCurrentFrame ()
85
124
fd := f .Locals [0 ]
86
125
ptr := f .Locals [1 ]
87
126
len := f .Locals [2 ]
88
-
89
127
mem := vm .Memory [int (ptr ):int (ptr + len )]
90
128
91
- n , err := p .files [int (fd )].Write (mem )
92
- if err != nil {
93
- // TODO(Xe): Log
94
- return - 1
95
- }
96
-
97
- return int64 (n )
129
+ return p .WriteFD (fd , mem )
98
130
}
99
- case "sync" :
131
+ case "sync" : // :: Int64 -> IO Int64
100
132
return func (vm * exec.VirtualMachine ) int64 {
101
133
f := vm .GetCurrentFrame ()
102
134
fd := f .Locals [0 ]
103
135
104
- err := p .files [fd ].Sync ()
105
- if err != nil {
106
- log .Printf ("sync error: %d (%s) %v" , fd , p .files [fd ].Name (), err )
107
- return - 1
108
- }
109
-
110
- return 0
136
+ return p .SyncFD (fd )
111
137
}
112
- case "read" :
138
+ case "read" : // :: Int64 -> String -> IO Int64
113
139
return func (vm * exec.VirtualMachine ) int64 {
114
140
f := vm .GetCurrentFrame ()
115
141
fd := f .Locals [0 ]
116
- ptr := f .Locals [1 ]
142
+ ptr := int32 ( f .Locals [1 ])
117
143
len := f .Locals [2 ]
118
-
119
144
buf := make ([]byte , int (len ))
120
- n , err := p .files [fd ].Read (buf )
121
- if err != nil {
122
- // TODO(Xe): Log
123
- return - 1
124
- }
145
+ ret := p .ReadFD (fd , buf )
125
146
126
147
for i , d := range buf {
127
- vm .Memory [int ( ptr ) + i ] = d
148
+ vm .Memory [ptr + int32 ( i ) ] = d
128
149
}
129
150
130
- return int64 ( n )
151
+ return ret
131
152
}
132
153
}
133
154
}
0 commit comments