@@ -49,6 +49,17 @@ addToLibrary({
49
49
#endif
50
50
return ERRNO_CODES [ code ] ;
51
51
} ,
52
+ tryFSOperation ( f ) {
53
+ try {
54
+ return f ( ) ;
55
+ } catch ( e ) {
56
+ if ( ! e . code ) throw e ;
57
+ // node under windows can return code 'UNKNOWN' here:
58
+ // https://github.com/emscripten-core/emscripten/issues/15468
59
+ if ( e . code === 'UNKNOWN' ) throw new FS . ErrnoError ( { { { cDefs . EINVAL } } } ) ;
60
+ throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
61
+ }
62
+ } ,
52
63
mount ( mount ) {
53
64
#if ASSERTIONS
54
65
assert ( ENVIRONMENT_IS_NODE ) ;
@@ -66,18 +77,15 @@ addToLibrary({
66
77
} ,
67
78
getMode ( path ) {
68
79
var stat ;
69
- try {
80
+ return NODEFS . tryFSOperation ( ( ) => {
70
81
stat = fs . lstatSync ( path ) ;
71
82
if ( NODEFS . isWindows ) {
72
83
// Node.js on Windows never represents permission bit 'x', so
73
84
// propagate read bits to execute bits
74
85
stat . mode |= ( stat . mode & { { { cDefs . S_IRUSR | cDefs . S_IRGRP | cDefs . S_IROTH } } } ) >> 2 ;
75
86
}
76
- } catch ( e ) {
77
- if ( ! e . code ) throw e ;
78
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
79
- }
80
- return stat . mode ;
87
+ return stat . mode ;
88
+ } ) ;
81
89
} ,
82
90
realPath ( node ) {
83
91
var parts = [ ] ;
@@ -109,17 +117,14 @@ addToLibrary({
109
117
}
110
118
return newFlags ;
111
119
} ,
120
+
112
121
node_ops : {
113
122
getattr ( node ) {
114
123
var path = NODEFS . realPath ( node ) ;
115
124
var stat ;
116
- try {
117
- stat = fs . lstatSync ( path ) ;
118
- } catch ( e ) {
119
- if ( ! e . code ) throw e ;
120
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
121
- }
122
- // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
125
+ NODEFS . tryFSOperation ( ( ) => stat = fs . lstatSync ( path ) ) ;
126
+ // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake
127
+ // them with default blksize of 4096.
123
128
// See http://support.microsoft.com/kb/140365
124
129
if ( NODEFS . isWindows && ! stat . blksize ) {
125
130
stat . blksize = 4096 ;
@@ -145,7 +150,7 @@ addToLibrary({
145
150
} ,
146
151
setattr ( node , attr ) {
147
152
var path = NODEFS . realPath ( node ) ;
148
- try {
153
+ NODEFS . tryFSOperation ( ( ) => {
149
154
if ( attr . mode !== undefined ) {
150
155
fs . chmodSync ( path , attr . mode ) ;
151
156
// update the common node structure mode as well
@@ -158,10 +163,7 @@ addToLibrary({
158
163
if ( attr . size !== undefined ) {
159
164
fs . truncateSync ( path , attr . size ) ;
160
165
}
161
- } catch ( e ) {
162
- if ( ! e . code ) throw e ;
163
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
164
- }
166
+ } ) ;
165
167
} ,
166
168
lookup ( parent , name ) {
167
169
var path = PATH . join2 ( NODEFS . realPath ( parent ) , name ) ;
@@ -172,132 +174,84 @@ addToLibrary({
172
174
var node = NODEFS . createNode ( parent , name , mode , dev ) ;
173
175
// create the backing node for this in the fs root as well
174
176
var path = NODEFS . realPath ( node ) ;
175
- try {
177
+ NODEFS . tryFSOperation ( ( ) => {
176
178
if ( FS . isDir ( node . mode ) ) {
177
179
fs . mkdirSync ( path , node . mode ) ;
178
180
} else {
179
181
fs . writeFileSync ( path , '' , { mode : node . mode } ) ;
180
182
}
181
- } catch ( e ) {
182
- if ( ! e . code ) throw e ;
183
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
184
- }
183
+ } ) ;
185
184
return node ;
186
185
} ,
187
186
rename ( oldNode , newDir , newName ) {
188
187
var oldPath = NODEFS . realPath ( oldNode ) ;
189
188
var newPath = PATH . join2 ( NODEFS . realPath ( newDir ) , newName ) ;
190
- try {
191
- fs . renameSync ( oldPath , newPath ) ;
192
- } catch ( e ) {
193
- if ( ! e . code ) throw e ;
194
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
195
- }
189
+ NODEFS . tryFSOperation ( ( ) => fs . renameSync ( oldPath , newPath ) ) ;
196
190
oldNode . name = newName ;
197
191
} ,
198
192
unlink ( parent , name ) {
199
193
var path = PATH . join2 ( NODEFS . realPath ( parent ) , name ) ;
200
- try {
201
- fs . unlinkSync ( path ) ;
202
- } catch ( e ) {
203
- if ( ! e . code ) throw e ;
204
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
205
- }
194
+ NODEFS . tryFSOperation ( ( ) => fs . unlinkSync ( path ) ) ;
206
195
} ,
207
196
rmdir ( parent , name ) {
208
197
var path = PATH . join2 ( NODEFS . realPath ( parent ) , name ) ;
209
- try {
210
- fs . rmdirSync ( path ) ;
211
- } catch ( e ) {
212
- if ( ! e . code ) throw e ;
213
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
214
- }
198
+ NODEFS . tryFSOperation ( ( ) => fs . rmdirSync ( path ) ) ;
215
199
} ,
216
200
readdir ( node ) {
217
201
var path = NODEFS . realPath ( node ) ;
218
- try {
219
- return fs . readdirSync ( path ) ;
220
- } catch ( e ) {
221
- if ( ! e . code ) throw e ;
222
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
223
- }
202
+ return NODEFS . tryFSOperation ( ( ) => fs . readdirSync ( path ) ) ;
224
203
} ,
225
204
symlink ( parent , newName , oldPath ) {
226
205
var newPath = PATH . join2 ( NODEFS . realPath ( parent ) , newName ) ;
227
- try {
228
- fs . symlinkSync ( oldPath , newPath ) ;
229
- } catch ( e ) {
230
- if ( ! e . code ) throw e ;
231
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
232
- }
206
+ NODEFS . tryFSOperation ( ( ) => fs . symlinkSync ( oldPath , newPath ) ) ;
233
207
} ,
234
208
readlink ( node ) {
235
209
var path = NODEFS . realPath ( node ) ;
236
- try {
237
- return fs . readlinkSync ( path ) ;
238
- } catch ( e ) {
239
- if ( ! e . code ) throw e ;
240
- // node under windows can return code 'UNKNOWN' here:
241
- // https://github.com/emscripten-core/emscripten/issues/15468
242
- if ( e . code === 'UNKNOWN' ) throw new FS . ErrnoError ( { { { cDefs . EINVAL } } } ) ;
243
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
244
- }
210
+ return NODEFS . tryFSOperation ( ( ) => fs . readlinkSync ( path ) ) ;
245
211
} ,
246
212
} ,
247
213
stream_ops : {
248
214
open ( stream ) {
249
215
var path = NODEFS . realPath ( stream . node ) ;
250
- try {
216
+ NODEFS . tryFSOperation ( ( ) => {
251
217
if ( FS . isFile ( stream . node . mode ) ) {
252
218
stream . shared . refcount = 1 ;
253
219
stream . nfd = fs . openSync ( path , NODEFS . flagsForNode ( stream . flags ) ) ;
254
220
}
255
- } catch ( e ) {
256
- if ( ! e . code ) throw e ;
257
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
258
- }
221
+ } ) ;
259
222
} ,
260
223
close ( stream ) {
261
- try {
224
+ NODEFS . tryFSOperation ( ( ) => {
262
225
if ( FS . isFile ( stream . node . mode ) && stream . nfd && -- stream . shared . refcount === 0 ) {
263
226
fs . closeSync ( stream . nfd ) ;
264
227
}
265
- } catch ( e ) {
266
- if ( ! e . code ) throw e ;
267
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
268
- }
228
+ } ) ;
269
229
} ,
270
230
dup ( stream ) {
271
231
stream . shared . refcount ++ ;
272
232
} ,
273
233
read ( stream , buffer , offset , length , position ) {
274
234
// Node.js < 6 compatibility: node errors on 0 length reads
275
235
if ( length === 0 ) return 0 ;
276
- try {
277
- return fs . readSync ( stream . nfd , new Int8Array ( buffer . buffer , offset , length ) , 0 , length , position ) ;
278
- } catch ( e ) {
279
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
280
- }
236
+ return NODEFS . tryFSOperation ( ( ) =>
237
+ fs . readSync ( stream . nfd , new Int8Array ( buffer . buffer , offset , length ) , 0 , length , position )
238
+ ) ;
281
239
} ,
282
240
write ( stream , buffer , offset , length , position ) {
283
- try {
284
- return fs . writeSync ( stream . nfd , new Int8Array ( buffer . buffer , offset , length ) , 0 , length , position ) ;
285
- } catch ( e ) {
286
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
287
- }
241
+ return NODEFS . tryFSOperation ( ( ) =>
242
+ fs . writeSync ( stream . nfd , new Int8Array ( buffer . buffer , offset , length ) , 0 , length , position )
243
+ ) ;
288
244
} ,
289
245
llseek ( stream , offset , whence ) {
290
246
var position = offset ;
291
247
if ( whence === { { { cDefs . SEEK_CUR } } } ) {
292
248
position + = stream . position ;
293
249
} else if ( whence = = = { { { cDefs . SEEK_END } } } ) {
294
250
if ( FS . isFile ( stream . node . mode ) ) {
295
- try {
251
+ NODEFS . tryFSOperation ( ( ) => {
296
252
var stat = fs . fstatSync ( stream . nfd ) ;
297
253
position += stat . size ;
298
- } catch ( e ) {
299
- throw new FS . ErrnoError ( NODEFS . convertNodeCode ( e ) ) ;
300
- }
254
+ } ) ;
301
255
}
302
256
}
303
257
0 commit comments